Tips
WP-Cronが動かない原因と対処
2026-01-11
この記事が解決する状況
| あなたの状況 | 読むべきセクション |
|---|---|
| 予約投稿が時間通りに公開されない | 今すぐ確認:Cronが動いているか |
| バックアップが自動実行されない | WP-Cronの仕組み |
| プラグインの定期処理が動いていない | 確認1〜3 |
| サーバーCronへの切り替え方を知りたい | 対処: サーバーCronに切り替える |
「動いているかすら分からない」なら、まず「今すぐ確認」セクションを実行。
今すぐ確認:Cronが動いているか
30秒でできる確認方法。
方法1: ブラウザでアクセス
https://example.com/wp-cron.php?doing_wp_cron
白い画面(空白)が表示されればOK。エラーが出たら何か問題がある。
方法2: 予約投稿が溜まっていないか
管理画面 → 投稿一覧 → 「予約済み」フィルタ
過去の日時の予約投稿が残っていたら、Cronが動いていない証拠。
よくある失敗
「予約投稿が時間通りに公開されない」
WP-Cronは「誰かがサイトにアクセスした時」に動く。深夜に予約しても、朝までアクセスがなければ公開されない。
WP-Cronの仕組み
通常のcron: サーバーが指定時刻に実行
WP-Cron: 誰かがアクセスした時に実行
| 項目 | WP-Cron | サーバーCron |
|---|---|---|
| 実行タイミング | アクセス時 | 指定時刻 |
| 低トラフィックサイト | 遅延する | 正確 |
| サーバー設定 | 不要 | 必要 |
アクセスが少ないサイトでは、WP-Cronは信頼できない。
症状別の原因
| 症状 | 原因 |
|---|---|
| 予約投稿が公開されない | アクセスがない、またはCron無効化 |
| 数時間〜翌日に公開される | 低トラフィック |
| 全く動かない | DISABLE_WP_CRONがtrue |
| プラグインの定期処理が動かない | 同上 |
確認1: WP-Cronが無効化されていないか
// wp-config.php を確認
define('DISABLE_WP_CRON', true); // これがあると無効
意図せず無効化されていることがある。サーバーCronに切り替え済みなら正常。
無効化されているのにサーバーCronが設定されていない → 完全に動いていない
確認2: Cronイベントの状態
WP Crontrolプラグインで確認
- プラグイン「WP Crontrol」をインストール
- ツール → Cron イベント
| 確認項目 | 正常な状態 |
|---|---|
| 予約投稿のイベント | publish_future_post が存在 |
| 次回実行時刻 | 過去日時になっていない |
「次回実行」が過去のまま溜まっていたら、Cronが動いていない証拠。
確認3: 手動でCronを実行
ブラウザで直接アクセス:
https://example.com/wp-cron.php?doing_wp_cron
これで予約投稿が公開されれば、WP-Cron自体は正常。トリガーされていないだけ。
対処: サーバーCronに切り替える
WP-Cronを無効化し、サーバー側で定期実行する。最も確実な方法。
手順1: WP-Cronを無効化
// wp-config.php に追記
define('DISABLE_WP_CRON', true);
手順2: サーバーCronを設定
Xserverの場合
サーバーパネル → Cron設定 → 追加
| 項目 | 設定値 |
|---|---|
| 分 | */15(15分ごと) |
| 時 | * |
| 日 | * |
| 月 | * |
| 曜日 | * |
| コマンド | wget -q -O /dev/null "https://example.com/wp-cron.php?doing_wp_cron" |
さくらサーバーの場合
コントロールパネル → CRONの設定
*/15 * * * * /usr/bin/wget -q -O /dev/null "https://example.com/wp-cron.php?doing_wp_cron"
ConoHa WINGの場合
コントロールパネル → サイト管理 → Cron設定
*/15 * * * * wget -q -O /dev/null "https://example.com/wp-cron.php?doing_wp_cron"
SSHでcrontab直接編集
crontab -e
*/15 * * * * wget -q -O /dev/null "https://example.com/wp-cron.php?doing_wp_cron" > /dev/null 2>&1
実行間隔の決め方
| サイト種別 | 推奨間隔 |
|---|---|
| 一般的なブログ | 15分 |
| 予約投稿を多用 | 5分 |
| ECサイト・会員サイト | 1〜5分 |
| ほぼ静的なサイト | 30分〜1時間 |
間隔を短くしすぎるとサーバー負荷になる。 用途に応じて調整。
curlとwgetの違い
どちらでも動作する。サーバーにインストールされている方を使う。
# wget版
wget -q -O /dev/null "https://example.com/wp-cron.php?doing_wp_cron"
# curl版
curl -s "https://example.com/wp-cron.php?doing_wp_cron" > /dev/null
確認方法:
which wget # パスが表示されればインストール済み
which curl
事故事例:Cron設定の落とし穴
事例1: 無効化だけして設定忘れ
状況: wp-config.phpにDISABLE_WP_CRONを追加したが、サーバーCronを設定し忘れた
結果: 予約投稿、バックアップ、全ての定期処理が停止
対処: サーバーCronを設定するか、DISABLE_WP_CRONを削除
事例2: Basic認証で弾かれる
状況: ステージング環境にBasic認証をかけている
結果: サーバーCronからのアクセスが401で弾かれる
対処: URLに認証情報を含める
wget -q -O /dev/null "https://user:pass@example.com/wp-cron.php?doing_wp_cron"
事例3: マルチサイトで一部だけ動かない
状況: WordPressマルチサイトでメインサイトのCronだけ設定
結果: サブサイトの予約投稿が動かない
対処: 各サイトのURLでCronを設定
トラブルシューティング
| 症状 | 原因 | 対処 |
|---|---|---|
| Cron設定したのに動かない | コマンドのパスが違う | which wgetでパス確認 |
| SSL証明書エラー | 自己証明書 | --no-check-certificateオプション追加 |
| Basic認証で弾かれる | 認証付きサイト | URLに認証情報を含める |
| 実行されているか不明 | ログがない | 出力先を指定してログ確認 |
実行ログを残す場合
*/15 * * * * wget -q -O /dev/null "https://example.com/wp-cron.php?doing_wp_cron" >> /home/user/cron.log 2>&1
WP-Cronに依存するプラグイン
以下のプラグインはWP-Cronが正常でないと機能しない:
- 予約投稿(WordPress標準)
- バックアッププラグイン(UpdraftPlus等)
- メール送信キュー(SMTPプラグインのリトライ)
- キャッシュの定期削除
- 定期的なDB最適化
「動かない」と思ったらWP-Cronを疑う。
まとめ
- WP-Cronは「アクセス時」に動く仕組み
- 低トラフィックサイトでは遅延・未実行が起きる
- サーバーCronに切り替えれば確実に動く
DISABLE_WP_CRONを設定してからサーバーCronを追加- 実行間隔は15分が一般的、用途に応じて調整
- 無効化だけしてサーバーCron未設定は最悪のパターン
関連記事
- お問い合わせフォームが届かない原因の特定方法 — メールキューが処理されない場合
- PHPで日時切り替えを実装する前に確認すること — 時間ベースの処理の注意点