Wordpress

WordPress Cron Jobs

Hiểu về WordPress Cron Jobs

Cron Job là gì
Nói một cách đơn giản, cron job là một tác vụ được thiết lập để chạy trong một khoảng thời gian xác định. Nói chung, nó có sẵn trên hệ thống dựa trên Linux hoặc Unix (bao gồm OS X).
Vì vậy, nếu bạn đang tìm cách thực hiện một lệnh nhất định nhiều lần trong ngày, một thời điểm nhất định trong ngày, một thời điểm nhất định trong tuần, tháng hoặc bất kỳ điều gì khác, thì đây là những gì bạn sử dụng.

Thế nào là WordPress Cron Jobs?
Khi nói đến WordPress, bạn có thể lên lịch một sự kiện xảy ra vào một khoảng thời gian nhất định, nhưng nó không hoạt động giống như một cron thông thường.

Thay vào đó, cron được thiết lập và lên lịch và ghi vào cơ sở dữ liệu. Lần tiếp theo khi người dùng truy cập trang web, hệ thống cron của WordPress sẽ xem xét liệu một cron có được lên lịch hay không và nếu có thì nó sẽ kích hoạt sự kiện đó.

Vấn đề ở đây là gì ?
Ai đó phải truy cập trang web trước khi sự kiện thực sự bắt đầu. Vì vậy, nếu bạn đã lên lịch một điều gì đó diễn ra hàng giờ, nhưng không ai truy cập trang web của bạn trong một giờ qua, thì sự kiện sẽ không bao giờ bắt đầu.

Nếu bạn có một trang web đang hoạt động, thì đây không phải là vấn đề, nhưng nếu bạn đang xây dựng một plugin cần thực thi một số mã mỗi giờ, ngày, tuần, tháng hoặc bất cứ điều gì thì sử dụng cron WordPress mặc định hệ thống không phải là một ý tưởng hay.

Cách khắc phục
1 – Vô hiệu hóa WP Cron System
2 – Thiết lập `wp_schedule_event` trong plugin hoặc trong `functions.php`
3 – Tạo cron job chạy tự động

1. Vô hiệu hóa WP Cron System
Trong file wp-config.php thêm dòng :

define('DISABLE_WP_CRON', true);

2. Tạo một Event Code
1 – Trước tiên, xác định một sự kiện được chạy hàng giờ và đặt tên cho nó :

add_action( 'my_hourly_event', 'update_db_hourly' );

function để chạy sẽ là ‘update_db_hourly’
2 – Viết code cho function
Nếu trong plugin thì ta cần viết như sau :

public static function activate() {
wp_schedule_event( time(), 'hourly', 'my_hourly_event' );
}

public static function deactivate() {
wp_clear_scheduled_hook('my_hourly_event');
}

Đoạn code trên có ý nghĩa :
Khi active plugin thì sẽ đăng ký event cron này vào db, và khi ta không dùng plugin nữa thì xóa nó đi. và cron này sẽ được chạy hàng giờ.
Cuối cùng viết code cho function cần chạy :

public function update_db_hourly() {
// code
}

NOTE :
Hiểu về thời gian chạy cron của WordPress sẽ khác với bình thường, ví dụ ta set thời gian là hourly, daily, weekly với mốc thời gian cố định thì WordPress sẽ hiểu mốc thời gian kia là khoảng thời gian cron lần tiếp theo sẽ chạy.
Lấy ví dụ ta set
wp_schedule_event( strtotime('16:00:00'), 'daily', 'my_hourly_event' );
Ở đây ta phải hiểu : Cron này sẽ chạy hàng ngày và thời gian đến lần chạy tiếp theo sẽ là 16 tiếng, Đây là sự khác biệt của cron WordPress
Để có thể chạy cron vào đúng thời gian cố định ta phải có cách tính toán riêng, tuy nhiên thì chúng ta có thể sử dụng plugin tên là WP Crontrol, plugin này sẽ giúp chúng ta giải quyết vấn đề về time chạy của cron
https://vi.wordpress.org/plugins/wp-crontrol/

Sau khi setup mọi thứ xong ta cần setup cron chạy tự động bằng cách truy cập vào server bằng command line sau đó sử dụng lệnh :

crontab -e

Sau đó thêm dòng dưới vào :

*/15 * * * * wget -q -O - http://yourdomain.com/wp-cron.php?doing_wp_cron

Thay http://yourdomain.com bằng trang web của mình
Với câu lệnh trên sẽ kích hoạt cứ sau 15 phút sẽ tạo ra một yêu cầu đến trang web WordPress và chạy bất kỳ tác vụ đã lên lịch nào nếu đủ điều kiện.

Các link tham khảo :
http://www.nextscripts.com/tutorials/wp-cron-scheduling-tasks-in-wordpress/
http://www.iceablethemes.com/optimize-wordpress-replace-wp_cron-real-cron-job/
http://www.smashingmagazine.com/2013/10/16/schedule-events-using-wordpress-cron/
http://codex.wordpress.org/Plugin_API/Filter_Reference/cron_schedules
http://www.viper007bond.com/2011/12/14/how-to-create-custom-wordpress-cron-intervals/
http://www.sitepoint.com/mastering-wordpress-cron/
https://tommcfarlin.com/wordpress-cron-jobs/
http://www.paulund.co.uk/create-cron-jobs-in-wordpress