web-dev-qa-db-ja.com

引数を指定してwp_schedule_single_eventを使用して電子メールを送信する

私はWordPressプラグインを利用して一定時間後にEメールを送信するように疑似cronジョブをスケジュールしようとしています。

これまでは、電子メールアドレスとメッセージをemail_about_coupon()関数にハードコードしたときにこのコードを実行させることができました。ただし、関数に引数を送信しようとすると、電子メールは送信されません。

Cron GUIプラグイン を使用することで、cronジョブが引数付きでも登録されていることがわかります。実行時に関数内で引数が正しく使用されないような、誤ったことをしていると思います。

これは私が持っているものです:

function schedule_email_cron($post_id)
{
    // Get the UNIX 30 days from now time
    $thirty_days = time() + 60; // (30 * 24 * 60 * 60)
    $post = get_post($post_id);
    $email = get_the_author_meta('user_email', $post->post_author);
    $args = array('email' => $email, 'title' => $post->post_title);
    wp_schedule_single_event($thirty_days, 'email_about_coupon_action', $args); 
}

add_action('save_post', 'schedule_email_cron', 1, 1);

add_action('email_about_coupon_action', 'email_about_coupon', 1, 1);

function email_about_coupon($args)
{
    // Email text
    $text = "<html><body><p>Your coupon titled, ".$args['title']." is expiring soon. Please visit <a href=\"\">".get_bloginfo('siteurl')."/registered/</a> ".get_bloginfo('siteurl')."/registered/ to renew your coupon.</p></body></html>";

    // Email headers
    $headers = array(
        'From: '.get_bloginfo('name').' <'.get_bloginfo('admin_email').'>',
        "Content-Type: text/html"
    );
    $h = implode("\r\n",$headers) . "\r\n";

    // Send email
    wp_mail($args['email'], 'Renew Your Coupon Now!', $text, $h);
}

いつものように、あなたの助けを本当にありがとう!

6
tollmanz

引数の受け渡し方法とそれが機能することへの期待方法に不一致があると思います。スケジュールする引数の配列を渡し、フックされた関数が同じ引数の配列を受け取ることを期待します。これはそうではありません。

Cronイベントは do_action_ref_array() によって処理され、次に call_user_func_array() を介して引数が渡されます。

つまり、フックされた関数は引数の配列を受け取らず、複数の引数を受け取ります。配列内の各要素に対して1つずつです。

そのため、引数の配列をもう一度配列にラップするか、関数を変更して複数の引数を処理する必要があります。 1文字ではなく必要な数の引数が渡されるように、letterについてもadd_action()呼び出しを変更する必要があります。

11
Rarst

Rarstのおかげで、これは今もっとずっと理にかなったことになります。だから私はこの記事を更新し、Rarstが述べた違いを詳しく説明し、これを明らかにしたことで彼を支持した。 )

基本的に wp_schedule_single_event は、{ コーデック内 のように変数argsを介して引数を関数に渡します。配列の各値はコールバック関数の引数にマップされるため、この変数 "args"は配列である必要があります。

例:

add_action('example_action', 'example', 1, 3);
$args = array ( 2, 1, 3 );
wp_schedule_single_event(time(), 'example_action', $args);

function example($a, $b, $c)
{

}

2は$ aに行き、1は$ bに行きそして3は$ cに行きます。しかし、3つの変数を渡すことはこの行のためにのみ可能です。

add_action('example_action', 'example', 1, 3);

add_actionのコーデック を見ると、4番目の引数3が、コールバック関数に渡される引数の数を制御していることがわかります。デフォルトは1です。

したがって、この例も機能します。

add_action('example_action', 'example');
$args = array ( array( 2, 1, 3 ) );
wp_schedule_single_event(time(), 'example_action', $args);

function example($a)
{

}

そのため、ここでは配列(2、1、3)がちょうど$ aに割り当てられています。

したがって、Sardineの問題は、7行目で1行変更することで解決できます。

$args = array('email' => $email, 'title' => $post->post_title);

代わりにこれになります、

$args = array(array('email' => $email, 'title' => $post->post_title));
12
Thirlan