
12月です!クリスマスやお正月などいろいろなイベントが盛りだくさんの季節になってきました。クリスマスカードや年賀状などをあらかじめ作っておいて、その日になったら送るということをWordPressでできないかと考えて見ました。
WordPressに備わっている疑似CRONの方法でどのようにしたらそういうメールが送れるのか試してみました。それについて書きます。
WordPressの機能疑似クーロンの使い方 1回だけ行うつもりが永久ループってる?
検索してこちらのページをみつけました
WordPressで擬似cronを使ってバッチ処理を定期実行させる方法
コワーキングスペース7Fのユースケさんの記事でした(^^)/
この例だと daily で毎日送られてしまうため、1回だけ実行できる方法はないのかなーと検索して、
という関数を発見しました。そこで、ユースケさんのコードの関数をこれに置き換えて、使っている子テーマの functions.php に
// メール送信処理
function my_test_mail() {
wp_mail( 'test@example.com', 'cronメールのテスト', 'これはテストです' );
}
add_action ( 'sample_add_cron', 'my_test_mail' );
// cron登録処理
if ( !wp_next_scheduled( 'sample_add_cron' ) ) {
wp_schedule_single_event( time(), 'sample_add_cron' );
}
このコードを追加してサーバーにアップロード、そしてメールボックスを開いてみると…

きゃぁぁ~(>_<)、やばい…ループしている。プログラマが一番恐れているそれが発生していました。慌ててコードを削除したfunctions.phpをアップロードしてメールを止めました。
先ほどのCodexに
function do_this_in_an_hour() {
// 何か実行する(イベント)
}
add_action( 'my_new_event','do_this_in_an_hour' );
// 次の行を関数の中に入れてください
// その関数はユーザーが何かを行ったときだけ実行されるものにしましょう
// そうしないとページ訪問のたびに毎回新しいイベントが登録されます
wp_schedule_single_event( time() + 3600, 'my_new_event' );
// time() + 3600 = 今から1時間後。
こんな感じでサンプルが書いてあり、「その関数はユーザーが何かを行ったときだけ実行されるものにしましょう そうしないとページ訪問のたびに毎回新しいイベントが登録されます」のようなコメントがありました。
if ( !wp_next_scheduled( 'sample_add_cron' ) ) {
と書いてあるから大丈夫と思ったのだけど、もしかすると1度だけ行うので逆に 1度行うとスケジュールが削除される→スケジュールがないから登録 のループになっているのかな、、と思いました。
WP Controlというプラグインをインストールしてみる
そこで、ユースケさんのblogで紹介されていた、WordPressで登録済みのスケジュールを見たり、スケジュールを登録できるプラグイン WP Control を入れてみます。
ダッシュボード プラグイン>新規追加 で

WP Control と入力してリターン。このとき WP Control の大文字を小文字にしちゃうとなかなかこのプラグインが見つからないのでご注意ください。

今すぐインストール をクリック

プラグインを有効化 をクリック
これでインストールできました。このプラグインを使うには、

ダッシュボード プラグイン>インストール済みプラグイン をクリック

WP Controlの所にある Cron Events をクリックします

すると、WordPressやプラグインに入っているCRONが一覧表示されます。
良くある使い方で 設定 から使おうとすると

Cron Schedules
しかありませんので、これは新しい単位のスケジュールを追加する画面

になってしまいます。これだと自分のCRONを登録する画面ではありませんので面倒ですがインストール済みのプラグインからCron Eventsを選びます。
WP Controlを使って1度だけ動かすCRONを追加してみる
1度だけ動かす部分をWP Controlに任せたいのでfunctions.phpは
// メール送信処理
function my_test_mail() {
wp_mail( 'test@example.com', 'cronメールのテスト3', 'これはテストです3' );
}
add_action ( 'sample_add_cron', 'my_test_mail' );
これだけにします。ここではまだアクションが追加されただけなのでこれをアップしてもメールは送られません。
プラグイン>インストール済みのプラグイン WP Control のCron Events をクリック

この画面の下の方にある Add Cron Event にこのように入力します。
Hook name : add_actionで指定したHook name
Next run (UTC): 実行させたい年月日時刻 を入れます UTC(世界標準時)なのですが、ローカルタイムで指定してその時間に実行されました
Event schedule: は Non-repeating 繰り返さない
こんな感じです。
Add Cron Event をクリック

Successfully created the cron event sample_add_cron
と表示され、一覧に追加したイベント sample_add_cron が入っています。実行されるまでの残り時間も表示されています。

読み直してみるとさらに実行されるまでの時間が短くなります。あと10秒…

10秒が過ぎた頃に読み直すと一覧から sample_add_cron が消えていました。
メールを見てみると

このように届いていました(^^)/。その後何度かメールを見ましたが、メールはこの1通だけでした。成功したようです!
メールの送信元を変える
受け取ったメールなのですが送信元が WordPress になってしまっています。返信しようとすると、
wordpress@ryus.co.jp という存在しないメールアドレス宛になってしまうので、ここを修正しようと思います。また、実際に使うイメージのタイトルと本文にしてみます。
// メール送信処理
function my_test_mail() {
$subject = 'メリークリスマス!';
$body = 'メリークリスマス!'. "\r\n". '素敵な年末年始をお過ごしください♪'. "\r\n";
$headers = 'From: うもとみか <自分のメールアドレス>' . "\r\n";
wp_mail( 'test@example.com', $subject, $body, $headers);
}
add_action ( 'sample_add_cron', 'my_test_mail' );
このようにfunctions.phpを書き換えます。その後、同じようにCRONのスケジュールを登録してメールを受け取ってみると、

こういう感じのメールが届きました。fromの名前が指定されたものになっています。返信先もfromのメールアドレスになりました。
まとめ:疑似CRONとWP Controlでいろいろできそうですね
疑似CRONはWordPressにアクセスがあったときに動くので、本物のCRONのようにアクセスがなくても動くものではありません。しかし、動かしたいときにサイトを表示させればいいのでこのへんは割り切って使いたいと思います。アクセスが多いサイトならあまり気にすることもないかもしれません。
またWP ContolではCron Schedulesで、新しい単位を追加できるので1年などの単位で追加して、お誕生日カードを毎年送るとかいろいろなメールを送るアイデアが湧いてきました(^^)/
[amazon_searchlink search=”PHPプログラム”]



コメント