mixhostでwp-cronをcronに任せる方法

mixhostでwp-cronをcronに任せる方法

wordpressで定期的に行っている作業は自動で行うようにしましょう。また、wordpressが機能として持っているwp-cronではなくcronで作動させるようにする方法を紹介します。

なぜwp-cronではなくcronにするのかというとwp-cronも自動的に作業は行ってくれるのですが、wp-cronはサイトにアクセスがないと動作しません。

例)

毎日06:00に my_functionの実行命令を登録しておく。(毎日06:00に my_functionが動作することを期待)

実際には毎日06:00移行に初めてサイトにアクセスがあった際にmy_functionが呼び出される。

これでは必ず同じ時間に動作させたい場合にこれでは困ります。そこでwp-cronに登録されている命令をcronに任せることでサーバー時間をもとに定時実行することが可能になります。

wordpressの作業をcron登録する

まずwordoressの作業をwp-cronで動くように記述していきます。

function my_function() {
//処理
}
add_action ( 'my_function_cron', 'my_function' );
 
if ( !wp_next_scheduled( 'my_function_cron' ) ) {
  date_default_timezone_set('Asia/Tokyo');
  wp_schedule_event( wp_date( 'U', strtotime('tomorrow 06:00:00') ), 'daily', 'my_function_cron' );
}

定期的に行いたい処理をmy_functionとし、my_function_cronというアクションにフックします。

my_function_cronがスケジュールされていなければ、タイムゾーンを日本に設定し、my_function_cronをスケジュールします。

これで、毎日6時スケジュールされます。wp_schedule_eventの使い方はリファレンスを参考にしてください。

wp-cronを停止する

wp-cronをcronに任せるためにまずはwordpress側でwp-cronを停止する必要があります。

停止するためには以下をwp-config.phpに記述します。

define('DISABLE_WP_CRON', 'true');

記述する場所はデバッグ記述の後で問題ありません。

cPanelからcronジョブを追加する

cPanel管理画面から「詳細」→「cronジョブ」をクリックします。

cronの作業でエラーが出た際にメールで受け取りたい場合はメールをアドレスを入力し「電子メールの更新」ボタンをクリックします。

次に「新しい cron ジョブの追加」を行っていきます。

共通設定から1分間に1回の「* * * * *」を選びます。cron実行したことある人は見慣れたものかもしれません。

続いてコマンドです。

「php /home/(ユーザー名)/public_html/wp-cron.php >/dev/null」

phpの部分は「/usr/local/bin/php」と同じです。

その次に実行ファイル名の場所を指定しています。サブドメインなどではなく通常の形では「public_html」の直下にwp-cron.phpがあるはずです。

最後の部分「> /dev/null」は標準出力を/dev/nullに捨てています。よく見かける形としては「2>&1」がついたパターンです。これは標準エラー出力を標準出力にマージするという意味合いです。

併せると標準エラー出力を標準出力にマージして/dev/nullに捨てています。

その場合エラーがあった場合には標準エラー出力捨てられてしまうため原因がわかりません。標準エラー出力が出力された場合は知りたいので今回この記述はしません。メールアドレスが登録してある場合にはメールアドレスに標準エラー出力の内容が通知されます。