モヒカンメモ

髪色が定期的に変わることに定評のある(比較的)若者Webエンジニアの備忘録

WordPressの予約投稿が仕事しなかったのでcronの設定をした

WordPressの予約投稿がきちんと動かずに、「投稿失敗」してしまったのでその原因調査と対応の備忘録を残しておく

できごと

WordPressでブログを構築して翌日公開の予約投稿を設定したが、時間になっても公開されなかった (記事が公開されるとJetPackのパブリサイズ機能によってSNSに記事公開の通知がされるはずだが、所定時間を過ぎても通知されていなかった)。

なぜだろうと思い、ブログにアクセスしたところ予約投稿が公開された (SNSへ記事公開の通知がされた)

原因調査

「wordpress 予約投稿 失敗」みたいなキーワードでググって色々調べた結果、デフォルトのWordPressの設定だと、

ブログへのアクセスをトリガーに

  1. 予約投稿チェック
  2. 公開時刻を過ぎている記事があればそれを公開

という動きをする模様 (コードレベルではまだ追っていない)

今回の場合は、投稿が公開される時間帯にアクセスが全然無かったため、所定時間を過ぎても公開されなかった、と言うのが原因のよう

確かにそれだったら

なぜだろうと思い、ブログにアクセスしたところ予約投稿が公開された」

という事象にも説明がつく

レンタルサーバとかで動かすことを考えたらcronが使えない環境でも動く必要があって、それにはアクセスをトリガーにするしかないよな、と設計的にも理解できる

ただ、これはこれでアクセスのたびに予約投稿があるかをDBに問い合わせているはずで、それで発生するオーバーヘッドはブログへのアクセス数が大きくなっていくにつれて無視出来ない大きさになるのでは?という疑念が生まれる

対応

結論としては アクセスをトリガーにしない設定を追加 + cronでwp-cron.phpを定期実行させる という対応をした

それによって、アクセスをトリガーに動かなくなるのでアクセスのたびに余計なオーバヘッドが乗ることもないし、アクセスがないから予約投稿が公開されない、、、と言う悲劇も起こらない (はず)

1. wp-config.phpへ設定

wp-config.phpの最下部あたりに、下記を追加する

define('DISABLE_WP_CRON', 'true');

これで、アクセスをトリガーに動かなくなる (はず)

2. crontabへ設定

cron = 指定した時間 or 一定周期で自動的にプログラムを動かす仕組み crontab = cronの設定

crontab -e でcrontab設定ファイルを開き、下記を追加

* * * * * curl -sS https://pinkumohikan.com/wp-cron.php

上記の意味としては、毎分curlと言うコマンドを使って https://pinkumohikan.com/wp-cron.php に対してアクセスするよ、って感じ ローカルなんだから直接 php /path/to/wp/wp-cron.php を叩けばいいじゃんっていうのも分かるけど、実行ユーザとディレクトリ構成に強く依存しちゃうのが好みじゃないので今回はこれで。

参考資料

  1. 意外と知らない、WordPressの正しいcronの設定方法|ある蜜柑の上にアルミ缶。
  2. WordPressの予約投稿が失敗した時に試す4つの解決策 | OXY NOTES