Moral Hazard!!

ドラマーが音楽やホームページやガラクタを作るよ。

WordPress REST APIから記事を取得して表示する(PHP)

No Comment html,css,php,wordpress,,

PHPで一度REST APIをサイト内に取り込み、静的ページのjsで取得することでクロスドメイン制限を回避。

log.php

$data = json_decode(file_get_contents('https://example.com/wp-json/wp/v2/posts?_embed'));

foreach ($data as $value) {
    $title = $value->title->rendered;
    $link =  $value->link;
    $year = substr($value->date, 0, 4);
    $month = substr($value->date, 5, 2);
    $day = substr($value->date, 8, 2);
    $date = $year . '/' . $month . '/' . $day;

    echo '<li><a href="' . $link . '" target="_blank">' . $date . ' ' . $title . '</a></li>';
}

javascript

	function HTML_Load(_html, replace) {

		var xmlhttp = new XMLHttpRequest();
		xmlhttp.open("GET", _html, true);
		xmlhttp.onreadystatechange = function () {
			if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
				var data = xmlhttp.responseText;
				var elem = document.getElementById(replace);
				console.log(elem);
				elem.innerHTML = data;
				return data;
			}
		}
		xmlhttp.send(null);
	}
	HTML_Load('log.php', 'id-name'); //挿入したいid名

WordPress : 固定ページを管理画面メニューに表示

1 Comment wordpress,

メモ。

<?php
function add_page_menu_page() {
    $siteurl = 'post.php?post=xx&action=edit'; //xxに投稿idを挿入
}
function add_page_admin_menu() {
    add_menu_page( '固定ページ表示名', '固定ページ表示名', 'read', 'post.php?post=xx&action=edit'); //xxに投稿idを挿入
}
add_action( 'admin_menu', 'add_page_admin_menu' );

add_action( 'admin_head', 'custom_post_type_icon' );
function custom_post_type_icon() { ?>
  <style>
#toplevel_page_post-post-95-action-edit .dashicons-admin-generic::before {
    content: "\f109";!important; //アイコンも変更
}
  </style>
<?php

Microsoft AzureにWindows2008を入れてWordPressが動作する環境を構築する その2

No Comment wordpress,,

その1はこちら
引き続きPHPのインストール。

IISのFastCGIを有効化する。

・PHPをFastCGIで動かすため、Web Manager(IIS)を右クリック「Add Role Services」でCGIをインストール。

PHPのインストール

phpをDL

Windowsが64bit版なので64bit版のVC14 x64 Non Thread Safeを選択。
(スレッドセーフ版とノンスレッドセーフ版の違いはこちら参照。)

Windowsリモートデスクトップへはファイルのコピペが可能(Ctrl+C→Ctrl+V)なので、サーバ側のC:\にコピペ後展開。
フォルダ名を分かりやすく(php-7.1.12など適宜)変更。

フォルダ内のphp.ini-developmentをphp.iniにリネームしてメモ帳で開き、

fastcgi.impersonate = 1
fastcgi.logging = 0
cgi.fix_pathinfo=1
cgi.force_redirect = 0
extension=php_gd2.dll

上記項目のコメントアウト;を外し、数値をそれぞれ書き換えて保存。

IIS内のConnectionsツリーにて該当サーバを選択、Handler Mappingsから「Add Module Mapping」を開く。

ダイヤログに

Request path: *.php
Module: FastCgiModule
Executable: C:\PHP をインストールしたパス\php-cgi.exe
Name: PHP_via_FastCGI

と入力する。

Request Restrictions" ボタンをクリックし、 リクエストがファイルあるいはフォルダにマップされたときだけハンドラが起動するように設定する。
(この辺の設定はPHP公式参照)

Visual C++ 2015 Runtimeをインストール

このままではphpは動作しないので、Visual C++ 2015をMicrosoftからダウンロードしてインストールする。

ダウンロードをクリックし、

64bit版をダウンロード。
Windowsサーバのデスクトップにでもコピペして実行。

同意にチェックを入れて、Installを押す。

その後、ルートにindex.phpを作成して

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title&gt;phpinfo</title>
</head>
<body>
<?php phpinfo();>
</body>
</html>

などすると、

ブラウザ上でphpが動作する。

index.phpをデフォルトドキュメントにする

初期状態ではURLでディレクトリを指定した時に500エラーが出てしまうため、index.phpをデフォルトドキュメントに指定する。

サーバマネージャの当該Web Site(ここではDefault Web Site)をクリック、「Default Document」をWクリックして右側のActionからadd「index.php」を追加。これでブラウザからフォルダを指定したらindex.phpも読み込まれるようになる。

その3へ。

外部WordPressサイトから投稿記事をRSSで読み込み、表示

No Comment wordpress,,

■やりたい事…Wordpressサイト1の投稿記事を、他サーバにあるWordpress2サイトで取得、表示。

同一DBサーバのWPから記事を持ってくる方法は他にあるみたいけど、設定が煩雑なのとDBサーバに外部接続用のユーザを作ったりしないといけないのでレンタルサーバでは荷が重いか。

今回はWordpress自体が出力しているRSSを取得・表示する方法。
(出典・モンキーレンチ様。こことかこことか)

<?php
include_once(ABSPATH . WPINC . '/feed.php');
$rss = fetch_feed('http://hogehoge.com/feed'); // RSSの取得元URL
if (!is_wp_error( $rss ) ) : $maxitems = $rss->get_item_quantity(3); // 記事数
	$rss_items = $rss->get_items(0, $maxitems); 
endif;
?>

<ul>
<?php
if ($maxitems == 0): echo '<li>記事はありません</li>';
else :
date_default_timezone_set('Asia/Tokyo');
foreach ( $rss_items as $item ) : ?>

<li><a href="<?php echo $item->get_permalink(); ?>" target="_blank" rel="bookmark"><?php echo $item->get_title(); ?>
<span class="news-date"><?php echo $item->get_date('(Y/m/d)'); ?></span></a>
</li>

<?php endforeach; ?>
<?php endif; ?>
</ul>

で可能。
ただ、上記でRSSを取得した場合、取得した側のWordpressで最大12時間のキャッシュが効いてしまって最新記事が取得できないことがある。
なので、取得先Wordpressサイト1のfunction.phpに追記して、キャッシュ時間を変更する。

return 数値を秒で指定する。30分なら1800を入力することで、30分ごとにRSSキャッシュを更新してくれる。

add_filter( 'wp_feed_cache_transient_lifetime', function(){'return 1800;';});

上記はPHP5.3から使用可能な無名関数を使用。
ちなみにそれ以前のverの場合は

add_filter( 'wp_feed_cache_transient_lifetime', create_function( '$a', 'return 1800;' ) );

と匿名関数(create_functionで定義)を使うか、

function return_rss_num() {
	return 3600;
}
add_filter( 'wp_feed_cache_transient_lifetime' , 'return_rss_num' );

関数を作って入れることになる。

匿名関数と無名関数の違いはこちら

PHP5.3以降を使用している場合は、PHPマニュアルにもあるように無名関数を使用したほうがよさそう。

警告 / この関数は、内部的に eval() を実行しているので、 eval() と同様にセキュリティ上のリスクがあります。 さらに、パフォーマンスやメモリ使用効率の面でも問題があります。
PHP 5.3.0 以降を使っている場合は、この関数ではなく、ネイティブの 無名関数 を使うべきです。(出典・PHPマニュアル)

他にも無名関数は匿名関数の倍の処理速度だそうで。

Dreamweaver CS6ではphp5.4のシンタックスチェックをサポートしない件(雑翻訳)

No Comment html,css,php,

DreamweaverCS6でphp5.4から実装されている配列のショートハンドを書こうとしたらシンタックスエラーが出た。
Adobeのサイトで質問があったけど、要約すると

「CS6ではphp5.4以降はサポートしないからCC買え」

との事。
詳細は以下。

Q:PHPの配列でショートハンド使おうと思ったら構文エラーが出るんだけど?

A:そりゃそうさ、DreamweaverCS6はPHP5.3までしかサポートしないよ。
CCならショートハンドを含むphp5.4構文をサポートしてるよ。

Q:OK、CS6は今後アップデートしないってこと?

A:いいえ。CS6は買い切りで永久ライセンス、CCは期間契約(月額・年額)という違いがある。
貴方はCS6をこれ以上支払うことなく永久に使えるけど、これ以上アップデートしない。
CCはお金を支払い続けている間、アップグレードし続ける。

Q:なるほどね、サンキュー。

…こう考えると古いソフト使ってるなぁ…。
そろそろ環境変えないといけないとは思いつつ…

以下、原文。
https://forums.adobe.com/thread/1393664?tstart=0

If you use the shorthand [] in PHP for arrays, dreamweaver thinks it is syntax error.

That's correct. Dreamweaver CS6 supports only PHP 5.3 syntax.
Dreamweaver CC supports the 5.4 syntax (including shorthand array).

OK, so there will be no update for the CS6 version?

No. That's the difference between buying CS6 on a perpetual licence and CC on a subscription basis. You can use CS6 indefinitely without paying any more, but it will not be updated. CC gets regular updates, but is available only on a subscription basis.

OK, makes sense. Thank you.