Cron はスケジュールに基づいてプログラムやスクリプトを定期的に実行する仕組みです。まずは、WordPress における2種類の Cron とはなにか?再確認しましょう。
Cron の種類と概要
WP-Cron
WordPress に標準で組み込まれたタスクスケジューリング機能。投稿の予約公開やプラグインのスケジュール処理など、定期的なタスクを実行します。
サーバーー Cron
サーバーー全体で利用されるタスクスケジューリング機能。crontab
を使用して設定し、正確なスケジュールでタスクを実行します。
WP-Cron のトリガーの問題点
WP-Cron はサイトへのアクセスがトリガーとなり、wp-cron.php が呼び出されます。
スケジュールされたタスクがあればその場で実行されます。
アクセス依存
サイトへのアクセスがない場合、タスクが実行されません。
当然、ステージングやテスト環境、低トラフィックサイトではタスクが実行されないことが多いです。
「予約投稿が動かない」など、WP-Cron が意図どおりに実行されない原因のほとんどはこのトリガーにあります。
確実にトリガーを発生させる
解決方法は wp-cron.php を定期的に呼び出す仕組みを作ることです。結果として、継続的に WP-Cron が実行されることになります。
外部サービスを利用
cron-job.org などの外部スケジュール実行サービスを利用します。
設定例
サービスでhttps://example.com/wp-cron.php
を5分間隔で実行するよう設定。
※実行先を wp-cron.php としていますが、アクセス自体がトリガーになるので、トップページなどでも構いません。
無料アカウント登録登録した後に、URL と実行間隔を設定するだけなので、迷うことなく使えると思います。
https://console.cron-job.org/dashboard
※エラーが続くと、実行が中止されます。セキュリティプラグインなどでアクセスが拒否される可能性があるので、ログを確認の上、適時対応ください。
サーバーー Cron を利用
サーバーーレベルで wp-cron.php を定期的に実行することで、より確実に WordPress のスケジュールタスクを処理できます。
1.サーバーーで以下のコマンドを実行して Cron ジョブを編集します
crontab -e
2.以下のようにタスクを登録します。
*/5* * * * php /var/www/html/example.com/wp-cron.php
これで5分に一度、確実に WP-Cron のトリガーが発生するようになります。
※wp-cron.php は絶対パスで指定する必要があります。
実行結果を記録する
ログを保存するには、以下のように設定します。
*/5* * * * php /var/www/html/example.com/wp-cron.php >> /var/www/html/example.com/wp-content/cron.log 2>&1
>>
: 実行結果をログファイルに追記します。
2>&1
: エラーメッセージも同じファイルに記録します。
この例では、ログ保存先を wp-content フォルダ内にしていますが、ログファイルにはセンシティブな情報が記録される可能性があるため、wp-content などの公開ディレクトリ内を避けるのが望ましいです。
例:>> /var/log/wp-cron.log
デバッグ情報の取り扱いなどを参考にしてください。
Xserver でのサーバーー Cron
レンタルサーバーなど共有ホスティングでも、Cron は使用できるケースが多いです。Xserver での例を示します。
1.サーバーーパネルにログインします。
アカウントメニューから「Cron 設定」をクリックします。
2.「Cron 設定追加」より、タスクを登録します。
※コマンドそのものは、上記のサーバーー Cron の場合と同じです。
*/5* * * * php /var/www/html/example.com/wp-cron.php
WP-Cron の設計上のデメリット
ここまでで、WP-Cron が動かないという問題は解決します。しかし、WP-Cron には、根本的なデメリットがいくつか存在します。もう少し掘り下げましょう。
正確性の欠如
アクセスをトリガーにしているため、タスクがスケジュールどおりに実行されない場合があります。
サーバーー負荷
高トラフィックサイトでは、リクエストごとにタスクの確認が行われ、サーバーー負荷が増大します。
柔軟性の制限
WordPress 内でのみ動作するため、複数アプリケーション間でのタスクスケジュールには対応できません。
WP-Cron とサーバーー Cron の比較
- トリガー方法
- WP-Cron サイトへのアクセスがトリガー
- サーバーー Cron 時間ベース(設定したスケジュールに従って正確に実行)
- 実行の正確性
- WP-Cron アクセス依存のため、正確な実行時間を保証できない
- サーバーー Cron 高精度。設定した時刻に確実に実行
- 設定の容易さ
- WP-Cron WordPress に標準搭載され、初心者でも設定不要
- サーバーー Cron サーバーーの Cron ジョブを設定する必要がある
- 負荷
- WP-Cron 高トラフィック時にはリクエストごとにタスク確認が行われ、サーバーー負荷が増加
- サーバーー Cron 独立して実行されるため、サイトへの負荷は最小限
- 環境依存性
- WP-Cron: すべての WordPress サイトで動作
- サーバーー Cron: サーバーーの権限や設定が必要
WP-Cron を無効化する
前提として、プラグインやテーマを含む更新確認などは、WP-Cron の仕組みが使われています。
これを停止してしまってよいのか?と考える方もいると思います。
心配はいりません、WP-Cron を停止してもスケジュールタスクは引き続き実行されるのです。
スケジュールの仕組み
タスク情報は WordPress のデータベース(wp_options テーブル内の cron オプション)に保存されています。
wp-cron.php を直接呼び出すことで、データベース内に記録されたスケジュールタスクが実行されます。ここで無効化されるのは「アクセス依存のトリガー」のみであり、スケジュール自体は有効なままです。
つまり、リクエストごとの無駄な確認を防ぐことができるわけです。
無効化手順
WordPress の wp-config.php ファイルを編集します。
以下のコードを追加して WP-Cron を無効化します:
define('DISABLE_WP_CRON', true);
設定後の動作
先の手順で設定済みのサーバーー Cron や外部サービスによる wp-cron.php の定期実行が有効になっているため、これで負荷を軽減しながら WP-Cron がスケジュール通りに実行されます。
WordPress の標準機能である WP-Cron はとくに設定なども必要なく、初心者にも意識せず使えます。
しかし、アクセス依存のため課題が多く、それ以外のメリットはないと言えます。
よく理解して、安定した仕組みを構築しましょう。
サーバーー Cron 実行時権限の注意点
最後にサーバーー Cron 実行権限における問題を解説しておきます。
wp-cron.php はスケジュールされたタスク(例: バックアップ、キャッシュ作成、プラグインの動作など)を実行します。サーバーー Cron が root 権限で wp-cron.php を実行すると、以下の現象が発生する可能性があります。
- 生成または変更されたファイルやデータベースの所有者が root に設定される。
- ウェブサーバーーユーザー(例: apache や www-data)がこれらのリソースにアクセスできなくなり、以降、権限エラーが発生する。
解決方法
解決策はいくつかありますが、サーバーー Cron で wp-cron.php を実行する際のユーザー権限を明示的に指定する方法がもっともシンプルで効果的です。
apache(または該当するウェブサーバーーユーザー)の Cron タスクを編集します。
sudo -u apache crontab -e
Cron タスクを追加そのものは、通常のサーバーー Cron の場合と同じです。この方法により、サーバーー Cron ジョブがウェブサーバーーユーザーの権限で実行されるため、所有権が変わるリスクを根本的に排除できます。