LoginSignup
5
5

More than 5 years have passed since last update.

WordPressでマルチサイトのWP-Cronの実行方法

Posted at

1.シングルサイトでのwp-cronの場合には

WordPressで通常のシングルサイトによけるWP-Cronの実行の仕方は、たくさんあります。

簡単にあげれば
1.誰かが訪問時にWP-Cronが起動する方法
2.外部のインターネットサイトから●●●.com/wp-cron.phpを読みこんでもらう方法
3.内部のCRONTAB機能を使って、キックする方法

2.マルチサイトでの問題点

これらがマルチサイトになると、結構厳しいんですね。

上記の1.の誰かが訪問してくれるのをきっかけなんで、来てくれなかった場合の処理が実現できないという。

2.だとマルチサイト化するほど大きい規模となり、サーバー群は大きくなれるけど、1サーバーの場合には、
アクセスが一極集中すると、WP-CRONの実行結果が500(Internal Server Error)になりがちで、タイムアウトがおきてしまいます。

3.ということで、消去法ですが、内部のCRONTAB機能を使ってタイムアウトを起こさず、時間きっかりに起動する方法を考えました。

3.どんな実行方法?

Bash WP-Cliを用意します。Linux系ならWp-Cliをインストールします。(詳細は割愛)

以下のシェルを作って、定期的に実行です。

#!/bin/sh
WP_INSTALL_PATH="/var/www/vhosts/example.com/httpdocs"
for SITE_URL in $(/usr/local/bin/wp site list --fields=domain,path,archived,deleted --format=csv --path="$WP_INSTALL_PATH" | grep ",0,0$" | awk -F ',' '{print $1 $2}')
do
    echo "site:$SITE_URL ========"
    for EVENT_HOOK in $(/usr/local/bin/wp cron event list --format=csv --fields=hook,next_run_relative --url="$SITE_URL" --path="$WP_INSTALL_PATH" | grep now | awk -F ',' '{print $1}')
    do
        if [ $EVENT_HOOK != "do_pings" ]; then
            echo "event_hook:$EVENT_HOOK"
            echo `date +"%Y/%m/%d %H:%M:%S"` start
            echo "wp cron event run $EVENT_HOOK --url=$SITE_URL --path=$WP_INSTALL_PATH"
            /usr/local/bin/wp cron event run "$EVENT_HOOK" --url="$SITE_URL" --path="$WP_INSTALL_PATH" --no-color
            echo `date +"%Y/%m/%d %H:%M:%S"` end
        else
            echo "event_hook:$EVENT_HOOK"
            echo `date +"%Y/%m/%d %H:%M:%S"` start
            echo "wp cron event delete $EVENT_HOOK --url=$SITE_URL --path=$WP_INSTALL_PATH"                /usr/local/bin/wp cron event delete "$EVENT_HOOK" --url="$SITE_URL" --path="$WP_INSTALL_PATH" --no-color                echo `date +"%Y/%m/%d %H:%M:%S"` end
        fi
    done
done

WP-CLIを使って、CRONのEVENTを走らせます。
途中の文中にある"do_pings"は、うちのサーバーで溜まりやすいゴミを消去(delete)するスペシャルロジックを入れています。

検索で海外にあったFAQだったのを日本用に転用して書き直しました。
また、このCRONTABに登録するときは、以下の設定にしています。

0 4 * * * ( /bin/sh /var/www/vhosts/cron-●●●.sh > /var/log/cron-●●●.log 2>&1  ) ; ( cat /var/log/cron-●●●.log    | Mail -s "`hostname` GET wp-cron" メールアドレス )

4.最後に

今回、初めてmarkdown記法で書く記事なので、文章がだらだらーと書いていますが、読みづらくてすみませんでした。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5