2017-10-05 133 views
0

我正在运行一个cron函数来删除旧事件(基于自定义字段)。 该函数可以查找并删除过去所有的事件。 到目前为止这么好...WordPress:wp_mail函数只能在foreach循环中运行一次

现在我想发一个电子邮件给活动的作者,该活动已被删除。我正在用foreach中的一个额外的wp_mail函数来执行此操作。

现在的问题是,只有最后一个旧事件被删除。也许这与foreach中的邮件变量($post$author,...)有关系吗?

我读到一些关于这个问题在这里,但我不明白:wp_mail() in a loop, only sending to last address

这里是我的代码:

function get_delete_old_events() { 

    $past_query = date('Y-m-d', strtotime('-1 day')); 

    // Set our query arguments 
    $args = [ 
     'fields'   => 'ids', // Only get post ID's to improve performance 
     'post_type'  => 'event', // Post type 
     'posts_per_page' => -1, 
     'meta_query'  => [ 
      [ 
       'key'  => 'gid_22', // Replace this with the event end date meta key. 
       'value' => $past_query, 
       'compare' => '<=' 
      ] 
     ] 
     ]; 
    $q = get_posts($args); 

    // Check if we have posts to delete, if not, return false 
    if (!$q) 
     return false; 

    // OK, we have posts to delete, lets delete them 
    foreach ($q as $id) 

     /* start e-mail */ 
      $headers[] = 'From: SITENAME <[email protected]>'; 

      $post  = get_post($id); 
      $author  = get_userdata($post->post_author); 
      $subject = "SUBJECT: ".$post->post_title.""; 

      $message = "THE MESSAGE BODY"; 

      wp_mail($author->user_email, $subject, $message, $headers); 
     /* end e-mail */ 

     wp_trash_post($id); 
} 

// expired_post_delete hook fires when the Cron is executed 
add_action('old_event_delete', 'get_delete_old_events'); 


// Add function to register event to wp 
add_action('wp', 'register_daily_events_delete_event'); 

function register_daily_events_delete_event() { 
    // Make sure this event hasn't been scheduled 
    if(!wp_next_scheduled('old_event_delete')) { 
     // Schedule the event 
     wp_schedule_event(time(), 'hourly', 'old_event_delete'); 
    } 
} 
+0

您的代码似乎必须正常工作。你可以在编辑邮件功能之前分享运行良好的代码吗? –

+0

工作正常的代码与我的问题中的代码相同。除了注释部分“开始电子邮件”和“结束电子邮件”之间的代码 – Cray

+0

也许你需要使用重置数据功能让我分享代码 –

回答

1

请尝试以下代码。

function get_delete_old_events() { 
    $past_query = date('Y-m-d', strtotime('-1 day')); 
    // WP_Query arguments 
    $args = array(
     'fields'   => 'ids', // Only get post ID's to improve performance 
     'post_type'  => array('event'), //post type 
     'posts_per_page' => '-1',//fetch all posts, 
     'meta_query'  =>array(
            'relation' => 'AND', 
            array(
              'key' => 'gid_22', 
              'value' => $past_query, 
              'compare' => '<=' 
             ) 
           ) 
     ); 

    // The Query 
    $query = new WP_Query($args); 

    // The Loop 
    if ($query->have_posts()) { 
     while ($query->have_posts()) { 
      $query->the_post(); 
      // do something 
      $headers[] = 'From: SITENAME <[email protected]>'; 

      $postid  = get_the_ID(); 
      $post  = get_post($postid); 
      $author  = get_userdata($post->post_author); 
      $subject = "SUBJECT: ".get_the_title().""; 

      $message = "THE MESSAGE BODY"; 

      wp_mail($author->user_email, $subject, $message, $headers); 
      wp_trash_post($id); 
     } 
    } else { 
     // no posts found 
     return false; 

    } 

    // Restore original Post Data 
    wp_reset_postdata(); 

} 
+0

谢谢我会试试 – Cray

+0

嗯,现在什么都没有了:)( – Cray

+0

对不起,现在请检查我把这个变量包装成一个字符串以前的版本$ past_query我把它包装成一个字符串 –

1

wp_mail函数返回布尔(见Wordpress Documentation here)。所以,它退出函数,因为它在第一次迭代中返回值。

的wp_mail

$is_sent = wp_mail($author->user_email, $subject, $message, $headers); 

它应该工作,然后前只需添加一个变量。

+0

谢谢,但它还没有工作。也许我们需要存储其他变量呢? – Cray

+0

嗯,可能是。请检查WP文档。如果他们返回一些东西,而不是由某个变量处理,那么你可能需要。 –