WordPressの予約投稿が動かないのでSystemdで解決した。

  • このエントリーをはてなブックマークに追加

WordPressで記事を自動投稿しようとしたとき、投稿されずに「予約投稿の失敗」とエラーが出ることがたまに発生するので、それを対処しました。

したいこと

  • WordPressで記事の自動投稿を成功させたい

原因

ネットで調べてると、どうやらwp-cron.phpというファイルがドキュメントルートに存在し、アクセスごとに発火させ、予約投稿の有無をチェックしているらしい。

レンタルサーバなどcronの使えない環境でも動くようにするということを考えると、最適とは言えなくはないが良い方法なのだろう。

アクセス数の多いサイトなどではパフォーマンスに影響してきそうではあるが。。。WP_CRON_LOCK_TIMEOUTでデフォルトで60秒は発火できないようなっているらしい。

 

対策

  • アクセスでwp-cron.phpを発火させず、cronで一分ごとにwp-cron.phpを叩きまくる

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

参考: wp-config.php の編集

参考元そのまんまなのですが、残念ながら(?)WordPressを動かしているサーバにはcronは標準でインストールされていません。インストールしようと思えば簡単にできるのですが、標準で入っているsystemd-timerで同じことがほぼできるためそちらを使うことにします。

 

 

wp-cron.phpをアクセスごとに発火させないようにする。

wp-config.phpの最後に下記を追加。

define('DISABLE_WP_CRON',true);

 Systemdのタイマーを書く。

環境として

  • nginxを動かしているユーザはhttpである
  • バーチャルホストを使用しているため、curlで叩くことはできない

サービスファイル

実行するためのファイル
/etc/systemd/system/wp-cron.service

[Unit]
Description=Fire wp-cron.php
Requires=nginx.service

[Service]
Type=oneshot
ExecStart=/usr/bin/php -q /srv/http/blog.jo3qma.com/wp-cron.php
User=http
Group=http

[Install]
WantedBy=multi-user.target

nginxが建っていなければこのスクリプトを叩いても意味がないと思う(思うだけなので違うかもしれないが)ので、requiresにnginxを指定。

タイマーファイル

定期的にサービスを叩くためのファイル

[Unit]
Description=Fire wp-cron.service

[Timer]
OnCalendar= *-*-* *:*:00
Unit=wp-cron.service

[Install]
WantedBy=multi-user.target

こんな感じかな。00秒に実行するようにしたので実質毎分叩くことになるはず。

登録

systemdに登録しないと動かないので登録。

systemctl enable wp-cron.timer
systemctl start wp-cron.timer

 

おしまい。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す