WordPress zamanlanmış yayın, güncelleme kontrolü ve eklenti arka plan işleri için WP-Cron adlı yerleşik bir sözde-cron kullanır. Bu mekanizma gerçek bir sistem cron job değildir: görevler ziyaretçi isteğine bağlı tetiklenir. Düşük trafikte gecikir; yüksek trafikte her sayfa yükünde gereksiz kontrol üretir.
Bu rehber WP-Cron'un nasıl çalıştığını, DISABLE_WP_CRON ile sistem cronuna geçişi, WP-CLI ile doğrulamayı, sık hata mesajlarını ve SSH erişiminiz yoksa cronjob.com.tr ile HTTP tetiklemeyi adım adım anlatır. Resmi WordPress dokümantasyonundaki yaklaşım: sistem zamanlayıcısından wp-cron.php çağrılır, ardından sayfa yükü tetiklemesi kapatılır (developer.wordpress.org).
Hedef kitle: WooCommerce veya zamanlanmış yayın kullanan site sahipleri, eklenti geliştiricileri ve cPanel/VPS üzerinde WordPress yönetenler. PHP script cron'u için ayrıca PHP ile Cron Job rehberine bakın.
WP-Cron Nasıl Çalışır?
Her sayfa yükünde WordPress, süresi dolmuş olay olup olmadığını kontrol eder. Varsa arka planda wp-cron.php için HTTP isteği (spawn) gönderir; ziyaretçinin yanıtını bekletmemeye çalışır. Trafik yoksa kontrol de yoktur; bu yüzden gece 03:00'e planlanan görev sabah ilk ziyarette çalışabilir.
- Ziyaretçi bir sayfa ister.
- WordPress hazır cron olaylarını tarar.
- Süresi dolmuş olay varsa
wp-cron.phptetiklenir. - Olay kancaları (
do_action) çalışır; sonraki çalışma zamanı yeniden yazılır.
Avantajı: sunucu crontab erişimi olmayan paylaşımlı hosting'de de çalışır. Dezavantajı: zamanlama kesin değildir; CDN/cache tam sayfa önbelleği ziyaretçi isteklerini azaltırsa tetikleme daha da seyrekleşir.
WordPress'in Kullandığı Cron Görevleri
- Zamanlanmış yayınlar: İleri tarihli yazı ve ürünlerin otomatik yayınlanması
- Güncelleme kontrolü: Çekirdek, tema ve eklenti güncellemeleri
- Çöp kutusu temizliği: Silinen içeriklerin kalıcı kaldırılması
- Transient temizliği: Süresi dolmuş geçici seçenekler
- Eklenti işleri: WooCommerce abonelik/stok, SEO sitemap, yedekleme eklentileri
Varsayılan tekrar aralıkları hourly, twicedaily, daily ve (sürüme göre) weekly şeklindedir. Daha sık aralık için cron_schedules filtresi gerekir. Sipariş ve hesap e-postaları genellikle tetikleyici olayla anında gönderilir; gönderimi kuyruğa alıp hız limitine göre dağıtmanız gerekiyorsa e-posta kuyruğu ve hız limiti yaklaşımını anlatan rehbere bakın.
Adım Adım: Gerçek Cron'a Geçiş
Güvenilir zamanlama için WP-Cron'un ziyaretçi tetiklemesini kapatıp sistem cronu veya dış HTTP zamanlayıcı kullanın. Zaman ifadelerini crontab sözdizimi ile doğrulayın.
wp-config.phpiçinderequire/require_oncesatırlarından öncedefine('DISABLE_WP_CRON', true);ekleyin.- PHP CLI yolunu bulun:
which phpveya cPanel'de MultiPHP'nin CLI yolu (sıkça/usr/local/bin/php). - Crontab'a 15 dakikalık tetikleme ekleyin (aşağıdaki örnekler).
- WP-CLI ile
wp cron event listvewp cron event run --due-nowçalıştırıp kuyruğu doğrulayın. - Bir zamanlanmış taslak yazı oluşturup tetikleme aralığından sonra yayınlandığını kontrol edin.
wp-config.php
define('DISABLE_WP_CRON', true);
CLI ile wp-cron.php
*/15 * * * * /usr/bin/php /var/www/html/wp-cron.php > /dev/null 2>&1
cPanel örneği (kullanıcı ve yolu kendinize göre değiştirin):
*/15 * * * * /usr/local/bin/php /home/USER/public_html/wp-cron.php > /dev/null 2>&1
HTTP ile tetikleme (curl / wget)
*/15 * * * * /usr/bin/curl -s "https://siteniz.com/wp-cron.php?doing_wp_cron" > /dev/null 2>&1
*/15 * * * * /usr/bin/wget -q -O /dev/null "https://siteniz.com/wp-cron.php?doing_wp_cron"
DISABLE_WP_CRON yalnızca ziyaretçi tabanlı spawn'ı kapatır. wp-cron.php'ye doğrudan CLI veya HTTP çağrısı çalışmaya devam eder; ikisi birbirinin yerine geçer, biri diğerine bağlı değildir.WP-CLI ile Kontrol
wp cron event list
wp cron event list --fields=hook,next_run,recurrence
wp cron event run --due-now
wp cron event run --all
wp cron event run wp_scheduled_auto_draft_delete
wp cron schedule list
Multisite'ta site bağlamı zorunludur: wp cron event run --due-now --url=https://alt.ornek.com.
Gerçek Senaryolar
Senaryo 1: Düşük trafikli blogda zamanlanmış yayın
Günde birkaç ziyaretçi alan blogda sabah 09:00'a planlanan yazı, ilk ziyaretçi gelene kadar taslakta kalır. Çözüm: DISABLE_WP_CRON + her 15 dakikada wp-cron.php tetiklemesi. Tetiklemeler başarılı olur ve görev kuyruğu zamanında işlenirse yayın gecikmesi yaklaşık tetikleme aralığı kadar olabilir.
Senaryo 2: WooCommerce stok ve abonelik işleri
Sipariş durumu, stok senkronu veya abonelik yenileme eklentileri WP-Cron kancalarına bağlıdır. Yoğun mağazada */5 * * * * tercih edilir; uzun süren işlerde CLI tetikleme HTTP timeout riskini azaltır. Çakışan ağır işleri geceye kaydırın. Mağazanın stok, pazarlama feed'i ve rapor görevlerinin bütünsel planlaması için e-ticaret siteleri için cron görev planı rehberine bakabilirsiniz.
Özel Cron Aralığı ve Olay
<?php
// Özel eklentinin ana PHP dosyası
add_filter('cron_schedules', function ($schedules) {
$schedules['every_fifteen_minutes'] = [
'interval' => 900,
'display' => 'Her 15 Dakikada Bir',
];
return $schedules;
});
if (!wp_next_scheduled('ozel_temizlik_gorevi')) {
wp_schedule_event(time(), 'daily', 'ozel_temizlik_gorevi');
}
add_action('ozel_temizlik_gorevi', function () {
global $wpdb;
$ids = $wpdb->get_col("
SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'revision'
AND post_modified < DATE_SUB(NOW(), INTERVAL 90 DAY)
");
foreach ($ids as $id) {
wp_delete_post_revision((int) $id);
}
});
register_deactivation_hook(__FILE__, function () {
wp_clear_scheduled_hook('ozel_temizlik_gorevi');
});
Kilitleme süresi için (saniye): define('WP_CRON_LOCK_TIMEOUT', 120); — aynı anda birden fazla cron spawn'ını sınırlar. Veritabanı yedeklerini bir eklentinin WP-Cron kancasına bağlamak yerine sunucu tarafında çözmek isterseniz veritabanı yedekleme cron'u kurulumunu anlatan rehberdeki mysqldump tabanlı örnekler daha güvenilir sonuç verir.
Sık Hatalar ve Çözümleri
Zamanlanmış yazı yayınlanmıyor
Neden: Trafik yok veya tam sayfa cache ziyaretçi isteklerini kesiyor. Çözüm: Gerçek cron'a geçin; WP Crontrol veya wp cron event list ile publish_future_post kancasını kontrol edin.
/bin/sh: 1: php: not found
Neden: Crontab PATH'inde PHP yok. Çözüm: Mutlak yol kullanın (/usr/bin/php veya /usr/local/bin/php). Ayrıntılı PHP cron sorunları için Cron Job Çalışmıyor rehberine bakın.
Error establishing a database connection (CLI wp-cron)
Neden: Yanlış çalışma dizini veya socket yolu; CLI ortamı web'den farklıdır. Çözüm: Önce cd /var/www/html && /usr/bin/php wp-cron.php deneyin; DB_HOST değerini doğrulayın.
Loopback / cURL error 28 veya site sağlığında "WP-Cron çalıştırılamıyor"
Neden: Sunucu kendi URL'sine HTTP isteği atamıyor (firewall, DNS, SSL). Çözüm: DISABLE_WP_CRON açıp CLI ile php wp-cron.php çalıştırın; HTTP yerine yerel CLI tercih edin.
Permission denied crontab veya dosya
Neden: Kullanıcının crontab hakkı yok veya script okunamıyor. Çözüm: Doğru kullanıcıyla crontab -e; dosya izinlerini web/CLI kullanıcısına göre ayarlayın.
cronjob.com.tr ile HTTP Alternatifi
SSH veya cPanel cron yoksa https://siteniz.com/wp-cron.php?doing_wp_cron adresini dışarıdan zamanlayabilirsiniz. Önce DISABLE_WP_CRON tanımlayın; aksi halde hem ziyaretçi hem dış tetikleme çakışabilir.
- cronjob.com.tr'de ücretsiz hesap açın (kredi kartı istenmez).
- Yeni iş: metot GET, URL
https://siteniz.com/wp-cron.php?doing_wp_cron. - Aralık: 5 veya 15 dakika (hazır aralık veya 5 alanlı cron ifadesi; saat dilimi varsayılan Europe/Istanbul).
- Başarı: HTTP 200–399. Loglarda durum kodu ve yanıt süresi 7 gün saklanır; ardışık hata eşiği aşılınca e-posta bildirimi gelir.
Hizmet ücretsizdir; en kısa aralık 60 saniyedir. Yerel ağ adreslerine istek gönderilmez; WordPress'iniz internetten erişilebilir HTTPS URL olmalıdır.
WP-Cron vs Gerçek Cron
| Özellik | WP-Cron (varsayılan) | Sistem / HTTP cron |
|---|---|---|
| Tetikleme | Ziyaretçi bağımlı | Zamanında |
| Düşük trafik | Gecikmeli | Düzenli |
| Yüksek trafik | Fazla kontrol | Sabit aralık |
| Sayfa yükü | Etkilenebilir | Ayrı süreç |
Sıkça Sorulan Sorular (SSS)
WP-Cron'u devre dışı bırakırsam ne olur?
Ziyaretçi trafiğiyle otomatik tetikleme durur. Zamanlanmış yayınlar, güncelleme kontrolleri ve eklenti görevleri çalışmaz; bu yüzden gerçek cron veya HTTP ile wp-cron.php'yi düzenli tetiklemeniz gerekir.
WP-Cron tetikleme aralığı ne olmalı?
Çoğu site için 15 dakika (*/15 * * * *) yeterlidir. Yoğun WooCommerce sitelerinde 5 dakika, düşük trafikli blogda 30 dakika uygun olabilir. Aralık, en sık çalışan görevin toleransına göre seçilir.
Multisite'ta WP-Cron nasıl çalışır?
Her site kendi cron kuyruğunu tutar. Ana domain wp-cron.php çağrısı genelde yeterli olmaz; alt siteler için URL bazlı tetikleme veya WP-CLI ile wp cron event run --due-now --url=site.ornek.com kullanın.
ALTERNATE_WP_CRON ne işe yarar?
ALTERNATE_WP_CRON true iken WordPress, spawn_cron HTTP isteği yerine yönlendirme tabanlı bir tetikleme dener. Bazı engellenmiş loopback ortamlarında yardımcı olur; kalıcı çözüm DISABLE_WP_CRON + sistem cronudur.
Sonuç
WP-Cron küçük sitelerde iş görür; güvenilir yayın ve mağaza işleri için DISABLE_WP_CRON ile 5–15 dakikalık gerçek tetikleme standart çözümdür. WP-CLI ile kuyruğu izleyin; SSH yoksa HTTP zamanlayıcı kullanın.
Hemen Ücretsiz Cron Job Oluşturun
cronjob.com.tr ile wp-cron.php URL'sini dakikada bir tetikleyin. Kayıtta kredi kartı gerekmez; log ve hata bildirimi ücretsizdir.
Ücretsiz Başla →