WordPressでPost Expiratorがインストール直後に動作しない理由と対処方法
WordPressのCMS化でとても重宝するプラグイン「Post Expirator」。
指定時間になったら自動的に記事やページを下書き状態にしてくれるという大変便利なプラグインなのですが、インストール直後にテストしても動作しなくて困ったことありませんか?
(というか私が困ってました…)
で、あきらめてたら次の日には動作してたりして余計に「???」なプラグインでした。
今まではとりあえず動作したから放っておいたんだけど今回原因が分かったのでシェアします。
よくある時間のズレの対処法では解決しない
Post Expirator関連のトラブルを探すとほとんどが更新日時が9時間ズレるというものです。
これは日本時間が世界標準と9時間ズレているために起こるのですが、現在のバージョンのWordPress(3.4.1)とPost Expirator(1.6.1)の組み合わせでは問題がないと思います。
確認の仕方ですが、投稿時のPost Expirator設定画面で時間表示が「Hour(JST)」となっていれば動作する時間には問題がありません。
ちなみに、もしここの表示が「Hour(JST)」になっていない場合は「設定」「一般」のタイムゾーンを「東京」にすると解決します。
ではなぜインストール直後に動作しないのか?
まず見ていただきたいのが「設定」「Post Expirator」の「Diagnostics」画面。
この画面の下の方にスケジュールされているイベントの一覧が表示されていますが、このうち「expirationdate_delete」がPost Expiratorの動作用イベントになります。
このイベントのDateを見ると
Mon, Mon, 10 Sep 2012 00:06:48 +0000
となっていますよね?
表示されている日時はインストールした日時とほぼ一致するのですが、時差の表記が「+0000」となっています。
仮に上記の時刻を日本時間で表すと
Mon, Mon, 10 Sep 2012 09:06:48 +9000
となり、実際にイベントが動作するには表示されている時刻から9時間後に動作することになります。
対処方法
放っておいても9時間後からは動作し以後1分おきにイベントが動くので問題はありませんが、気になる方はプラグインの中身を少し修正することで対処できます。
修正箇所は /wp-content/plugins/post-expirator/ にある post-expirator.php ファイルの708行目付近にあるpstExpiratorResetCronEvent関数を以下のように書き換えます。
変更前
function postExpiratorResetCronEvent() { wp_clear_scheduled_hook('expirationdate_delete'); wp_clear_scheduled_hook('expirationdate_delete_'); if (postExpirator_is_wpmu()) { global $current_blog; wp_clear_scheduled_hook('expirationdate_delete_'.$current_blog->blog_id); wp_schedule_event(current_time('timestamp'), get_option('expirationdateCronSchedule',POSTEXPIRATOR_CRONSCHEDULE), 'expirationdate_delete_'.$current_blog->blog_id); } else { wp_schedule_event(current_time('timestamp'), get_option('expirationdateCronSchedule',POSTEXPIRATOR_CRONSCHEDULE), 'expirationdate_delete'); } }
変更後
function postExpiratorResetCronEvent() { wp_clear_scheduled_hook('expirationdate_delete'); wp_clear_scheduled_hook('expirationdate_delete_'); $realtime = current_time('timestamp') - ( current_time('timestamp') - time() ); if (postExpirator_is_wpmu()) { global $current_blog; wp_clear_scheduled_hook('expirationdate_delete_'.$current_blog->blog_id); wp_schedule_event($realtime, get_option('expirationdateCronSchedule',POSTEXPIRATOR_CRONSCHEDULE), 'expirationdate_delete_'.$current_blog->blog_id); } else { wp_schedule_event($realtime, get_option('expirationdateCronSchedule',POSTEXPIRATOR_CRONSCHEDULE), 'expirationdate_delete'); } }
上記コード修正後、先ほどのDiagnostics画面上部にある「Reset」を押してみると、システムの時間からマイナス9時間した時間がイベントに登録されるので、すぐに動作確認が行えるようになります。
なお、この対処法はプラグインのコアファイルに手を入れているためバージョンアップした際には再度コードを修正する必要がありますのでご注意ください。