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ì