使用wp_cron和动态电子邮件正文数据向多个收件人发送带有wp_mail()的邮件

时间:2019-10-25 作者:LovinQuaQua

我有一个前端提交表单,用户可以在其中向自定义帖子类型添加事件。我想在此活动发生前1周向每个用户发送一封电子邮件。

电子邮件通过wp_cron. 该函数是用钩子调用的。它工作正常,但我想向电子邮件正文添加自定义值。

使用我的代码,无法为我的电子邮件正文模板添加动态值。

使用下面的函数,我循环遍历events post类型并获得所需的数据

function leweb_get_events_detail() {

    // Query
    global $wp_query;

    // Arguments  
    $args = array(
        \'post_type\' => \'events\',
    );

    // Start the Query
    $query = new WP_Query( $args );

    // The Loop
    if( $query->have_posts() ) {

        $results = array();

        while( $query->have_posts() ) {

            $query->the_post();             

            $event_date_timestamp = get_post_meta( get_the_ID(), \'event_date_timestamp\', true );
            $future_timestamp = strtotime("+1 week");

            // Damit wird geprüft ob schon einmal diese Email gesendet wurde
            $notification = get_post_meta( get_the_ID(), \'event_creator_notification\' );

            if( !in_array( \'1week\', $notification )  && $event_date_timestamp < $future_timestamp ) {

                $event_id = get_the_ID();
                $event_email = get_post_meta( get_the_ID(), \'event_email\', true );

                $results[] = array( 
                                \'event_id\'      => $event_id, 
                                \'event_date_timestamp\' => $event_date_timestamp,
                                \'event_email\'     => $event_email,
                );

            }
        }

        return $results;

    }

    wp_reset_query();

}
下面的函数允许我从post\\u元数组中提取数据:

function leweb_get_values_from_post_meta( $meta = \'\') {

    $results = leweb_get_events_detail();

    $values = array();
    foreach( $results as $key => $value ){

        $values[] = $value[ $meta ];

    }

    return $values;
}
下面的函数调用自wp_cron. 该电子邮件将发送给符合上述条件的所有收件人,并在帖子元中添加一个值,以防止多次发送此电子邮件。

function leweb_send_mail_to_author() {


    // Alle Emails aus dem Array auslesen und für das BCC Feld im Email Header vorbereiten
    $emails = leweb_get_values_from_post_meta( \'event_email\');

    if ( !empty( $emails ) ) {

        $emails = \'BCC: \' . implode( \',\', $emails );

        // Email senden
        $to = \'\';
        $subject = \'Dein Event findet bald statt!\';
        $body = file_get_contents( get_stylesheet_directory() . \'/templates/email/event-creator-notification.php\');
        $headers = array( \'Content-Type: text/html; charset=UTF-8\',\'From: Example <[email protected]>\', $emails );

        wp_mail( $to, $subject, $body, $headers );

        // Wert in post_meta eintragen um die Mehrfachsendung zu verhindern
        $post_id = leweb_get_values_from_post_meta( \'event_id\');

        foreach( $post_id as $id ) {

            add_post_meta( $id, \'event_creator_notification\', \'1week\' );

        }

    }

}
After I coded this I figured out. it\'s not possible to send dynamic content in the body of my email. 实现这一目标的唯一方法是调用wp_mail() 在foreach。但我想这会很重吧?将来,此作业每次运行最多可能发送100封电子邮件。。。

所以我想知道是否有其他方法可以做到干净?

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

你的问题是:

        $body = file_get_contents( get_stylesheet_directory() . \'/templates/email/event-creator-notification.php\');
file_get_contents 从字面上说,只是获取该文件的内容。没有PHP执行。相反,如果您想获得某个变量的输出,请使用输出缓冲区,例如。

ob_start(); // everything echo\'d after this gets put in the buffer
get_template_part( \'templates/email/event-creator-notification\' );
$body = ob_get_clean(); // get the buffers contents and stop output buffering

相关推荐

Cron not sending wp-mail()

我对cron计划功能有问题,它不想用wp_mail() 作用This is my code:它被放置在函数中。php<?php add_filter(\'cron_schedules\', \'add_review_invites_schedule\'); function add_review_invites_schedule($schedules){ $schedules[\'send_review_invites_interva