WP-Cron Nedir? Nasıl Kullanılır?

PHP Görsel İşlemleri ve Webp Oluşturma ve Cronjob İle Otomatik Görsel Optimizasyonu başlıklı yazılarda cronjob kullanımına değinmiştim.

AA

PHP ile API işlemlerinde de değindiğim üzere, cronjob ile ihtiyaçlar çerçevesinde çeşitli görevleri (istek yapma, dosya oluşturma/okuma, e-posta gönderme vb.) belirtilen zaman aralıklarıyla gerçekleştirmek mümkün. WordPress içeriklerin belirtilen zamanlarda paylaşılması da yine bu mantıkla yürütülmektedir. Bu amaçla WordPress WP-Cron adında bir fonksiyon sunulmaktadır.

WP-Cron ve Kullanımı

WP-Cron WordPress tarafından sunulan, zamanlanmış kontroller (güncelleme, yükleme, geri bildirim vb.) ve işlemler (yazı yayınlama, istekte bulunma vb.) gerçekleştirmek amacıyla sunulan yardımcı fonksiyonlardan biridir. En temel kullanımını aşağıdaki gibi örneklendirebiliriz.

if(!wp_next_scheduled('wpmail_task_hook')){
    wp_schedule_event(time(), 'hourly', 'wpdocs_task_hook');
}
add_action('wpmail_task_hook', 'wpmail_send_function');

function wpmail_send_function(){
    wp_mail('info@mail.com', 'Merhaba!', 'Bu e-posta wp-cron aracılığıyla gönderilmiştir!');
}

Yukarıdaki örnek fonksiyon her saat belirtilen e-postanın gönderilmesini sağlayacaktır. İlk satırda wpdocs_task_hook fonksiyonunun tanımlı olup olmadığına bakılır, tanımlı değilse wp_schedule_event fonksiyonu ile tanımlama yapılır.

Genelde eklentiler, temalar vb. belirli ön ifadeleri (prefix) kullanırlar. Örneğin, wordpress işlemleri wp_, litespeed1 işlemleri litespeed_ ya da Yoast wpseo_ ön ekine sahiptir.

WordPress Cron (WP-Cron) İşlemleri

wp_schedule_event2 fonksiyonu $timestamp (işlemin zamanını ifad eder), $recurrence (ne kadar sıkıkla bu işlemin gerçekleştirileceği), $hook (ilişkilendirilecek fonksiyon) ve $args (hook için gerekecek argümanlar dizisi) parametrelerini alır. $recurrence için kullanılabilecek ön tanımlı zaman birimleri de mevcuttur; hourly, twicedaily, weekly, monthly gibi. Ancak, cron_schedules ile özel zamanlamalar da planlamak mümkündür. Örneğin, bir işlemin günde 3 defa (8 saatte bir) gerçekleştirilmesini istersek oluşturacağımız bir zaman etiketi ile fonksiyonumuzu ilişkilendirebiliriz.

add_filter('cron_schedules', 'eight_hours_custom_schedule');
function eight_hours_custom_schedule( $schedules ) {
    $schedules['every_eight_hours'] = array(
        'interval' => 8 * HOUR_IN_SECONDS,
        'display'  => esc_html__( 'Every Eight Hours' ),
    );
    return $schedules;
}

Yinelenen olaylardan sakınmak için wp_next_scheduled()3 ya da tekrarlanmayacak olaylar için wp_schedule_single_event() fonksiyonu da tercih edilebilir.

Önemli bir hatırlatmada bulunmakta fayda var. Wp-Cron işlemleri kullanıcı ziyareti ile tetiklenir ve belirlenen işlem saatinde bir ziyaret gerçekleşmemişse işlem tetiklenmeyecektir4. Dolayısıyla bir kaynak tüketimi de söz konusudur. Genelde performans sorunları sebebiyle paylaşımlı barındırma alanlarında WP-Cron fonksiyonu wp-config.php dosyası aracılığıyla pasifleştirilebilmektedir5.

define('DISABLE_WP_CRON', true);

Genelde bu işlemin ardından, planlanacak işlemler için sunucu üzerinden (komut satırı aracılığıyla ya da cpanel vb. üzerinden) cronjob tanım yapılmaktadır ve WordPress üzerindeki işlemler alanadi.com/wp-cron.php üzerinden tetiklenebilmektedir.

WP-Cron ve Cronjob Önerileri

WP-Cron kullanırken ilgili etkinliklerin tekrarlanıp tekrarlanmama ihtiyacına göre fonksiyonun belirlenmesi performans açısından fayda sağlayacaktır. Bu aşamada süreci kolaylıkla yürütebilmek, fonksiyon yazmadan da çeşitli işlemleri planlamak, plananan etkinlikleri listelemek ve yeni zaman etiketleri oluşturmak isterseniz WP Crontrol6 eklentisini kullanabilirsiniz.

Diğer yandan, yukarıda da belirtildiği üzere WP-Cron fonksiyonu pasifleştirilerek işlemlerin sunucu tarafından tetiklenmesini sağlayabilirsiniz.

İleri Okumalar