WordPressのヘルスチェックで「予約したイベントが遅れています」のメッセージ

WordPressのヘルスチェックで「予約したイベント sm_ping の実行が遅延しています。サイトは動作しますが、予約した投稿や自動更新は正しく動作しないかもしれません。」のメッセージ

WordPressのヘルスチェックで下記のようにメッセージがありました

  • 予約したイベント sm_ping の実行が遅延しています。サイトは動作しますが、予約した投稿や自動更新は正しく動作しないかもしれません。
  • 予約したイベント action_scheduler_run_queue の実行が遅延しています。サイトは動作しますが、予約した投稿や自動更新は正しく動作しないかもしれません。

考えられる原因ですが、以下の原因が考えられます

  • Cronが正常に動いていない
    WordPressでは、wp-cron.php というファイルを使って内部的なタスクを実行します。このファイルは通常、訪問者がページを開いたタイミングでこれが起動しますが、訪問者が極端にすくなくこのタスクが実行されなかった
  • キャッシュプラグインによる影響
    「W3 Total Cache」等のプラグインで、wp-cron.php への呼び出しをキャッシュしてしまっている可能性があります。
  • cronの代替手段(DISABLE_WP_CRON)
    wp-config.php に以下の設定があると、WordPressが自動でcronを実行しなくなります。
define('DISABLE_WP_CRON', true);

キャッシュを無効にしてアクセスする

過去に書いた下記の記事で、Chromeブラウザの開発者モードでキャッシュを無効にしてヘルスチェックの画面にアクセスすると「予約したイベントが遅れています」のメッセージは消えましたので、私の環境では、wp-cron.php のキャッシュが原因だったようです

キャッシュを読み込まないで見ているHPを再読込する方法

wp-cron.php のキャッシュがキャッシュされずに実行する方法として、以下の解決策があります

wp-cron.php のについて

WordPress の wp_cron は「訪問者がサイトにアクセスしたとき」に wp-cron.php を通じて実行される仕組です。このリクエストがキャッシュされてしまうと、実際には wp_cron が動作しないという問題が起きてヘルスチェックでエラーとなります。

wp-cron.phpの仕組み

  1. ブラウザで WordPress サイトにアクセスする

  2. wp-load.php の中から wp-cron.php が非同期で呼び出される

  3. その中でスケジュールされたイベント(予約投稿、プラグインの自動処理など)が実行される

上記の仕組みで実行されるので、wp-cron.phpをキャッシュされないようにするには、以下の方法があります

サーバー側Cronでwp-cron.phpを定期実行

1.wp-config.php に以下を追加して WordPress 内部のcronを無効化します

# wp-config.php を編集
define('DISABLE_WP_CRON', true);

2.サーバーのCron(Crontab)に以下のような行を追加して、サーバー側で定期的に実行する。
URL(example.com)の箇所は任意で変更して下さい。また下記では、5分毎にCronが実行するようになっています。任意で5分から15分に変更しても大丈夫かと思います

# crontabで以下を追加(5分おきに実行するようにしています)

# crontab -e
*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

W3 Total Cache の設定で wp-cron.php など特定のURLを除外する

「W3 Total Cache」 のページキャッシュ内の設定で wp-cron.php など特定のURLを除外する設定をします。

1.左側の管理画面より「パフォーマンス」→「ページキャッシュ」を選択します。

2.設定画面の真ん中付近にある、「以下のページはキャッシュしない」に「wp-.*\.php」を追加します。自分の環境ではデフォルトで追加されていました

 

スポンサーリンク

0
0