WP-Cron (wp-cron.php): Menonaktifkan dan Mengatur Cron Sistem | Optimasi Performa WordPress

Di WordPress, Cron job adalah fitur yang otomatis menjalankan tugas yang dijadwalkan pada waktu atau tanggal tertentu. Cron job berjalan lewat file wp-cron.php, dan WordPress memanggil file ini setiap kali halaman dimuat untuk memproses tugas terjadwal. Cara ini praktis, tetapi di situs dengan lalu lintas tinggi dapat menurunkan performa.
Ⅰ. Proses Eksekusi WP-Cron dan Masalah Performanya
Alih-alih memakai sistem Cron tradisional milik server Linux, WordPress menyediakan fitur Cron sendiri, yaitu WP-Cron. WP-Cron bekerja lewat file wp-cron.php: ⓐ setiap kali pengguna mengunjungi situs, ia memeriksa apakah ada tugas terjadwal lalu menjalankannya, dan ⓑ plugin seperti Rank Math dan WP Rocket menjalankan tugas berkala yang mereka jadwalkan sendiri.
Sebaliknya, di situs dengan lalu lintas tinggi, wp-cron.php bisa dipanggil terlalu sering sehingga membebani server. Terutama saat banyak pengguna terhubung bersamaan, cron job yang sama berjalan berulang kali, dan ini dapat menyebabkan penggunaan CPU meningkat, respons melambat, kecepatan muat halaman menurun dan masalah lainnya.
Batasan struktural WP-Cron ini dapat menurunkan performa WordPress, dan khususnya di situs yang menuntut performa tinggi, toko online, atau portal berita bisa menimbulkan bottleneck yang serius.
🔄 Cara Kerja dan Struktur WP-Cron
Ⅱ. Optimasi Performa WordPress
Ada banyak cara mengoptimalkan performa WordPress. Setelah mengoptimalkan caching, frontend, database, dan lainnya, Anda bisa meningkatkannya lagi lewat pengaturan WP-Cron.
Setiap kali halaman WordPress dimuat, event terjadwal diperiksa, dan karena adanya tugas berkala dari plugin, WP-Cron yang tidak efisien ini perlu dimanfaatkan dengan lebih efisien.
1️⃣ Menguji WP-Cron
Saat memeriksa cron job dengan WP-CLI, terlihat Cron yang aktif sedang berjalan. Plugin seperti Rank Math dan WP Rocket terlihat menjalankan tugas terjadwal setiap hari atau setiap beberapa menit.

2️⃣ Cara Mengatur WP-Cron
WP-Cron adalah penjadwal virtual yang menangani tugas terjadwal WordPress, dan wp-cron.php berjalan saat pengguna berkunjung. Namun eksekusi berbasis lalu lintas tidak stabil dan pemanggilan berlebihan bisa membebani server, sehingga biasanya dilengkapi dengan cron sistem.
Bila perlu, cara yang disarankan adalah mengatur DISABLE_WP_CRON di wp-config.php untuk mematikan WP-Cron, lalu menjalankannya secara berkala dengan cron Linux.
|
Item |
Nonaktifkan WP-Cron + jalankan hanya cron sistem |
|---|---|
|
Pengaturan |
Matikan WP-Cron dan jalankan wp-cron.php dari cron sistem |
|
Kelebihan |
Tidak ada eksekusi ganda, bisa berjalan tepat waktu, dan beban server rendah |
|
Kekurangan |
Sebagian fitur plugin bisa berhenti, dan salah pengaturan berisiko membuat tugas terlewat |
|
Rekomendasi · Situasi |
Cocok untuk situs dengan lalu lintas tinggi dan banyak tugas terjadwal |
Namun, cara ① punya kekurangan: fitur PreLoad pada plugin cache seperti WP Rocket, yang setiap 1 menit membuat cache lebih dulu sebelum pengunjung datang ke halaman, ikut nonaktif.
⚙️ Mengedit File wp-config.php
Anda bisa mengaturnya dengan menonaktifkan WP_CRON.
# Nonaktifkan WP_CRON
define( 'DISABLE_WP_CRON', true );Saat WP-Cron sedang berjalan, WP_CRON_LOCK_TIMEOUT berperan sebagai [kunci berbasis waktu] yang mencegah percobaan eksekusi lain.
# 5 menit = 300, jalankan tiap 60 menit = 3600
define('WP_CRON_LOCK_TIMEOUT', 300);Karena alasan ini, alih-alih hanya menonaktifkan WP-Cron di file wp-config.php, cara yang disarankan adalah menonaktifkannya lalu menambahkan tugas System Cron seperti yang juga diterapkan di server yang saat ini dikelola.
⚙️ Mengaktifkan Cron Sistem di Server Linux [Dasar]
Bisa diaktifkan per domain.
# Jalankan tiap 5 menit
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Jalankan tiap 30 menit
*/30 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Jalankan tiap 1 jam
0 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Jalankan sekali sehari
0 3 * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1Empat baris di atas adalah contoh per interval yang didaftarkan di crontab; pada setiap waktu yang ditentukan, curl memanggil alamat [wp-cron.php] sehingga tugas terjadwal tetap berjalan meski tidak ada pengunjung.
# Jika servernya adalah server lokal
*/5 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Jalankan tiap 30 menit
*/30 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Jalankan tiap 1 jam
0 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Jalankan sekali sehari
0 3 * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1Jika WP-CLI sudah terpasang, cukup atur satu baris dengan interval yang diinginkan. ▼
# Jalankan tiap 5 menit
*/5 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Jalankan tiap 30 menit
*/30 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Jalankan tiap 1 jam
0 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Jalankan sekali sehari
0 3 * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quietPengaturan ini membuat WP-CLI di dalam server hanya menjalankan tugas terjadwal yang sudah jatuh tempo dengan opsi [--due-now], dan [flock -n] melewati eksekusi baru jika eksekusi sebelumnya belum selesai.
⚙️ WP-CLI dan Cron Sistem 1 Menit serta Mencegah Duplikasi Cron Job
Secara bawaan, WP_CRON akan mengabaikan (melewati) tugas saat beban kerja banyak lalu menjalankannya lagi nanti. Matikan WP-Cron bawaan dan atur tugas terjadwal agar menahan kunci 5 menit, sehingga cron sistem dan WP-Cron tidak berjalan bersamaan.
define('DISABLE_WP_CRON', true); // Matikan eksekusi otomatis WP-Cron
define('WP_CRON_LOCK_TIMEOUT', 300); // Tanpa menunggu → dilewati; kunci 5 menit saat tugas terjadwal berjalan
/* That's all, stop editing! Happy publishing. */Tambahkan opsi flock -n pada cron sistem agar di sisi cron sistem eksekusi langsung berhenti.
# Pengaturan wp cron: flock -n → tanpa menunggu → langsung berhenti
*/1 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quietHasil dari kombinasi pengaturan di atas:
- Eksekusi otomatis internal WP mati → tugas terjadwal berjalan tanpa bergantung pada jumlah pengunjung
- Cron sistem mencoba berjalan setiap 1 menit → jika ada tugas terjadwal, tugas itu dijalankan
- Saat terkunci, tidak dijalankan ulang selama 5 menit → mencegah eksekusi ganda (dengan pengaturan flock -n, WP_CRON_LOCK_TIMEOUT sebenarnya tidak terlalu diperlukan.)
Dengan pencegahan eksekusi ganda, alur kerjanya sebenarnya seperti ini:
- 08:00 → cron sistem memanggil wp-cron.php
- Tugas terjadwal A berjalan → kunci 5 menit dipasang
- 08:01 → cron sistem memanggil lagi
- Tugas A masih terkunci → tidak dijalankan
- 08:02–08:04 → sama
- 08:05 → kunci terbuka → jika ada tugas terjadwal berikutnya, tugas itu dijalankan
Alih-alih WordPress menjalankannya secara otomatis, sistemlah yang bertanggung jawab menjalankannya. Lalu WP_CRON_LOCK_TIMEOUT berfungsi sebagai pengaman cadangan yang mencegah eksekusi ganda.
|
Item |
WP_CRON_LOCK_TIMEOUT |
flock -n |
|---|---|---|
|
Jenis kunci |
Di dalam WordPress |
Tingkat sistem |
|
Lokasi kunci |
Berbasis DB: doing_cron di wp_options |
Berbasis file sistem: ~/.wp_cron.lock |
|
Menunggu? |
❌ Tidak menunggu → dilewati |
❌ Tidak menunggu → langsung berhenti |
|
Pencegahan eksekusi ganda |
✅ Mencegah eksekusi ganda |
✅ Mencegah eksekusi ganda |
Setelah selesai, Anda bisa memeriksanya dengan perintah WP-CLI. Pastikan cron tetap berjalan seperti sebelumnya.
wp cron event list+-------------------------------------------+---------------------+-----------------------+---------------+
| hook | next_run_gmt | next_run_relative | recurrence |
+-------------------------------------------+---------------------+-----------------------+---------------+
| rocket_saas_pending_jobs | 2026-10-17 12:00:57 | now | 1 minute |
| action_scheduler_run_queue | 2026-10-17 12:00:57 | now | 1 minute |
| action_scheduler_run_queue_rucss | 2026-10-17 12:00:58 | now | 1 minute |
| rocket_saas_on_submit_jobs | 2026-10-17 12:00:58 | now | 1 minute |
| rocket_preload_process_pending | 2026-10-17 12:00:59 | now | 1 minute |
| rocket_purge_time_event | 2026-10-17 12:16:59 | 15 minutes 8 seconds | 1 hour |
| wp_privacy_delete_old_export_files | 2026-10-17 12:28:46 | 26 minutes 55 seconds | 1 hour |
| wp_update_user_counts | 2026-10-17 20:15:52 | 8 hours 14 minutes | 12 hours |
| rocket_preload_revert_old_failed_rows | 2026-10-17 20:17:59 | 8 hours 16 minutes | 12 hours |
| wp_version_check | 2026-10-17 20:28:34 | 8 hours 26 minutes | 12 hours |
| wp_update_plugins | 2026-10-17 20:58:34 | 8 hours 56 minutes | 12 hours |
| wp_update_themes | 2026-10-17 21:28:34 | 9 hours 26 minutes | 12 hours |
| recovery_mode_clean_expired_keys | 2026-10-18 07:28:46 | 19 hours 26 minutes | 1 day |
| wp_privacy_personal_data_cleanup_requests | 2026-10-18 07:28:46 | 19 hours 26 minutes | 1 day |
| wp_scheduled_delete | 2026-10-18 08:15:52 | 20 hours 14 minutes | 1 day |
| delete_expired_transients | 2026-10-18 08:15:52 | 20 hours 14 minutes | 1 day |
| wp_scheduled_auto_draft_delete | 2026-10-18 08:15:54 | 20 hours 14 minutes | 1 day |
| wp_delete_temp_updater_backups | 2026-10-18 08:16:17 | 20 hours 14 minutes | 1 week |
| rocket_update_dynamic_lists | 2026-10-18 08:16:57 | 20 hours 15 minutes | 1 week |
| rocket_saas_clean_rows_time_event | 2026-10-18 08:16:57 | 20 hours 15 minutes | 1 week |
| rocket_performance_hints_cleanup | 2026-10-18 08:16:58 | 20 hours 15 minutes | 1 day |
| rocket_preload_clean_rows_time_event | 2026-10-18 08:26:57 | 20 hours 25 minutes | 1 week |
| rocket_database_optimization_time_event | 2026-10-18 09:34:25 | 21 hours 32 minutes | 1 day |
| wp_site_health_scheduled_check | 2026-10-19 07:28:46 | 1 day 19 hours | 1 week |
| rocket_remove_saas_failed_jobs | 2026-10-19 08:16:58 | 1 day 20 hours | 3 days |
+-------------------------------------------+---------------------+-----------------------+---------------+Keluaran menampilkan nama hook yang terdaftar, waktu eksekusi berikutnya, dan interval pengulangan; tugas yang kolom [next_run_relative]-nya bernilai [now] langsung diproses pada eksekusi cron berikutnya.
Ⅲ. Saat Tugas Terjadwal WP-Cron Tidak Berjalan
Mudah mengira tugas akan berjalan sendiri begitu waktunya tiba, tetapi WP-Cron memeriksa pekerjaan saat ada permintaan halaman yang masuk, bukan berdasarkan jam. Tugas yang dijadwalkan pukul 14.00 pun, jika tidak ada permintaan sampai pukul 17.00, baru berjalan pada permintaan pertama pukul 17.00.
Jika eksekusi tertunda, pos terjadwal ditampilkan sebagai [Jadwal yang terlewati] (Missed schedule) di daftar pos. Di [perbaikan yang disarankan] pada tab Status di [Peralatan › Kesehatan Situs], muncul [Event yang dijadwalkan telah gagal]. Tugas yang didaftarkan plugin, seperti preload cache, juga menunggu dijalankan karena alasan yang sama.
Tugas terjadwal berjalan di [wp-cron.php] setelah melewati permintaan halaman, pemeriksaan tugas, dan permintaan loopback; jika salah satu tahap ini putus, tugas tidak berjalan meski waktunya sudah lewat.
1️⃣ Saat Tidak Ada Kunjungan atau Cache Halaman yang Merespons
WP-Cron hanya memeriksa tugas pada permintaan yang menjalankan WordPress, jadi selama tidak ada kunjungan, tugas yang sudah lewat waktunya terus menumpuk. Meski ada kunjungan, hasilnya sama jika respons datang dari file cache halaman, karena WordPress tidak berjalan.
Di WordPress dengan cache halaman WP Rocket aktif, membuka beranda yang sudah di-cache tidak mencatat panggilan [wp-cron.php]. Begitu alamat yang tidak di-cache dibuka, panggilan tercatat pada detik yang sama, dan lima tugas yang tertunda pun berjalan.
Tugas yang tertunda bisa dilihat dengan menyaring daftar WP-CLI ke baris yang [next_run_relative]-nya [now].
wp cron event list --next_run_relative=now --fields=hook,next_run_gmt,next_run_relative+----------------------------------+---------------------+-------------------+
| hook | next_run_gmt | next_run_relative |
+----------------------------------+---------------------+-------------------+
| rocket_saas_pending_jobs | 2026-10-17 14:49:57 | now |
| action_scheduler_run_queue | 2026-10-17 14:49:57 | now |
| action_scheduler_run_queue_rucss | 2026-10-17 14:49:58 | now |
| rocket_saas_on_submit_jobs | 2026-10-17 14:49:58 | now |
| rocket_preload_process_pending | 2026-10-17 14:49:59 | now |
+----------------------------------+---------------------+-------------------+[now] berarti waktu terjadwalnya sudah lewat. Perintah daftar ini juga memuat WordPress, jadi jika ada tugas tertunda, ia memanggil [wp-cron.php] begitu selesai. Jalankan perintah yang sama sekali lagi dan tugas yang barusan terlihat sudah hilang dari daftar.
Untuk membereskan tugas yang tertunda sebelum memperbaiki penyebabnya, jalankan langsung hanya tugas yang sudah jatuh tempo dengan WP-CLI.
wp cron event run --due-nowExecuted the cron event 'rocket_saas_pending_jobs' in 0.005s.
Executed the cron event 'action_scheduler_run_queue' in 0.006s.
Executed the cron event 'action_scheduler_run_queue_rucss' in 0.006s.
Executed the cron event 'rocket_saas_on_submit_jobs' in 0.005s.
Executed the cron event 'rocket_preload_process_pending' in 0.007s.
Success: Executed a total of 5 cron events.Perintah ini menjalankan tugas di dalam server tanpa permintaan HTTP; untuk memprosesnya pada interval tetap tanpa bergantung pada kunjungan, daftarkan perintah yang sama di cron sistem.
2️⃣ Saat Hanya DISABLE_WP_CRON yang Aktif tanpa Cron Sistem
Jika [DISABLE_WP_CRON] diatur ke true, WP-Cron tidak memeriksa tugas meski ada permintaan halaman. Dokumentasi resmi juga menganjurkan urutan mendaftarkan di penjadwal tugas sistem terlebih dahulu, baru menambahkan konstanta ini; jika hanya konstanta yang ditambahkan tanpa pendaftaran, tidak ada lagi yang menjalankan tugas terjadwal.
Dengan konstanta terpasang, pos yang dijadwalkan sedikit lebih dari 1 menit ke depan tetap [Terjadwal] setelah waktunya lewat, dan kolom tanggal di daftar pos menampilkan [Jadwal yang terlewati]. Selama itu, tidak satu pun panggilan [wp-cron.php] tercatat.
Apakah konstanta ini aktif bisa diperiksa dengan [wp cron test].
wp cron testError: The DISABLE_WP_CRON constant is set to true. WP-Cron spawning is disabled.Jika muncul error ini, periksa apakah cron sistem punya baris yang memanggil [wp-cron.php] atau menjalankan [wp cron event run]. Jika crontab akun situs kosong, tampilannya seperti di bawah.
crontab -lno crontab for exampleJika barisnya tidak ada, daftarkan cron sistem; jika lingkungan Anda tidak memungkinkan, hapus baris [DISABLE_WP_CRON] dan gunakan WP-Cron lagi.
3️⃣ Saat Permintaan Loopback Server Diblokir
Jika ada tugas, WP-Cron membuat server mengirim permintaan ke [wp-cron.php] di alamat situsnya sendiri untuk menjalankan tugas; permintaan inilah yang disebut permintaan loopback. Jika ada aturan keamanan yang memblokir [wp-cron.php], permintaan loopback kembali dengan 403 dan tugas tidak berjalan.
Di server dengan konfigurasi Nginx dan Apache, saat [wp-cron.php] dibatasi agar hanya terbuka dari 127.0.0.1, permintaan loopback terblokir dengan 403. Ini karena permintaan yang dikirim server ke domainnya sendiri masuk lewat IP publik, dan [wp cron test] juga mengembalikan kode status yang sama.
wp cron testError: WP-Cron spawn returned HTTP status code: 403 ForbiddenSaat tugas tertunda lebih dari 5 menit, membuka layar [Kesehatan Situs] menampilkan peringatan loopback dan kegagalan event terjadwal bersamaan di [perbaikan yang disarankan].

Setelah aturan dihapus, [wp cron test] kembali berhasil. Jika aturan harus dipertahankan, jalankan lewat WP-CLI dari cron sistem. Eksekusi WP-CLI tidak melewati permintaan HTTP, sehingga tugas yang tertunda tetap diproses meski aturan yang sama masih ada.
🔢 FAQ & Konten yang Direkomendasikan






ℹ️ Pemberitahuan Afiliasi
Konten di situs ini berisi tautan afiliasi. Jika pengunjung membeli produk atau layanan melalui tautan tersebut, situs ini menerima komisi dari penjual. Harga yang dibayar pembeli(turun saat ada diskon promo ↓), tidak naik karena hal ini. Harga, diskon, dan informasi stok yang ditampilkan berlaku pada saat penulisan dan bisa berbeda dengan kondisi sebenarnya, jadi pastikan kembali di situs penjual sebelum membeli. Pemilihan dan penilaian produk dibuat berdasarkan standar kami sendiri, dan ada tidaknya komisi tidak memengaruhi urutan maupun isi penilaian.