Có một kiểu lỗi mà anh em làm WordPress gặp hoài nhưng ít khi gọi đúng tên: bài hẹn giờ 8h sáng mà 10h mới lên, email xác nhận đơn hàng tới trễ nửa tiếng, backup đặt lịch 2h đêm thì sáng ra chẳng thấy file nào. Vào site kiểm tra thì mọi thứ “bình thường”, không log lỗi, không plugin nào báo gì.
Thủ phạm gần như luôn là WP-Cron — thứ mà WordPress gọi là cron nhưng thực ra không phải cron.

Bài này mình đi đúng ba việc: hiểu WP-Cron hỏng ở đâu, tắt nó trong wp-config.php, rồi tạo một cron job thật ngay trong cPanel của hosting. Ảnh chụp và lệnh trong bài đều lấy từ màn hình thật, không phải ví dụ chép sách.
Để duy trì blog nên mình có làm aff cho 1 số bên hosting. Nhưng dù aff mình cũng chọn 1 số nhà cung cấp uy tín về chất lượng và support nên các bạn cứ yên tâm nhé.
Nếu có mua hosting mà có trong list dưới đây các bạn click vào link trước khi mua để ủng hộ mình nhé. Mình cảm ơn nhiều
- Azdigi: Giá rẻ thì dùng gói Pro Gold Hosting còn chất lượng hơn thì em khuyên dùng Business Hosting. Có điều kiện thì lên VPS nhé
- Tino hosting với mã giảm giá độc quyền lên tới 40%. Xem tại đây
- iNet
- Nước ngoài thì Vultr
WP-Cron thực ra không phải cron
Cron thật là một tiến trình của hệ điều hành, nằm sẵn trên server, cứ tới giờ là chạy — không quan tâm có ai ghé thăm website hay không.
WP-Cron thì khác hẳn. Mỗi lượt truy cập vào site, WordPress sẽ ngó qua danh sách công việc đã hẹn giờ; thấy có cái tới hạn thì nó tự gọi một request ngầm tới wp-cron.php để xử lý. Nói cách khác, lịch của bạn chạy bằng chân của khách.
Mà nó thì hỏng theo đúng hai hướng ngược nhau:
- Site ít khách thì trễ. Đêm không ai vào, không ai “bấm hộ” cái nút đó, nên bài hẹn 2h sáng nằm im tới lúc có người ghé vào buổi sáng.
- Site đông khách thì phí. Mỗi lượt truy cập là một lần kiểm tra, và mỗi lần gọi
wp-cron.phplại ngốn thêm một tiến trình PHP. Giờ cao điểm, tài nguyên đang hiếm, cron vẫn nhảy vào tranh chỗ với khách đang mua hàng. - Và nó nằm công khai.
wp-cron.phpai gọi cũng được. Gặp đứa rảnh rỗi dội liên tục vào đó là hosting è cổ ra chạy, dù site chẳng có khách thật nào.
Để anh em dễ hình dung khối lượng công việc đang chờ: mình đếm thử trên chính levantoan.com, ra 70 công việc đang xếp hàng — từ đồng bộ hàng hoá, quét bảo mật, dọn bản nháp, tới hàng đợi gửi mail. Bảy mươi việc đó đang trông chờ vào chuyện có người ghé site. 😅
Khi nào nên tắt, khi nào kệ nó cũng được
Mình không khuyên tắt bằng mọi giá. Nên chuyển sang cron của hosting khi site của anh em rơi vào một trong các nhóm sau:
- Có bán hàng, đặt lịch, gửi mail/SMS/Zalo tự động — tức là trễ giờ là mất tiền hoặc mất uy tín.
- Lượng truy cập lớn, hosting hay báo vượt tài nguyên.
- Ngược lại: site quá vắng khách nhưng vẫn cần việc chạy đúng giờ.
Còn blog cá nhân mỗi tuần đăng một bài, trễ vài chục phút cũng chẳng chết ai thì cứ để nguyên, khỏi phức tạp.
Bước 1: Tắt WP-Cron trong wp-config.php
Trong cPanel, vào File Manager → public_html, tìm file wp-config.php, bấm chuột phải chọn Edit. Ai quen FTP thì tải file về sửa rồi up lên cũng được.
Thêm dòng này vào trước dòng /* That's all, stop editing! Happy publishing. */:
define( 'DISABLE_WP_CRON', true );
Đặt sau dòng đó thì hằng số không có tác dụng, vì WordPress đã nạp xong phần cấu hình rồi. Anh em nào muốn xem thêm các hằng số hay dùng khác trong file này thì mình có bài riêng: các thông số trong file wp-config.php.
Có một chi tiết hay bị hiểu nhầm: hằng số này không xoá lịch, cũng không khoá file. Nó chỉ bảo WordPress “đừng tự gọi wp-cron.php mỗi lượt truy cập nữa”. Các công việc vẫn nằm nguyên trong hàng đợi, và wp-cron.php vẫn gọi được từ bên ngoài — đó chính là cánh cửa để cron của hosting đi vào ở bước sau.
⚠️ Tắt xong mà chưa tạo cron thay thế là nguy hiểm nhất: không có lỗi nào hiện ra, chỉ là mọi thứ lặng lẽ ngừng chạy. Bài hẹn giờ không lên, backup không chạy, WooCommerce thì hàng đợi Action Scheduler đứng im. Nên làm liền bước 2 trong cùng một buổi.
Bước 2: Tạo cron job trong cPanel
Đăng nhập cPanel, vào mục Advanced → Cron Jobs. Màn hình này chia hai phần: phần tạo mới ở trên, danh sách cron đang có ở dưới.
Chọn tần suất bao nhiêu phút
Nguyên tắc của mình: lấy theo việc gấp nhất trên site, đừng lấy theo cảm giác.
- 15 phút — blog, site giới thiệu, không có gì gấp.
- 5 phút — mặc định nên dùng cho đa số site. Bài hẹn giờ lên trễ nhiều nhất 5 phút, đủ tốt cho gần như mọi nhu cầu.
- 1 phút — chỉ dành cho shop có hàng đợi thật sự: đẩy đơn sang hãng vận chuyển, gửi tin nhắn, đồng bộ kho.
Lưu ý là nhiều nhà cung cấp giới hạn tần suất tối thiểu, thường 5 hoặc 15 phút. Đặt 1 phút mà host chặn thì cron im luôn chứ không báo lỗi gì — nên cứ chọn 5 phút cho lành, vừa an toàn vừa đủ dùng.
Điền form và lưu lại
Ở ô Common Settings, chọn Once Per Five Minutes — chọn xong cPanel tự điền */5 * * * * vào năm ô bên dưới, khỏi phải nhớ cú pháp. Rồi dán lệnh này vào ô Command, nhớ thay tên miền của anh em vào:
wget -q -O - https://ten-mien-cua-ban.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Lệnh nhìn rối vậy thôi chứ tách ra thì đơn giản:
wget -q— gọi URL ở chế độ im lặng, không in tiến trình tải.-O -— đẩy kết quả ra màn hình thay vì lưu thành file rác trong thư mục home.?doing_wp_cron— tham số WordPress dùng để nhận diện lượt gọi cron, đồng thời giúp lượt gọi này không bị cache trang phục vụ bản cũ.>/dev/null 2>&1— vứt toàn bộ output lẫn thông báo lỗi đi, để cron khỏi gửi email mỗi 5 phút. Thiếu đoạn này là hộp thư đầy trong một ngày.
Bấm Add New Cron Job, cron sẽ hiện ngay ở bảng Current Cron Jobs bên dưới. Nhìn thấy dòng này là xong:

Host nào chặn wget thì đổi sang curl, tác dụng y hệt:
curl -s https://ten-mien-cua-ban.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Anh em nào muốn hiểu kỹ hơn mấy tham số của wget thì xem bài dùng wget trên hosting mình viết trước đây.
Bước 3: Kiểm tra cron đã chạy thật hay chưa
Thấy dòng cron nằm trong bảng mới chỉ chứng minh anh em lưu thành công, chưa chứng minh nó chạy được. Kiểm một lượt cho chắc, có ba cách từ nhanh tới chắc ăn.
Cách 1: Tạm bật email để nhìn thấy cron chạy
Ngay đầu trang Cron Jobs có ô Cron Email. Điền email của anh em vào đó, rồi sửa lệnh cron bỏ tạm đoạn >/dev/null 2>&1 ở cuối. Chờ qua một nhịp (5 phút), có mail về là cron đang chạy thật.

Kiểm xong nhớ trả lại đoạn >/dev/null 2>&1, không thì cứ 5 phút một mail, một ngày gần 300 cái. 😄
Cách 2: Nhìn danh sách công việc trong trang quản trị
Cài plugin WP Crontrol, vào Công cụ → Cron Events. Cột thời gian chạy kế tiếp cho biết mọi thứ: nếu có công việc treo quá hạn hàng giờ mà không nhúc nhích thì cron chưa chạy. Sau khi cron hoạt động, các mốc thời gian sẽ trôi đều và không còn việc nào quá hạn lâu.
Cách 3: Thử bằng chính việc mình cần
Cách thật nhất: viết một bài nháp bất kỳ, hẹn giờ đăng sau 10 phút rồi đi pha cốc cà phê. Quay lại thấy bài đã lên đúng giờ là xong — đó chính là thứ anh em cần, chứ không phải một dòng thông báo màu xanh ở đâu đó.
Mấy lỗi hay gặp
- Tắt rồi quên tạo cron. Lỗi kinh điển và im lặng nhất. Làm xong bước 1 thì làm luôn bước 2.
- Đặt 1 phút trong khi host chỉ cho 15 phút. Cron không chạy mà cũng chẳng báo gì. Xem lại quy định của nhà cung cấp hoặc hỏi support trước khi nghi ngờ WordPress.
- Quên
>/dev/null 2>&1. Hộp thư nhận mail mỗi 5 phút, vài hôm là không ai dám mở mail nữa. - Để cache trang nuốt mất lượt gọi. Nếu dùng plugin cache mạnh tay, nhớ loại
wp-cron.phpra khỏi cache, không thì cron chỉ nhận lại bản lưu sẵn và chẳng việc gì được chạy. - Đặt cron ở hai nơi. Vừa cron trong cPanel vừa thuê dịch vụ cron bên ngoài gọi cùng một URL — mọi việc chạy hai lần, khách nhận hai email xác nhận cho một đơn.
- Dùng
ALTERNATE_WP_CRONcho nhanh. Cách này bắt khách tự chuyển hướng kèm tham số?doing_wp_crontrên URL. Chỉ nên dùng khi hosting chặn request nội bộ, còn lại thì cron thật vẫn sạch hơn nhiều.
Câu hỏi thường gặp
Tắt WP-Cron có mất lịch đăng bài không?
Không. Lịch vẫn nằm nguyên trong cơ sở dữ liệu. Chỉ là phải có ai đó gọi chúng dậy đúng giờ — và đó là việc của cron job mình vừa tạo trong cPanel.
Hosting chỉ cho đặt cron 15 phút một lần thì sao?
Vẫn tốt hơn WP-Cron nhiều, vì ít nhất nó chạy đều đặn kể cả lúc không có khách. Nhưng nếu site có đơn hàng cần xử lý gấp từng phút thì nên cân nhắc đổi sang gói cao hơn.
WooCommerce có cần thiết lập gì thêm không?
Không cần. Action Scheduler mà WooCommerce dùng để đẩy đơn, gửi mail, đồng bộ kho cũng ăn theo hệ thống cron này. Cron chạy đều thì hàng đợi của Woo trôi đều theo.
Có cần gỡ cron cũ khi chuyển hosting không?
Có. Chuyển site sang nơi khác mà cron ở host cũ còn sống thì nó vẫn gọi vào tên miền — tạo ra những lượt chạy trùng rất khó lần ra. Dọn luôn cho gọn.
Tóm lại
Ba việc thôi: thêm DISABLE_WP_CRON vào wp-config.php, tạo một cron job 5 phút trong cPanel, rồi kiểm tra lại bằng email hoặc bằng một bài hẹn giờ. Mất chừng mười phút, đổi lại là lịch chạy đúng giờ và hosting bớt gánh một việc vô duyên.
Anh em làm xong thấy site nhẹ hơn hay gặp trục trặc chỗ nào thì để lại bình luận bên dưới, mình xem rồi trả lời. Chúc anh em cron chạy ngon lành! 🚀





