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ブログから静的サイトに記事を取得し、javascriptで表示する (REST API)

No Comment html,css,php,wordpress,,,

静的サイト(example.com)にWordpressブログ(blog.example.com)から投稿記事を取得する備忘録。

例) 他Wordpressブログから、2020年の投稿記事を10件取得して2020年1月1日以降の記事を表示。

※クロスドメイン制約により、ドメインをまたいで取得することは出来ない。
(その場合はJSONPを使うなりPHP使うなりFeedから取り込むなり)

var root = document.getElementById("id-name");//読み込み先サイトのID

function getRequest(props) {
	var xhr = new XMLHttpRequest();
	xhr.open("GET", encodeURI(props.uri));
	xhr.onload = function () {
		if (xhr.status !== 200) {
			console.log('Status error');
		} else {
			props.callback(JSON.parse(xhr.responseText));
		}
	};
	xhr.send();
}

function forEach(props, callback) {
	for (var i = 0, max = props.length; i < max; i++) {
		callback(props[i], i)
	}
}

getRequest({
	uri: "https://blog.example.com/wp-json/wp/v2/posts?page=1&per_page=3&after=2020-01-01T00:00:00",
	callback: function (posts) {
		forEach(posts, function (post) {
			var title = post.title.rendered;
			var link = post.link;
			var year = post.date.substr(0, 4);
			var month = post.date.substr(5, 2);
			var day = post.date.substr(8, 2);
			var newElement = document.createElement("li");
			newElement.innerHTML = '<a href="' + link + '" target="_blank"><span>' + Number(month) + '/' + Number(day) + '</span><span>' + title + '</span></a>';

			root.appendChild(newElement);
		})
	}
});

出典

WordPress : Permissionがあっているのに画像をアップロード出来ない件 heteml

1 Comment wordpress,,

レンタルサーバheteml内で、新しい高性能なサーバに無料で移設出来るという事なので移設したが、その後ブログに画像がアップロードできなくなった。

エラーメッセージは
「ディレクトリ upload/2018/05 を作成できませんでした。この親ディレクトリのアクセス権はサーバーによる書き込みを許可していますか ?」

パーミッションは問題ない。
が、FTPでupload/2018/フォルダにこちらで05を作ってからアップロードしても、同じエラー。
つまりディレクトリの位置が違ってるんじゃないかと推定。

このブログはかなり前のWordpress ver.2.xくらいから使っていることもあり、パスの位置がDBに保存されていたようだ。

「アップロードするファイルの保存場所」に見事に前のサーバのパスが書かれていた。
これを削除して保存。

すると、「ファイルのアップロード」項目自体が消えた。
そういえば、Wordpress3.5からこの項目は非表示になったんだった。
Wordpressの新規インストールでは起きることはないけど、古いWPの移設案件などではまだありそうなのでメモ。

■おまけ

この消えた「ファイルアップロード」を使いたい場合は、オプションページで再設定可能。

サイトURL/wp-admin/options.php

で設定項目一覧が出るので「upload_path」で検索をかけた項目にパスを入れる。
そうすると通常の設定→メディアに上記画面と同じ形で表示される。

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が動作する環境を構築する その6

1 Comment wordpress,,,

その5まででなんとかWordpressが動作するようになったが、ISS用にLinuxとは別の設定を行う必要がある。

プラグインのインストール・削除ができない

プラグインが削除できない

wp-content/plugins/ フォルダに対して、Users(サーバ名\Users)へフル権限を与える

プラグインをインストール出来るようにする。

プラグインをインストールしようとすると

「インストールに失敗しました: ダウンロードに失敗しました。No working transports found」
「インストールに失敗しました: ダウンロードに失敗しました。 ファイルストリーミングの送り先となるディレクトリが存在しないか、書き込み不可になっています。」

などのエラーメッセージが出る。

wp-config.phpに84行目あたり、define('WP_DEBUG', false);の後くらいに

define('WP_TEMP_DIR','C:\temp');

を追記。
(Windows上では半角¥だが、Dreamweaverなどのエディタでは逆スラッシュであることに注意)

C:¥tempフォルダを作ってからphp.iniのupload_tmp_dirを検索し、コメントアウトして

upload_tmp_dir = "C:\temp"

と書き換える。

また、php.iniの

extension=php_curl.dll
extension=php_openssl.dll

をコメントアウトして有効化。

パーマリンクを変更すると、リンクエラーが出る

・test-site.com/index.php/slug/ といったurlになる
・リンクが500エラーになる

まずリライトモジュールをIISにインストールする。
こちらから「view all」をクリックして

ページ内で「URL Rewrite」と検索し、ファイルをダウンロード、サーバにインストールする。
インストールが済んだらServer Managerを開きなおすと「URL rewrite」のアイコンが追加されている。

その後、wordpressがインストールされているフォルダに移動し、web.configという名前で下記の内容でファイルを作る。
(LinuxではWordpressは.htaccessを自動作成するが、Windowsでは.htaccessは使えず作成されない、代わりにweb.configというファイルを使用してリライトやアクセス制限を設定する。)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
 <rules>
 <rule name="wordpress" patternSyntax="Wildcard">
 <match url="*"/>
 <conditions>
 <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
 <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
 </conditions>
 <action type="Rewrite" url="index.php"/>
 </rule>
 </rules>
</rewrite>
</system.webServer>
</configuration>

再度Wordpressのパーマリンク設定に行くと、index.phpが含まれないURLに変更可能。

パーマリンクを変更すると画像がアップロード出来なくなった

デフォルトのパーマリンク(domain.com/p=1111 など)ではアップロード出来ていた画像が、
「アップロード中にエラーが発生しました。後ほど再度お試しください。」
エラーが出てアップロードできなくなる。
(デフォではユーザとしてアップロードされていた画像が、変更後アップロードした画像ファイルは、IUSRが所有者になる)

→ uploadsディレクトリに「IIS_IUSERS」の権限フルコントロールを付与する。

確認箇所

・php.iniでextension=php_gd2.dll がコメントアウトされているか?
phpinfoでGDが読み込まれているかどうかを確認。読み込まれていればphpinfoに以下の項目が表示される。

・extension_dirの読込先は合っているか? (extension_dir = "C:\phpのフォルダ\ext")

・設定変更後IISを再起動

参考・こちらこちら

メール送信エラー

メールフォームプラグインなど(当環境では主にContactform7を使用しています)を使用してメールを送信することが出来ない。

SMTPサーバをインストールする

サーバマネージャ「Features (Rolesの下)」を右クリック「Add Features」をクリック。

SMTP Server と Telnet Client にチェックを入れる。
選択時に

このようなメッセージが出るがAdd Required Role Serviceを押下。

そのままNext

そのままInstall

インストールが終わると、FeatureにSMTP ServerとTelnet Clientが追加されている。

リレーの設定

Start → Administrative Tools → IIS 6.0 Manager をクリック

[SMTP Virtual Server #1]を右クリック「Propaties」

上記手順で設定すると

メールの送信が可能になった。

参考

日本語URLが文字化けする

投稿名などをURLにしていた場合、日本語のタイトルを投稿すると自動的に日本語のURLが生成される。
が、シングルページで表示すると500エラーが出る。

※2017/12/15時点では、Window2008サーバをWindows Updateで最新版にアップデートした時点で文字化けなく表示された。
(但し、日本語と英語が混じるURLでは文字化けする。アクセスは可能))

対策

Windowsサーバでスタート→コマンドプロンプトを右クリック→Run as Administrator(管理者権限で実行)をクリック。
※レジストリの操作を伴うので、最悪サーバが壊れる可能性があります。まずWindows Updateを行って日本語URLが表示される場合は行わないほうが吉。

reg add HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\w3svc\Parameters /v FastCGIUtf8ServerVariables /t REG_MULTI_SZ /d REQUEST_URI\0PATH_INFO 

と入力。
その後IISを再起動。

日本語スラッグでも

エラーが出ないで表示されるようになった。
※日本語OSの場合、レジストリの当該箇所が
「REQUEST_URI¥0PATH_INFO」
として登録されてしまうケースがあるようだが、英語OSでは
REQUEST_URI
PATH_INFO
の2行で登録される。
この場合は直接レジストリを変更すれば反映された。

未解決問題

スラッグに日本語と英語が混じる場合、自動転送エラーが出る場合がある。
僕はリダイレクトや正規表現に詳しくないので、教えてエラい人。

URLの頭が日本語、最後が英語の場合、日本語文字列が「?」にはなるが表示される。

URLの頭が英語、最後が日本語の場合、自動転送エラー。

英語が混じると、日本語URL部分が全て???になってしまう・
頭が日本語でかつ文字数が偶数の場合は文字化けしなく、奇数の時だけ文字化けするなどからマルチバイトの処理をどうこうだとは思うのだが、Azureが今日で期限切れなので、ギブアップ。