【WordPress】wp-cronによる自動バックグラウンドアップデート処理のキックについて

WordPressの自動バックグラウンドアップデートが動かなくなった際に調べたことのメモ。
最終的にはパーミッションが駄目なだけで無駄足だった。

雑に斜め読みしただけなので、認識に誤りがあるかもしれません….

wp-cronによる自動バックグラウンドアップデート処理のキック

アップデート処理 wp_maybe_auto_update()wp_version_check() 内で必要に応じてキックされている模様。

WordPress/update.php at 064e62cbeac39a062a46a7d2d7e94b297ad5e8c0 · WordPress/WordPress

# wp-includes/update.php
            .
            .
            .
        // Trigger background updates if running non-interactively, and we weren't called from the update handler.
        if ( defined( 'DOING_CRON' ) && DOING_CRON && ! doing_action( 'wp_maybe_auto_update' ) ) {
                do_action( 'wp_maybe_auto_update' );
        }
            .
            .
            .

wp_version_checkwp-cron でページアクセス時に実行される (デフォルトだと1日2回)。

ページアクセス

↓

index.php

↓

wp-blog-header.php

↓

wp-load.php

↓

wp-config.php

↓

wp-settings.php

    // Attach the default filters.
    require( ABSPATH . WPINC . '/default-filters.php' );

↓

wp-includes/default-filters.php

    // WP Cron
    if ( !defined( 'DOING_CRON' ) )
            add_action( 'init', 'wp_cron' );

↓

wp-cron.php と wp-includes/cron.php で wp-cron のジョブ実行

wp-cronwp_version_check がスケジューリングされているかの確認方法

DBからwp-cronの設定内容を取得する方法

中身はPHPでシリアライズされた文字列なので、このサイト などを用いて適当に整形する。

mysql> select * from wp_options where option_name = 'cron'\G
.
.
.
    1495444507 => array(
        wp_version_check => array(
            40cd750bba9870f18aada2478b24840a => array(
                schedule => twicedaily
                args => array(
                )
                interval => 43200
            )
        )
.
.
.
# date --date "@1495444507"
Mon May 22 18:15:07 JST 2017

wp-cliを設置して確認する方法

# wp --allow-root cron schedule list
+------------+---------+----------+
| name       | display | interval |
+------------+---------+----------+
| hourly     | 1時間に1回 | 3600     |
| twicedaily | 1日2回  | 43200    |
| daily      | 1日1回  | 86400    |
+------------+---------+----------+
# wp --allow-root cron event list
+--------------------------------+---------------------+-------------------+---------------+
| hook                           | next_run_gmt        | next_run_relative | recurrence    |
+--------------------------------+---------------------+-------------------+---------------+
| wp_scheduled_auto_draft_delete | 2017-05-22 08:31:03 | 6時間 10 minutes  | 1日           |
| wp_version_check               | 2017-05-22 09:15:07 | 6時間 54 minutes  | 12時間        |
| wp_update_plugins              | 2017-05-22 09:15:07 | 6時間 54 minutes  | 12時間        |
| wp_update_themes               | 2017-05-22 09:15:07 | 6時間 54 minutes  | 12時間        |
| publish_future_post            | 2017-05-22 15:05:12 | 12時間 44 minutes | Non-repeating |
| yst_ga_aggregate_data          | 2017-05-23 00:05:00 | 21時間 44 minutes | 1日           |
| wp_scheduled_delete            | 2017-05-23 01:22:37 | 23時間 1 minute   | 1日           |
| publish_future_post            | 2017-05-23 15:00:05 | 1日 12時間        | Non-repeating |
+--------------------------------+---------------------+-------------------+---------------+

補足: wp-cronのテスト

wp-cli でテスト実行すると、PHPの生エラーがターミナル上に出力されるのでわかりやすい。。。

# wp --allow-root cron test
Success: WP-Cron spawning is working as expected.

curlwp-cronを叩いているので、webサーバー上でSITE_URLへ正常にcurl出来る必要がある。 (オレオレSSL証明書とか、LAN内でグローバルIPによるアクセスができないインフラなどは要注意…?)

参考

WordPressで予約投稿失敗の原因究明のため、cron.phpを読んでみました | sand a lot Web & Music Create [札幌]