悩ましいWordPressの「スケジュール未達」問題 - 永久的に解決する方法
WordPress コミュニティの誰も解明できなかった何らかの理由で、スケジュールされた投稿が表示されないことがあります。
これはWordPressでは「スケジュール未達」と表示されます。残念ながら、スケジュールを逃すと投稿は保留状態になります。管理者は手動で投稿を公開するか、スケジュールを変更する必要があります。
WebSiteでは、こういったことは数ヶ月に一度くらい起きることが多いです。先週も同じようなことがありましたが、 25230のスレッドで言及しようとしたら、まだ公開されていなかったんです。警告も送られていません。
何が原因でしょうか?おそらく、何らかの最悪の事態が起こったのでしょう。
WordPressの偽Cronの仕組み
WordPressには実行中のデーモンがないため、バックグラウンドで「crond」が実行して期限切れのコンテンツをチェックすることはありません。その代わりに、誰かがサイトにアクセスするたびに、WordPressは記事の期限が迫っているかどうかを確認し、すぐに公開します。これは理にかなっています。「森の中で木が倒れても誰もいなければ、音はするだろうか?」という状況に似ています。午後1時に公開予定の記事があって、午後3時まで誰もアクセスしなかったとしても、問題はありません。午後3時に最初の訪問者が来て、タイムスタンプが午後1時であれば、記事は表示されます。
WordPressの偽Cronが時々機能しない理由
調査の結果、これが時々失敗する理由は完全には明らかではありません。グーグルで調べたところ、いくつかの原因が考えられます。
- キャッシング
- 処理リソースの不足
- 干渉するプラグイン
- ホストOSの制限
…あるいはこれらすべてが重なり合う、最悪の状況かもしれません。WebSiteの経験から言うと、一貫性はありません。
私の推測では、私たちの場合、公開時に発生する付随的なアクションがすべて原因です。完全に汎用的なWordPressサイトであれば、投稿を「スケジュール済み」から「公開済み」にすることは、データベースのフィールドを更新する程度のことです。しかし、私たちの場合、サイトマップの更新や各種ソーシャルネットワークの通知のキューイングなども行います。訪問者が来てWordPressがこれらすべての処理を実行しようとすると、何かがタイムアウトしてしまい、公開が実行されないのではないかと考えています。
修正方法
この問題に対処するためのプラグインをインストールするという選択肢もありますが、WPプラグインをこれ以上必要とする人がいるでしょうか? WPプラグインは確かに存在します。WP Crontrolもその一つですが、私はまだ詳しく調べていません。
より良い解決策は、WPの偽のcronを捨てて、本物のcronでジョブを実行することです。これには2つのステップが必要です。
(1)WordPressのcronを無効にします。wp-config.phpファイルを編集し、以下を追加します。
定義( 'DISABLE_WP_CRON' 、 true );
サイトを再読み込みして(つまり、Web ブラウザーでアクセスして)、入力ミスがないことを確認します。
(2)WordPressボックスにログインし、Webユーザーのcrontabを次のように編集します。
*/5 * * * * /bin/wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
「example.com」を独自のドメインに置き換えます。
このジョブは 5 分ごとに実行され、期限が切れたものや期限を過ぎたものをすべて公開します。
この特定の構文は、すべてのエラーをビットバケット(/dev/null)に送信します。エラーを受信したい場合は、以下のように変更してください。
メール宛先[email protected]
*/5 * * * * /bin/wget -q -O - https://example.com/wp-cron.php?doing_wp_cron
CronはMAILTO行で指定されたアドレスに出力を送信します。