[jin-fusen3 text=”この記事はこんな人向け”]
- wordpressの予約投稿がどういうものか知りたい
- 予約投稿に失敗してしまう。どうしたらいいかわからない。
- よくわかんないけど、とりあえず読んでやる
どうもこんにちは、さんぺい([jin_icon_twitter size=”18px” color=”blue”]@3pei_tw)です。
今回はWordPressの予約投稿などを実現してくれている「wp-cron」について語ります。
WP-CRONって何?
Linuxをいじったことがある人ならご存知かと思いますが、サーバ側の機能でcronというものがあります。
これは決められた時間に定期的に別途用意したスクリプトを自動実行してくれるというもので、LINUX系では大変メジャーな機能かと思います。
cronとは - IT用語辞典
http://e-words.jp/w/cron.html
cronとは、多くのUNIX系OSで標準的に利用される常駐プログラム(デーモン)の一種で、利用者の設定したスケジュールに従って指定されたプログラムを定期的に起動してくれるもの。利用者はcrontab(“cron table”の略)コマンドで実行したいプログラムやコマンド、シェルスクリプトなどと実行日時を指定すると、同名のテキストファイル(crontabファイル)に設定が保存される。
で、話をwordpressに戻すと、そのcronの機能を模したものが提供されています。それが「wp-cron」です。
なぜオリジナルを使わずに独自スクリプトを使うのか
オリジナルのcronは通常コマンドラインをベースとした提供となっており、正直敷居が高いものになっています。
したがってWordpressのインストールはやらせてくれたとしても、cronも使わせてくれるレンタルサーバーはあまり見かけず、そのままではサーバインストール型の恩恵があまり受けられていないということになってしまいます。
それをカバーするのがWP-CRONが提供する「疑似CRON」です。
オリジナルとの差分を簡単に書いておきます
オリジナルのCRON |
実行日時を指定することで、時刻が来ると自動的に動作する |
疑似CRON |
指定した時刻以降にWEBにアクセスがあると動作する |
CRON利用不可な環境で使える疑似CRONは便利な反面、一部制約があります。
・WEBにアクセスがないと起動しない
・アクセスのたびに動くのでスピードが遅くなる
基本的に自動実行というのは、何であれ、起動させるための条件が必要です。
よく「トリガー」と呼ばれたりしますが、オリジナルのCRONであってもそれは同じくあり、いついつに何を実行しなさい、というのを準備しておき、それを昼夜問わず働いてくれるCRONデーモン(CRONDと呼ばれます)がその時刻になると指定された処理を行うようになります。
これが疑似CRONになると、権限不足でCRONDを動かすことができませんので、仕方ないのでWEBアクセスの度に毎回実行することで、その代用としています。
「WP-CRON.PHP」が動くと、その時点の前に予約された処理がないかを探し、あったら実行、なければ何もしない、という処理を繰り返しています。
一見無駄な動きにも見えますが、CRONが使えない環境で似たような機能が使える、というのは悪くない話かなぁと考えます。
ただしこの仕様でいくと、どうしても「アクセスありき」となってしまうので期待通りの動きとはならない可能性が出てきます。
・この時間に掲載したかったのに、悲しいかなアクセスがなくて動かなかった
・よくわからないけど「予約投稿の失敗」と出て投稿できていなかった
なんて話はググると山ほど出てきます。
解決策としては
・プラグインに頼る
・外部サービスの利用(定期的に実行してくれる)
などが考えられますが、ここでは以下の条件下でWP-CRONを使わずにCRONを使う手順をご案内したいと思います。
WP-CRONを使わずにCRONを使う
さっきも書いた通り、WP-CRONはアクセスの度に動くように作られています。本来ならWEBアクセスとは別に、定期的にチェックして自動実行させたいですよね。
そのためには以下の工程を完了させる必要があります。
※作業は自己責任で!
①WP-CRONを止める
⇒WP-CONFIG.PHPファイルに以下の一文を追加します。上のほうがいいという意見もあったので(他の項目との競合により動作しない可能性)、僕は2行目に入れました(?phpの次の行に挿入)
define(‘DISABLE_WP_CRON’, ‘true’);
これでWP-CRONが止まります。もしかしたらバックアップ系のプラグインも影響を受けるかも。要は設定するとき日時を入れたようなものは影響を受けるかもしれません。
注意:WP-CRONを消さないでください。次で使います。あくまで、アクセスの際に起動しないようにしただけです。
②一定間隔でサーバにWP-CRONを自動実行させる
⇒他力本願だったWP-CRONの実行を本職に任せるのが今回の目的。
# vim /etc/crontab
*/10 * * * * apache /usr/bin/php /var/www/html/wp-cron.php > /dev/null 2>&1
解説:
まず最初にcrontabファイルを開き、編集します(1行追加)
10分ごとに(*/10 * * * *)
ユーザーapacheで(apache)
特定のPHPスクリプトを動かし(/usr/bin/php /var/www/html/wp-cron.php)
エラーが出ても何が出ても結果の記録は捨てる(> /dev/null 2>&1)
というものになります
※PHPのパスなどご利用環境と異なる場合は、適宜直してください。
以上2工程でWP-CRONの起動がWEBアクセスからCRONによる自動実行に変更されました。
これにより「予約投稿の失敗」は基本的にはなくなりますが、以下の時にはどうしても発生してしまいます
・予約投稿時刻を10:05とし、CRON実行間隔を10分とした場合
⇒10:05~10:09の間のアクセス時は期待した投稿はされておらず、管理画面にも「予約投稿の失敗」が表示されてしまう
理由:10分おきの実行の場合、その間はどこに設定しても実行されない
対策:
CRONの間隔を狭くする(あまりおすすめではない)
CRONで指定した時間に合わせて投稿日時を設定する(俗にいう「運用でカバー」)
気にしない(この場合待てば10:10には起動する)
このような問題はありますが、CRONが使えるサーバでWordPressを運用するなら検討の余地ありかと思います!