WordPress: イベントのスケジュールとcron


イベントのスケジュール

全体で8つの定期イベントがあり、バラバラに登録しているとデバッグが面倒なので、1ファイルにまとめている。

class LF_Events {
    private static $events = [
        [ // LOTD更新(毎日0:01)
            'hook'       => 'lf_event_renew_lotd',
            'args'       => [],
            'timing'     => 'tomorrow 0:01',
            'recurrence' => 'daily',
            'callback'   => [ 'LF_LOTD', 'renew' ],
        ],
        [ // 以下同様
        ],
    ]

    public static function init() {
        foreach ( self::$events as $event ) {

            if ( ! wp_next_scheduled( $event['hook'], $event['args'] ) ) {
        
                $etime = new DateTimeImmutable( $event['timing'], wp_timezone() );
        
                $ret = wp_schedule_event(
                    $etime->getTimeStamp(),
                    $event['recurrence'],
                    $event['hook'],
                    $event['args'],
                    true
                );
        
                if ( ! $ret || is_wp_error( $ret ) ) {
                    $errmsg['location'] = __METHOD__.' '.__LINE__;
                    $errmsg['$event']   = $event;
                    $errmsg['$ret']     = $ret;
                    error_log( print_r( $errmsg, true ) );
                    continue;
                }
            }
        
            add_action( $event['hook'], $event['callback'], 10, count( $event['args'] ) );
        }
    }
}

cron

ユーザーアクセスによる疑似cronではなくサーバーのcronを使う。10分おきに wp-cron.php を起動。

(/wp-config.php)
define( 'DISABLE_WP_CRON', true );

(crontab -l)
*/10 * * * * /usr/bin/php7.x /home/(...snip...)/wp-cron.php

タグ

(Page info for admin)