Bài toán: website của bạn có 500 khách hàng đăng ký thành viên, vào ngày 1 hàng tháng, bạn muốn gửi mail quảng cáo tới 500 user này, vây hướng xử lý sẽ như thế nào

Đây là chia sẻ hướng xử lý của mình: tạo 1 cron ‘my_monthly_schedule’ chạy vào ngày 1 hàng tháng, trong cron này có gọi tới 1 single cron event là: my_monthly_batch

để thực hiện chia nhỏ việc gửi mail mỗi lần 10 – 20 email, cách thực hiện chi tiết 

 

// Tạo 1 schedules hàng tháng
add_filter( 'cron_schedules', 'my_monthly_schedule' );
function my_monthly_schedule( $schedules ) {
    $schedules['monthly'] = array(
        'interval' => MONTH_IN_SECONDS, // ~30 days in seconds
        'display'  => __( 'Once Monthly' ),
    );
    return $schedules;
}

if ( ! wp_next_scheduled('my_monthly_event') ) {
    // Chạy lúc 00:00 ngày 1 của tháng kế tiếp
    $timestamp = strtotime('first day of next month 00:00:00');
    wp_schedule_event($timestamp, 'monthly', 'my_monthly_event');
}

// Hàm chạy hàng tháng
add_action( 'my_monthly_event', 'my_monthly_function' );
function my_monthly_function() {    

    // tạo cron chạy tức thì mỗi lần gửi 10 email, bạn có thể tăng giảm số này tùy thuộc vào độ mạnh yếu hosting của bạn
    $batch_size = 10;

    // Luôn khởi chạy từ offset = 0
    wp_schedule_single_event(time() + 5, 'my_monthly_batch', array(0, $batch_size));   
}

add_action( 'my_monthly_batch', 'my_monthly_batch_function', 10, 2);
function my_monthly_batch_function( $offset, $limit ){
    global $wpdb;

    // Code xử lý chia nhỏ task theo tham số truyền vào của bạn ở đây
    $table_usermeta = $wpdb->prefix . 'usermeta';
    $results = $wpdb->get_results(
        $wpdb->prepare( "SELECT user_id, meta_value as account_plant_a_tree 
         FROM $table_usermeta 
         WHERE `meta_key` = 'account_plant_a_tree' AND `meta_value` > 0 
         ORDER BY `meta_key` ASC
         LIMIT %d OFFSET %d "
        , $limit, $offset ) );

    // Nếu không còn data → kết thúc hoàn toàn        
    if (empty($results)) {
        return;
    }
    
    foreach ($results as $r) {
        // xu ly task của bạn ở đây, vd hanh động gửi mail

    }
    
    // Tạo batch tiếp theo
    $next_offset = $offset + $limit;
    wp_schedule_single_event(time() + 5, 'my_monthly_batch', array($next_offset, $limit));   

}

và theo tư duy này bạn có thể truyền bất kì tham số nào cho cron tiếp theo, chỉ cần bạn có điều kiện kết thúc để ngắt cron chạy tức thì 

Bài viết liên quan

post-no-image

Trang website có nhiều hiệu ứng hay đẹp tham khảo

post-no-image

Sửa lỗi phân trang khi custom query trong WP Query

post-no-image

Hàm preg_replace_callback() là gì? và ứng dụng trong WordPress

post-no-image

Hướng dẫn chuyển ảnh về định dạng Webp hay AVIF

post-no-image

Xử lý change status order Woocommerce khi refund từ Paypal

post-no-image

Hướng dẫn build lại ảnh hoặc media tải lên trong WordPress