また、Basic認証で予約できなくなっている人がいたようだ。
WordPress › フォーラム » Basic認証下で、WordPressの「予約投稿」機能が動かない(WP2.9.1)

以前、下記の方法で解決したが、予約投稿の仕組みが変わったようで、解決した時の方法が通用しなくなっている。

WP Basic認証をかけている場合の「予約投稿」

私の環境では一部コアの部分をいじれば Basic 認証下でも予約投稿ができるようになった。cron が cURL を使って接続する場合には有効。
※予約投稿の動作確認しかしてない、他の部分にどんな影響がでるかは未確認。

予約投稿の仕組み

ソースをトレースしたところ、wp-includes 配下の http.php というファイルがあり、この中の WP_Http クラスを基本として接続している。
※コメントには @since 2.7.0 と書かれているので、おそらく Ver.2.7 からは、Basic 認証下では予約投稿ができなかったのではないかと思うが未確認。

そのなかで接続方法を選択しているのが下記の箇所 (line94 ~ )

	function &_getTransport( $args = array() ) {
		static $working_transport, $blocking_transport, $nonblocking_transport;

		if ( is_null($working_transport) ) {
			if ( true === WP_Http_ExtHttp::test($args) ) {
				$working_transport['exthttp'] = new WP_Http_ExtHttp();
				$blocking_transport[] = &$working_transport['exthttp'];
			} else if ( true === WP_Http_Curl::test($args) ) {
				$working_transport['curl'] = new WP_Http_Curl();
				$blocking_transport[] = &$working_transport['curl'];
			} else if ( true === WP_Http_Streams::test($args) ) {
				$working_transport['streams'] = new WP_Http_Streams();
				$blocking_transport[] = &$working_transport['streams'];
			} else if ( true === WP_Http_Fopen::test($args) ) {
				$working_transport['fopen'] = new WP_Http_Fopen();
				$blocking_transport[] = &$working_transport['fopen'];
			} else if ( true === WP_Http_Fsockopen::test($args) ) {
				$working_transport['fsockopen'] = new WP_Http_Fsockopen();
				$blocking_transport[] = &$working_transport['fsockopen'];
			}

接続方法は下記の5つの方法から使用できる方法を選択しているようだ。

  • WP_Http_ExtHttp (exthttp : http_request() )
  • WP_Http_Curl (curl : curl_exec() )
  • WP_Http_Streams (streams : fopen())
  • WP_Http_Fopen (fopen : fopen())
  • WP_Http_Fsockopen (fsockopen : fsockopen())

修正箇所

私の環境下では、curl で接続されていたので、curl_exec() で接続する前に curl_setopt() で id と password を設定 (line1351 ~ )。

		// We don't need to return the body, so don't. Just execute request and return.
		if ( ! $r['blocking'] ) {

			// 下記の行を追加
			curl_setopt($handle, CURLOPT_USERPWD, "id:password");

			curl_exec( $handle );
			curl_close( $handle );
			return array( 'headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array() );
		}

注意点

この修正の場合、返却値のいらないアクセスするだけの処理は、何でもかんでも Basic 認証でアクセスしてしまう気がするのでセキュリティ的にどうかと思ってしまう。自分の WordPress 配下の Basic 認証する場所だけ、id と password を設定するくらいの判別式は入れておいた方がいいかも。
※下記は例なので参考程度に。

if (get_bloginfo('url')."/wp-cron.php?doing_wp_cron" === $url) {
	curl_setopt($handle, CURLOPT_USERPWD, "id:password");  
}

参考

PHP経由でBASIC認証を通過する | 5ive™.blog

WP_Http_ExtHttp の場合

私の環境では試せないので未確認。予想で書いているので参考程度に。

WP_Http_ExtHttp の場合は、http_request() を使って接続しているので、パラメータの options を使って、httpauth("user:pass" 形式の http 認証情報) と httpauthtype(HTTP_AUTH_BASIC) を設定すればできるんではないかと予想。

PHP: http_request – Manual
PHP: リクエストのオプション – Manual
PHP: 定義済み定数 – Manual

追記メモ

公式ページに解決方法が載っているらしい?(未確認)
ベーシック認証環境下でWordPressの予約投稿の失敗、Flashアップローダー動作不能、XML-RPCからの画像アップロード失敗をまとめて解決する方法 – GIGAZINE
User:Hakre/Htaccess Auth Excludes « WordPress Codex

トラックバック一覧

この記事にはトラックバックがついていません。

コメント一覧

この記事にはコメントがついていません。

RSS feed for comments on this post.

コメント投稿

Sorry, the comment form is closed at this time.