記事 · 2026年9月7日
WP-Cron を手動で動かす方法と、放っておいても動くようにする方法
予約投稿が出ない、プラグインが深夜に何もしない。原因は WP-Cron が「時計」ではなく「訪問者」で動くからです。手動で叩く URL、WP-CLI、止まる四つの理由、本物の cron に置き換える一行。
WP-Cron は WordPress に内蔵されたスケジューラです。予約投稿、更新チェック、ニュースレターの送信キュー、データベースの自動掃除。全部この仕組みが「そろそろ実行する時間だ」と判断して動かしています。
問題は、その「そろそろ」の決め方です。WP-Cron は時計を持っていません。誰かがページを開いたときに、たまっている仕事がないかを確認するだけです。訪問者が来なければ、何も起きません。
「予約投稿が公開されなかった」「深夜に動くはずの処理が動いていない」という相談の大半は、ここに行き着きます。
今すぐ手動で動かす
いちばん簡単なのは、ブラウザでこの URL を開くことです。WordPress が起動して、期限の来た仕事を全部片づけて、白いページを返します。
https://あなたのサイト/wp-cron.php?doing_wp_cron
ターミナルからなら同じことを curl で。
curl -s https://あなたのサイト/wp-cron.php?doing_wp_cron
サーバーに WP-CLI があるなら、実行する前に「何が予約されているか」を見られます。こちらのほうがずっと便利です。
wp cron event list # 予約されている仕事と、その時刻
wp cron event run --due-now # 期限切れの仕事を全部実行
wp cron test # WP-Cron を起動できる状態か確認
ターミナルが無ければ、無料の WP Crontrol を入れてください。ツール → Cron Events に同じ一覧が出て、各行に「今すぐ実行」が付きます。仕事が詰まっているのか、そもそも予約されていないのかが、一目で分かります。
予約した処理が静かに止まる、四つの理由
よく見る順番で。
- ページキャッシュ。 これが最大の原因で、ほとんど誰も疑いません。キャッシュプラグインやホスティングのキャッシュが保存済みの HTML を返すので、WordPress 自体が起動しません。起動しなければ WP-Cron も動きません。アクセスの多いサイトほど、逆に何時間も予定を取りこぼします。
- アクセスが少ない。 一日十回しか訪問がなければ、cron も一日十回、しかもばらばらな時刻にしか動きません。
- ホスティングが無効にしている。 管理型のホスティングの多くは
DISABLE_WP_CRONを設定して、代わりにサーバー側の cron を動かしています。それ自体は正しい設計ですが、あなたのサイトでその cron が本当に有効になっているかは、コントロールパネルで確認する必要があります。 - ロックが残っている。 WP-Cron は実行中にロックをかけます。処理の途中で落ちると、ロックが一分ほど残り、その間の全リクエストがキューを飛ばします。
wp cron event run --due-nowでロックごと片づきます。
放っておいても動くようにする
直し方は、スケジューラを訪問者から切り離すことです。まず wp-config.php で、ページ読み込み時の WP-Cron を止めます。
define( 'DISABLE_WP_CRON', true );
次に、サーバーに時計で叩かせます。cron が使える Linux のホストなら crontab -e で一行、五分おき。
*/5 * * * * curl -s https://あなたのサイト/wp-cron.php?doing_wp_cron > /dev/null 2>&1
WP-CLI があるなら、Web サーバーを経由しない形でも同じことができます。
*/5 * * * * cd /var/www/site && wp cron event run --due-now > /dev/null 2>&1
五分が無難な初期値です。時間に敏感なメールを送るサイトなら一分でも構いませんし、ブログなら十五分で十分です。訪問者はもう「たまたま期限が来た処理」に待たされませんし、キューは誰もいなくても動きます。
その前に一度、ホスティングのコントロールパネルを見てください。Kinsta、WP Engine、SiteGround、Cloudways などの管理型ホスティングは、すでにサーバー側の cron を回しているか、スイッチ一つで有効にできます。それで作業は終わりです。
サーバーに触れない場合は、外から叩く
cron の使えない共用サーバーなら、外部のサービスに URL を定期的に開いてもらいます。cron-job.org や EasyCron には無料枠があり、数分おきに一つの URL を叩く程度なら十分です。https://あなたのサイト/wp-cron.php?doing_wp_cron を登録して、DISABLE_WP_CRON はそのまま。それだけです。
「?doing_wp_cron」とは何か
WordPress やプラグインが URL の末尾に付けるこのパラメータは、「これは cron の起動リクエストです」という合図です。付いていると WordPress はページを描画せずにキューを処理し、値のタイムスタンプをロックとして使います。ログに残っても害はなく、予約する URL には必ず付けておいてください。
Meow Apps のプラグインで、これに依存しているもの
裏で動くものは全部そうです。Database Cleaner の自動掃除、Meow Mailer のニュースレター送信キュー、Meow Workflow の予約トリガー。「予定の時刻に何も起きない」と感じたら、プラグインの設定より先に wp cron event list を打ってください。十中八九、仕事はそこに並んで待っていて、起こす役の WP-Cron が寝ていただけです 🙂
この記事に関連するプラグイン
Database Cleaner
使われていないテーブルやリビジョンでデータベースが肥大化する問題を整理します。