簡體   English   中英

WordPress:wp_mail函數在foreach循環中僅工作一次

[英]WordPress: wp_mail function only works once in foreach loop

我正在運行一個具有刪除舊事件(基於自定義字段)功能的cron。 該函數可以查找並刪除過去的所有事件。 到現在為止還挺好...

現在,我想向事件的作者發送電子郵件,表明該事件已被刪除。 我通過在foreach中使用額外的wp_mail函數來執行此操作。

現在的問題是,只有最后的舊事件被刪除。 也許這與foreach內郵件( $post$author ,...)的變量有關?

我在這里閱讀了有關該問題的內容,但我不明白: 循環中的wp_mail(),僅發送到最后一個地址

這是我的代碼:

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 <hello@domain.com>';

            $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' );
    }
}

wp_mail函數返回bool(請參閱WordPress文檔 )。 因此,它退出函數,因為它在第一次迭代中返回值。

只需在wp_mail之前添加一個變量

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

那應該可以了。

嘗試下面的代碼。

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 <hello@domain.com>';

            $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();

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM