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

2008/05/20 火曜日 2:01 投稿者 zon

注意

この対処法は、古いバーションでしか通用しなくなっています。 Ver.2.7 以上を使っている場合は下記を参考した方がいいかも。
WP Basic認証をかけている場合の「予約投稿」 Ver.2.7以降?

ここから本文

以前、予約投稿で苦労したのですが、別の問題で予約投稿ができない人がいるみたいなので、ちょっと調べてみました。1ヶ月近く前の記事なので、もう解決してるかもしれませんが。。

他サイトとの違いは、Basic認証があることなので、試しにBasic認証をはずしてやってみたところ、「予約投稿」機能が動きました!

Basic認証下で、WordPressの「予約投稿」機能が動かない

Basic認証が問題になっているのはハッキリしているので、Basic認証を通るようにしてあげればいいようです。

ちなみに、修正なしでBasic認証+未来投稿をすると HTTP/1.1 401 Authorization Required が返ってきてました。Basic認証が問題になっているのは間違いないようです。

今回検証したのは Ver2.5.1 ですが、Ver2.3.3 でも同様に修正すれば解決するのではないかと思います。

修正箇所は /wp-includes/cron.php の 101行目(function spawn_cron() 内) の fputs() のパラメータです。

fputs( $argyle,
      "GET {$parts['path']}?check=" . wp_hash('187425') . " HTTP/1.0\r\n"
    . "Host: {$_SERVER['HTTP_HOST']}\r\n\r\n"
);

上の部分を以下のように修正したら予約投稿できました。

fputs( $argyle,
      "GET {$parts['path']}?check=" . wp_hash('187425') . " HTTP/1.0\r\n"
    . "Host: {$_SERVER['HTTP_HOST']}\r\n"
    . "Authorization: Basic ".base64_encode('user:password')."\r\n\r\n"
);

Basic認証用のヘッダを送ってあげればいいみたいです。4行目の user:password は、実際にBasic認証で使用しているユーザ名とパスワードを入れてください。

以下のページが参考になったので紹介しておきます。

PHPのちょっとしたTIPS

WordPress 投稿エディタに LightBox のコードを挿入

2007/08/19 日曜日 11:38 投稿者 zon

コア部分を変更するのであまり参考にしない方がいいと思います。

変更後のイメージは以下のようになります。

LightBox のコードを挿入

■バージョン:2.1.3
■変更ファイル:/wp-admin/upload-js.php

修正点その1

【変更前】116行目:

h += "<label for='link-file'><input type='radio' name='link' id='link-file' value='file' checked='checked'/> <?php echo attribute_escape(__('File')); ?></label><br />";

【変更後】file のチェックをはずして、その上に LightBox のラジオボタンを追加

h += "<label for='link-lightbox'><input type='radio' name='link' id='link-lightbox' value='lightbox' checked='checked' /> <?php echo attribute_escape(__('LightBox')); ?></label><br />";
h += "<label for='link-file'><input type='radio' name='link' id='link-file' value='file' checked='checked'/> <?php echo attribute_escape(__('File')); ?></label><br />";  

修正点その2

【変更前】236行目~241行目:

if ( 'none' != link )
	h += "<a href='" + ( 'file' == link ? ( this.currentImage.srcBase + this.currentImage.src ) : ( this.currentImage.page + "' rel='attachment wp-att-" + this.currentImage.ID ) ) + "' title='" + this.currentImage.title + "'>";
if ( display && 'title' != display )
	h += "<img src='" + ( 'thumb' == display ? ( this.currentImage.thumbBase + this.currentImage.thumb ) : ( this.currentImage.srcBase + this.currentImage.src ) ) + "' alt='" + this.currentImage.title + "' />";
else
	h += this.currentImage.title;

【変更後】LightBox を選択時、rel 属性に lightbox[post-id] を設定する処理を追加。ついでに、img タグに width、height、title 属性を設定する処理を追加

if ( 'none' != link ) {
	h += "<a href='"
	if ( 'file' == link )
		h += this.currentImage.srcBase + this.currentImage.src;
	else if ( 'page' == link )
		h += this.currentImage.page + "' rel='attachment wp-att-" + this.currentImage.ID;
	else if ( 'lightbox' == link )
		h += this.currentImage.srcBase + this.currentImage.src + "' rel='lightbox[" + this.postID + "]";
	h += "' title='" + this.currentImage.title + "'>";
}
if ( display && 'title' != display ) {
	h += "<img src='";
	if ( 'thumb' == display ) {
		imageThumb = new Image();
		imageThumb.src = this.currentImage.thumbBase + this.currentImage.thumb;
		h += imageThumb.src + "' width='" + imageThumb.width + "' height='" + imageThumb.height;
	} else {
		imageBase = new Image();
		imageBase.src = this.currentImage.srcBase + this.currentImage.src;
		h +=  imageBase.src + "' width='" + imageBase.width + "' height='" + imageBase.height;
	}
	h += "' alt='" + this.currentImage.title + "' title='" + this.currentImage.title + "' />";
} else {
	h += this.currentImage.title;
}

img タグの width、height、title 属性は、LightBox とは関係ないのですが、W3C XHTML1.0 valid を意識して、毎回設定しているのが面倒になったので、コア部分を変更するならと、ついでにやっておきました。

プラグインを駆使してなんとかなるものなら、コア部分を変更せずになんとかしたいものですが分からないのです。

2.0系でこのカスタマイズを行いたければ、inline-uploading.php 辺りを変更すればいいのかと思って、ソースをざっくり追ってみましたが、2.1.3 の仕組みとは大きく変わっていたので追うのが面倒になりました。2.0系をカスタマイズしたい人は、ほとんど参考にならないと思います。

WP 未来投稿(予約投稿)のテスト・続

2007/05/15 火曜日 10:30 投稿者 zon

この件はWP 未来投稿(予約投稿)の注意点で、問題なかったのでいったんクローズしたんですが、このブログの環境では問題なかったものの、実際に問題が発生したブログの方では、やはり未来投稿(予約投稿)が出来ない症状が続いています。ここのところ忙しかったので見てみぬフリをしていたのですが、やはり不便なのでもう一度調査します。

症状が発生している方との違いを調査するのにこのブログのデータを取るための記事なので、内容のある記事ではありません。原因が特定できた場合は追記を書くと思います。

調査結果追記(2007/05/15)

未来投稿が反映されない原因はソケット接続オープン時のタイムアウトでした。
/wp-includes/cron.php の 87行目(Ver 2.1.3)の fsockopen タイムアウトが 0.01 に設定されていて、$errstr に Connection timed out を返していました。タイムアウト時間を長めにとれば大丈夫かと思います。

未来投稿が反映されなくて困っているけど、難しいことが分からないという人は、下記の部分の 0.01 の部分を 0.1 にしてみると問題が解決する場合があるかもしれません。

$argyle = @ fsockopen( $parts['host'], $_SERVER['SERVER_PORT'], $errno, $errstr, 0.01 );

一応、他にも短すぎるタイムアウトが設定されていないか fsockopen で水平展開してみましたが問題になりそうなところはありませんでした。

確か、以前もVer 2.0系でタイムアウトが原因の問題で悩んだことがありました。(詳しく覚えてないけどトラックバック関連だったような気がします。)メモしておいたんですが、サーバトラブルでバックアップデータを復旧せずそのままに状態で放置してたのですっかり忘れてました。これからはちゃんとメモをしておこう。

WP 未来投稿(予約投稿)の注意点

2007/04/29 日曜日 19:00 投稿者 zon

WrodPressで未来投稿(予約投稿)の投稿を行う場合に引っかかりそうなことを書いておきます。

未来投稿(予約投稿)のやり方

管理画面の投稿画面でタイムスタンプを未来の投稿したい時間に設定します。

未来投稿(予約投稿)の注意点

  • 管理画面の投稿画面の『投稿ステータス』の公開にチェックを入れておきます。

通常の投稿を行う際には記事を書き上げた後に、『公開』のボタンを押せば、投稿画面の右側のメニューの投稿ステータスに関係なく公開されますが、未来投稿を行う際には『投稿ステータス』を公開に設定しておかないと自動で投稿されないようです。

注意
この記事はタイムスタンプを 2007/04/29 19:00、投稿ステータスを草稿に設定した状態で2007/04/29 13:20 に公開ボタンを押して投稿しました。
つまりこの記事が 2007年2007/04/29 19:00 で表示されていれば、『未来投稿(予約投稿)の注意点』に書かれてある内容はウソ情報と言うことになります。

詳しい考察は下記の記事を参照してください。
WP 未来投稿(予約投稿)のテスト

追記

問題なく未来投稿(予約投稿)されていました。前回はなぜ未来投稿(予約投稿)が出来なかったのか気になりますが、原因を調べるにももう再現さすことが出来ないし、問題なく表示されればそれでいいので、この件は終了。

さらに追記

問題が解消されていなかったので再度検証しました。
検証結果はWP 未来投稿(予約投稿)のテスト・続を参照してください。

WP 未来投稿(予約投稿)のテスト

2007/04/28 土曜日 19:00 投稿者 zon

とあるブログで週間単位くらいで連載ものの記事を書いているのですが、投稿の曜日を定期的にしておけば読者の方にも優しいと思って、cron か何かで投稿できるようにしようと考えていたのですが、WordPress には、予約投稿(未来投稿)なる機能があると書いてあったので、これは使わない手はないなと思って試してみました。

使い方は簡単で、記事の投稿画面のタイムスタンプを未来に設定すればよいと書かれていたので、早速タイムスタンプを未来に設定して、記事を投稿。

ざっと調べた感じの予想(注:あくまで予想です)では公開はされているけど、表示の処理が走る時にフィルタをかけて未来のものを表示されないようにしてるっぽい。そうなると、ping は記事投稿時に飛んでしまうのでは?とか、RSSはどうなるの?とかの疑問があったけど、その辺はあまり気にしなくてもいいやってことでそのまま投稿。

しかし、設定されたタイムスタンプの時刻は過ぎているのに一向に表示されない。おかしい。。

よくよく、詳しく調べてみると、 WordPress 2.1 は、予約投稿の処理の方法が違うらしく、wp-cron と言うのがキーワードとして出てきて、このwp-cron で cron の処理を走らせてるみたいなことが書かれてたので、そのソースをざっと追ってみると、以下のような感じでした。(注:あくまでざっとなので動作確認はしてません)

未来に行うイベントを DB にキャッシュさせておいて、外部からアクセスがあったときに wp-cron が現在時刻と DB のイベント発生時刻とを照らし合わせて、設定時刻が過ぎていたら設定されたイベントを実行。で、気になっていた ping の件も、これならイベントが走るまで飛ばないっぽいです。

で、疑問点である予約投稿が表示されなかった件とは関係くないようで未解決なのですが、DB を確認したところでは、どうも、イベントがキャッシュがされていなかったために処理が走らなかった様子です。

根拠は、[options] テーブルの [cron] にイベントらしきものが入っていないのと、同じく [options] テーブルの [doing_cron] に設定された値が 0 のままなので、cron が実行されたことはいまだかつてないってことではないかと思うのです。たぶん、cron が実行されていたら [doing_cron] は、処理が走った time が入るんではないかと予想。

となると、ステータスが公開ではなかったから?でも、草稿のところには表示されないし、管理画面のステータスは公開になっていた気がするんですが。(その記事は既に手動で投稿してしまったので、確認するすべなし。)

気になるのは、記事投稿時にテキストボックスの下にある『公開』ボタンを押して投稿したのですが、右側にあるメニューの『投稿ステータス』の公開にチェックを入れておかないといけないような処理っぽかったので、この投稿で試してみます。

注:この記事はタイムスタンプを 2007/04/28/19:00 に設定し、2007/04/28/ 18:50 に投稿しました。

追記:テスト後

無事に未来投稿(予約投稿)されていました。
上に書かれていたことで、嘘情報がありました。[options] テーブルの [cron] が全て実行されたあとは、[doing_cron] に設定された値は 0 になるようです。[doing_cron] は、前回のイベントをチェックした際に一定期間内(たぶん30秒)は、イベントのチェックをしないようにするフラグみたいです。

zontheworld
うまい焼肉が喰いたい。
HTML convert time: 0.105 sec. ( Login )