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 ジョブがウェブサーバーユーザーの権限で実行されるため、所有権が変わるリスクを根本的に排除できます。