こんにちは、Juntechです。
AutoHacksを立ち上げて2ヶ月弱、ずっと困っていたことがありました。
それが、予約投稿
こいつです。

これが何回やっても、こうなる。

ということで今回は予約投稿の仕組みと、
どうすれば確実に予約投稿できるかを調べてみました。

予約投稿の仕組み

図説する

とりあえず図にしてみました。

サイト訪問がないと実行されない

デフォルトで用意されている予約投稿機能だと、
サイトにユーザーが訪問した時に初めて投稿機能が動くようになっているみたいです。
これだと、立ち上げたばかりのサイトでは必ずといっていいほど予約投稿がされません。

なんでこんな仕組みにしたの?と思ってしまいますが、
そもそもWordPressはWEBフレームワークで、
WEBというのはアクセスがあって初めてスクリプトを走らせるもの(だからこそサーバー非依存)です。
なので、WordPressを誰でもすぐに導入できるパッケージとして設計する以上、
こうする他になかったのだと思います。

インターネット経由で動かしてるっぽい

上の図だと表現していませんが、
どうやら予約投稿のトリガーを取得してから削除するまでの流れは、
WordPressサーバが、自分のサーバに置いてあるphpファイルに、
わざわざインターネット経由でアクセスすることで実行しているようです。
なので不特定多数に公開したくないとかでサイトにBasic認証の設定を入れていたりすると、
サーバーがインターネット経由でアクセスする際に認証に引っかかって失敗してしまうみたいです。

これはなんでこの仕組みにしたのか謎です。。
説をお持ちの方いれば教えてくださいm(_ _)m

どうすればいいの?

ということで、私が予約投稿できないのは、
まだサイト訪問が少ないことが原因ぽいです。
毎分サイト訪問させるスクリプト書けば解決しそうですが、
仕組み的にダサいので違う方法で解決します。

サーバーにやってもらおう

そもそも予約投稿が正常に動いてくれないのは、
スクリプトがサイト訪問をトリガーに動いていることが原因です。
これはWordPressだけで解決するのが厳しそうなので、
サーバーに手伝ってもらおうと思います。
使うのは「crontab」です。

crontabとは

crontabとは、LinuxなどUnix系のOSで、
コマンドを定期実行できる機能(コマンド)です。
こんな感じで書きます。
サーバでcrontab -eと打つと、スケジュールの設定ができます。
こんな感じで書きます。

# 分 時 日 月 曜日 実行コマンド
# *はAllの意味。 * * * * * は毎分実行という事になる。
* * * * * echo "test" >> /tmp/test.log

crontabでwp-cron.phpを叩く

このcrontabを使って、
Wordpressの中で予約投稿(というかスケジュール実行)を担当しているwp-cron.phpを実行します。
こんな感じでcrontabを書きます。

# wp-cronを毎分実行
* * * * * /usr/bin/php7.2 /home/autohacks/autohacks.net/public_html/wp-cron.php

コマンドの意味を和訳すると、
「php7.2を起動して、wp-cron.phpを実行する」
という意味になります。
他のサイトだと/usr/bin/phpとなっていたりしますが、
私の使っているエックスサーバーではPHPを複数入れており、
AutoHacksを動かしているのはこの/usr/bin/php7.2なので、こいつを使っています。
エックスサーバーについてはこちら(広告リンクです)


エックスサーバーで動いているPHPのバージョンを確認する場合には、
サーバーパネルから「PHP Ver.切替」 -> 見たいドメインを選択
で確認することができます。

デフォルトの予約投稿は無効化しておく

これでcrontabから予約投稿の実行をすることができます。
ただこのままだと、通常のサイト訪問でも予約投稿が動いてしまうことになります。
毎分サーバーで実行している以上何の意味もないので、
サイト訪問起因での実行は止めちゃいましょう。

wp-contentとかwp-includesとかがあるフォルダに、wp-config.phpというファイルがいます。
こいつに下記の一行を追加します。

define('DISABLE_WP_CRON', 'true');

ネットで調べた感じだと、データベース設定入れている箇所の真下に書きましょうとあったので、
とりあえず私もそうしています。

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define( 'DB_COLLATE', '' );

/** wp-cron.phpの実行を無効化 */
define('DISABLE_WP_CRON', 'true');

無事成功!

ということで、無事予約投稿することができました!

サイト速度も向上するらしい

ちなみにDISABLE_WP_CRONを設定することで、
サイトのパフォーマンスも向上するそうです。
サイト訪問のたびに自分から自分へHTTPアクセスしているわけなので、
そこの労力がなくなって早くなるんですかね。


今回はここまで。
ようやくこれで記事の下記溜め・自動公開ができます!!
この投稿も、予約投稿でやりたいと思います笑