Thay WP-Cron bằng Cron Job giúp các tác vụ nền của WordPress chạy đều hơn, không phụ thuộc hoàn toàn vào lượt truy cập. Cách làm này phù hợp với website có lịch đăng bài, gửi email, sao lưu, đồng bộ dữ liệu hoặc nhiều tác vụ WooCommerce cần thực thi đúng thời điểm.
WP-Cron không phải tiến trình cron chạy liên tục của Linux. Theo tài liệu WordPress, hệ thống chỉ kiểm tra hàng đợi khi website có page load. Website ít truy cập có thể chạy tác vụ trễ, còn website nhiều truy cập có thể tạo thêm request kiểm tra không cần thiết. Bài này hướng dẫn cấu hình trên cPanel, DirectAdmin và VPS Linux, có backup, kiểm tra và rollback rõ ràng.
Chỉ tắt WP-Cron mặc định sau khi đã tạo một Cron Job thay thế. Nếu tắt trước nhưng chưa cấu hình lịch hệ thống, bài viết hẹn giờ, email và các tác vụ nền có thể không chạy.
WP-Cron hoạt động như thế nào?
WordPress lưu các sự kiện đã lên lịch trong database. Mỗi khi có lượt truy cập, WordPress kiểm tra sự kiện nào đã đến hạn rồi gọi wp-cron.php để xử lý.
Khách truy cập → WordPress kiểm tra lịch → wp-cron.php → Chạy tác vụ đến hạn
Cơ chế này có ưu điểm là hoạt động trên cả shared hosting không cho truy cập cron hệ thống. Tuy nhiên, thời điểm chạy không tuyệt đối chính xác:
- Website ít traffic có thể không kích hoạt WP-Cron đúng giờ;
- Website nhiều traffic phải lặp lại bước kiểm tra lịch trên nhiều request;
- Tác vụ nặng có thể làm request nền kéo dài hoặc bị timeout;
- Cache toàn trang, firewall hoặc loopback request lỗi có thể làm lịch chạy không ổn định;
- Plugin tạo sự kiện trùng có thể khiến tùy chọn
crontrong database tăng bất thường.

Khi nào nên thay WP-Cron bằng Cron Job?
Bạn nên cân nhắc thay WP-Cron bằng Cron Job khi website có một hoặc nhiều dấu hiệu sau:
- Bài viết hẹn giờ thường xuyên báo “Missed schedule”;
- Email, backup hoặc đồng bộ kho chạy chậm so với lịch;
- WooCommerce có nhiều tác vụ Action Scheduler bị pending;
- Website chạy trên VPS hoặc hosting cho phép tạo Cron Job;
- Website có traffic lớn và muốn giảm việc kiểm tra WP-Cron trên từng page load;
- Site Health báo lỗi scheduled event hoặc loopback request.
Website nhỏ, ít tác vụ và không có quyền tạo Cron Job vẫn có thể giữ cơ chế mặc định. Không cần thay đổi chỉ để chạy theo một “mẹo tối ưu” nếu hệ thống hiện tại ổn định.
Chuẩn bị trước khi tắt WP-Cron WordPress
Trước khi chỉnh wp-config.php, hãy xác định đúng thư mục cài WordPress và tài khoản sở hữu website. Với VPS, Cron Job nên chạy bằng user của website, không nên dùng root nếu không có lý do đặc biệt.
Checklist chuẩn bị:
- Có quyền sửa
wp-config.phpvà tạo Cron Job; - Biết đường dẫn tuyệt đối đến thư mục WordPress;
- Đã backup file cấu hình;
- Đã ghi lại các sự kiện cron hiện tại;
- Xác định lệnh
phphoặcwpđang hoạt động; - Chọn chu kỳ phù hợp, thường là 5 phút.
Nếu chưa có WP-CLI, bạn có thể tham khảo bài Hướng dẫn cài đặt WP-CLI trên máy chủ Linux.
Bước 1: Kiểm tra sự kiện WP-Cron hiện tại
Nếu có WP-CLI, liệt kê các sự kiện và thời gian chạy tiếp theo:
cd /duong-dan/toi/public_html
wp cron event list --fields=hook,next_run_gmt,next_run_relative,recurrence --format=table
Kiểm tra khả năng gọi WP-Cron:
wp cron test
wp cron test thành công cho biết WordPress có thể khởi tạo một request tới hệ thống cron. Nếu lệnh báo lỗi, cần xử lý DNS, SSL, firewall hoặc loopback request trước khi tiếp tục.
Bạn cũng có thể chạy thử các sự kiện đã đến hạn:
wp cron event run --due-now
Lệnh trên có thể kích hoạt email, đồng bộ hoặc tác vụ plugin đang chờ. Chỉ chạy khi bạn đã hiểu phạm vi ảnh hưởng.

Bước 2: Backup file wp-config.php
Tạo bản sao có timestamp trước khi chỉnh sửa:
cd /duong-dan/toi/public_html
cp -a wp-config.php "wp-config.php.backup-$(date +%Y%m%d-%H%M%S)"
Xác nhận file backup đã tồn tại:
ls -lh wp-config.php wp-config.php.backup-*
Không đặt bản backup trong thư mục public lâu dài nếu web server có thể phục vụ file đó. Sau khi kiểm tra hoàn tất, nên chuyển backup ra ngoài document root hoặc lưu trong hệ thống backup của hosting.
Bước 3: Tắt cơ chế WP-Cron theo page load
Mở wp-config.php và thêm dòng sau trước dòng /* That's all, stop editing! */:
define( 'DISABLE_WP_CRON', true );
Nếu hằng số đã tồn tại, chỉ giữ một khai báo. Hai dòng define() cho cùng một hằng số có thể tạo cảnh báo PHP.
Kiểm tra giá trị bằng WP-CLI:
wp config get DISABLE_WP_CRON
Kết quả mong đợi là true. Bước này chỉ ngăn WordPress tự kích hoạt cron theo lượt truy cập; các sự kiện đã lên lịch trong database không bị xóa.
Bước 4: Tạo Cron Job bằng WP-CLI trên VPS
WP-CLI là lựa chọn tốt trên VPS vì lệnh chạy trực tiếp trong WordPress, không phụ thuộc HTTP, DNS hoặc SSL. Mẫu dưới đây chạy sự kiện đến hạn mỗi 5 phút:
*/5 * * * * cd /home/USER/domains/example.com/public_html && /usr/local/bin/wp cron event run --due-now --quiet >/dev/null 2>&1
Thay USER, domain và đường dẫn WP-CLI theo máy chủ thực tế. Kiểm tra đường dẫn trước khi lưu:
command -v wp
pwd
Nếu server có nhiều phiên bản PHP, có thể gọi rõ PHP binary:
*/5 * * * * cd /home/USER/domains/example.com/public_html && /usr/local/bin/php /usr/local/bin/wp cron event run --due-now --quiet >/dev/null 2>&1
Tạo Cron Job bằng đúng user sở hữu website. Không dùng sudo, không chèn mật khẩu và không ghi credential vào crontab.
Bước 5: Tạo Cron Job trên cPanel hoặc DirectAdmin
Cấu hình trên cPanel
Mở Cron Jobs, chọn chu kỳ Once Per 5 Minutes rồi nhập một trong hai lệnh sau.
Ưu tiên WP-CLI nếu hosting hỗ trợ:
cd /home/CPANEL_USER/public_html && /usr/local/bin/wp cron event run --due-now --quiet >/dev/null 2>&1
Phương án gọi HTTP khi không có WP-CLI:
/usr/bin/curl -fsS "https://example.com/wp-cron.php?doing_wp_cron" >/dev/null 2>&1
Cấu hình trên DirectAdmin
Mở Advanced Features → Cron Jobs, đặt phút là */5, các trường còn lại là *, sau đó nhập lệnh:
cd /home/DA_USER/domains/example.com/public_html && /usr/local/bin/wp cron event run --due-now --quiet >/dev/null 2>&1
Đường dẫn PHP, cURL hoặc WP-CLI có thể khác giữa các nhà cung cấp. Không sao chép nguyên đường dẫn mẫu nếu chưa kiểm tra.

Bước 6: Kiểm tra Cron Job sau khi cấu hình
Chờ ít nhất một chu kỳ rồi kiểm tra các sự kiện tiếp theo:
wp cron event list --fields=hook,next_run_gmt,next_run_relative,recurrence --format=table
Chạy kiểm tra thủ công bằng chính lệnh đã đặt trong Cron Job:
cd /duong-dan/toi/public_html
/usr/local/bin/wp cron event run --due-now
Các dấu hiệu cấu hình đúng:
- Lệnh không báo lỗi PHP hoặc đường dẫn;
- Sự kiện đến hạn được thực thi;
- Thời gian
next_runcủa sự kiện định kỳ được cập nhật; - Bài viết hẹn giờ xuất bản đúng thời điểm;
- Email, backup và đồng bộ của plugin tiếp tục hoạt động;
- Error log không xuất hiện lỗi mới liên quan
wp-cron.php.
Trong 24 giờ đầu, nên tạm thời ghi log để phát hiện lỗi:
*/5 * * * * cd /home/USER/domains/example.com/public_html && /usr/local/bin/wp cron event run --due-now >> /home/USER/wp-cron.log 2>&1
Sau khi xác nhận ổn định, đổi lại >/dev/null 2>&1 để tránh file log tăng dung lượng.
Bước 7: Chọn chu kỳ Cron Job phù hợp
Chu kỳ 5 phút phù hợp với phần lớn website. Chạy mỗi phút không làm tác vụ tự động nhanh hơn nếu plugin chỉ lên lịch theo giờ, nhưng có thể tăng số lần khởi tạo WordPress.
Gợi ý thực tế:
- Mỗi 5 phút: Website bán hàng, bài hẹn giờ hoặc đồng bộ thường xuyên;
- Mỗi 10 phút: Website nội dung thông thường;
- Mỗi 15 phút: Website nhỏ, ít tác vụ và không cần chính xác từng phút;
- Mỗi 1 phút: Chỉ dùng khi ứng dụng thật sự yêu cầu và máy chủ đủ tài nguyên.
Thay WP-Cron bằng Cron Job không giải quyết được plugin viết tác vụ chậm, sự kiện trùng hoặc database quá tải. Nếu cron vẫn chạy lâu, cần xác định hook gây lỗi thay vì tiếp tục tăng tần suất.
Các lỗi thường gặp và cách xử lý
Lỗi wp: command not found
Cron có biến môi trường PATH hạn chế hơn phiên SSH. Hãy dùng đường dẫn tuyệt đối lấy từ:
command -v wp
command -v php
command -v curl
Cron Job chạy nhưng WordPress không xử lý tác vụ
Kiểm tra đúng document root, quyền file, PHP binary và URL website. Với multisite, WP-CLI có thể cần tham số --url để chỉ đúng site:
wp cron event run --due-now --url=https://example.com
Website báo Missed schedule
Kiểm tra sự kiện bằng WP-CLI và đối chiếu timezone WordPress. Bài Xử lý lỗi lên lịch bài viết trên WordPress có thêm các bước kiểm tra plugin và lịch xuất bản.
Cron chạy chồng tiến trình
WP-CLI wp cron event run --due-now tôn trọng transient doing_cron để hạn chế chạy chồng. Tuy nhiên, tác vụ plugin quá lâu vẫn có thể gây hàng đợi. Khi đó cần giảm tần suất, tối ưu hook hoặc dùng cơ chế khóa phù hợp ở cấp ứng dụng.
Cách rollback về WP-Cron mặc định
Nếu Cron Job hệ thống không ổn định, rollback theo thứ tự:
- Xóa hoặc vô hiệu hóa Cron Job đã tạo trên panel/crontab;
- Xóa dòng
DISABLE_WP_CRONhoặc đổi giá trị thànhfalse; - Xóa cache opcode nếu hosting yêu cầu;
- Truy cập website và kiểm tra lại bằng
wp cron test; - Xác nhận bài hẹn giờ và tác vụ plugin tiếp tục hoạt động.
Khôi phục file backup khi cần:
cp -a wp-config.php.backup-YYYYMMDD-HHMMSS wp-config.php
Không xóa các sự kiện trong database khi rollback. Việc thay WP-Cron bằng Cron Job chỉ thay đổi cách kích hoạt hàng đợi, không yêu cầu tạo lại lịch của plugin.
Câu hỏi thường gặp
Có nên tắt WP-Cron trên mọi website không?
Không. Chỉ nên tắt khi đã có Cron Job thay thế và có khả năng kiểm tra nó. Website shared hosting không hỗ trợ cron vẫn nên giữ cơ chế mặc định.
Gọi wp-cron.php bằng cURL hay WP-CLI tốt hơn?
WP-CLI phù hợp hơn trên VPS vì chạy trực tiếp, không phụ thuộc DNS, SSL và HTTP. cURL dễ triển khai trên hosting nhưng cần URL công khai hoạt động ổn định.
Tần suất 5 phút có làm server quá tải không?
Thông thường không, vì lệnh chỉ chạy sự kiện đến hạn. Tuy nhiên, plugin có tác vụ nặng hoặc hàng đợi lớn vẫn có thể dùng nhiều CPU, RAM và database.
DISABLE_WP_CRON có xóa lịch cũ không?
Không. Hằng số này chỉ ngăn WordPress kích hoạt WP-Cron theo page load. Danh sách sự kiện vẫn nằm trong database.
Kết luận
Thay WP-Cron bằng Cron Job là bước tối ưu hợp lý khi WordPress chạy trên VPS hoặc hosting có trình lập lịch. Cấu hình tốt giúp bài viết hẹn giờ và tác vụ nền chạy đều hơn, đồng thời giảm việc kiểm tra WP-Cron trên từng page load.
Quy trình an toàn là kiểm tra sự kiện, backup wp-config.php, tạo Cron Job thay thế, sau đó mới bật DISABLE_WP_CRON. Hãy theo dõi ít nhất 24 giờ và giữ phương án rollback để tránh bỏ sót email, backup hoặc tác vụ WooCommerce quan trọng.
