イベントのスケジュール
全体で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