As Requested Nasıl Yapılır?

As Requested Nasıl Yapılır?
As Requested Nasıl Yapılır?

WordPress tabanlı web projelerinde, dış dünyadan gelen veya dış dünyaya gönderilen HTTP isteklerini (HTTP Requests) belirli kurallara göre yönetmek, modern web uygulamalarının temel taşlarından biridir. Geliştiriciler olarak sıklıkla özel URL yapıları kurmak, harici API entegrasyonları gerçekleştirmek veya gelen verileri güvenli bir şekilde işlemek zorunda kalırız. Bu rehberde, WordPress ekosisteminde gelen ve giden HTTP isteklerini tam olarak istendiği gibi yönetmeyi ifade eden As Requested Nasıl Yapılır? sorusunun yanıtını tüm teknik detaylarıyla ele alacağız.

Bu makale, WordPress mimarisinde isteklerin (request) nasıl yakalandığını, özel sorgu değişkenlerinin (query variables) nasıl tanımlandığını, REST API uç noktalarının (endpoints) nasıl oluşturulduğunu ve harici API'lere nasıl güvenli istekler gönderileceğini adım adım açıklamaktadır. İster özel bir ödeme entegrasyonu geliştiriyor olun, ister mobil uygulamanız için özel bir veri akışı (feed) hazırlıyor olun; bu rehberdeki yöntemler projenizin performanslı ve güvenli çalışmasını sağlayacaktır.

Rehber boyunca sunulan tüm kod örnekleri, WordPress'in en güncel standartlarına ve PHP 8.x modern sözdizimine uygun olarak hazırlanmıştır. Adımları takip ederek kendi yerel geliştirme ortamınızda test edebilir ve projelerinize doğrudan entegre edebilirsiniz.

Ön Hazırlık ve Gereksinimler

Uygulamaya geçmeden önce, geliştirme ortamınızın ve teknik altyapınızın aşağıdaki gereksinimleri karşıladığından emin olmanız gerekmektedir. Bu gereksinimler, kodların kararlı ve güvenli çalışması için kritik öneme sahiptir:

  • WordPress Sürümü: WordPress 6.0 veya üzeri (Güncel REST API ve HTTP API fonksiyonları için gereklidir).
  • PHP Sürümü: PHP 8.1 veya üzeri (Strict types ve modern veri işleme özellikleri için önerilir).
  • Geliştirme Ortamı: LocalWP, Laragon veya Docker tabanlı yerel bir WordPress kurulumu.
  • Yetki Seviyesi: Kodları entegre edebilmek için aktif bir Child Theme (Alt Tema) functions.php dosyasına veya özel bir eklenti (plugin) yazma yetkisine sahip olmak.
  • Araçlar: API isteklerini test etmek için Postman veya benzeri bir HTTP istemci aracı.

Önemli Güvenlik Uyarısı: Bu rehberde yer alan kodları doğrudan canlı (production) ortamınızda denemeyiniz. Öncelikle yerel (local) veya staging (test) ortamınızda test edip, çalıştığından emin olduktan sonra canlıya alınız.

1. WordPress İstek Yönetimi ve Temel Mekanizma

WordPress'e gelen her HTTP isteği, sistemin çekirdeğindeki WP sınıfı tarafından analiz edilir. Gelen URL çözümlenir, veritabanı sorgularına dönüştürülür ve uygun şablon dosyası (template) yüklenir. "As Requested" yani tam istendiği gibi bir istek yönetimi yapmak için bu yaşam döngüsüne (lifecycle) doğru kancalarla (hooks) müdahale etmemiz gerekir.

WordPress'te istekleri yönetmek için üç temel yaklaşım mevcuttur: Özel Sorgu Değişkenleri (Query Vars), REST API Uç Noktaları ve AJAX İşleyicileri. Hangi yöntemin seçileceği, isteğin amacına ve istemcinin (client) türüne göre değişiklik gösterir. Aşağıdaki adımlarda bu yöntemlerin her birini derinlemesine inceleyeceğiz.

2. Özel Query Variables ile İstek Yakalama Nasıl Yapılır?

WordPress'in varsayılan olarak tanımadığı özel URL parametrelerini (örneğin: example.com/?islem=odeme&durum=basarili) güvenli bir şekilde yakalamak için öncelikle bu değişkenleri WordPress'e tanıtmalıyız. Buna "Query Variables" (Sorgu Değişkenleri) kaydı denir.

Aşağıdaki örnek kodda, WordPress'e islem_tipi adında yeni bir sorgu değişkeni tanıtıyoruz. Bu işlem, WordPress'in bu parametreyi URL'den okuyup hafızaya almasını sağlar.

function custom_register_query_vars( $vars ) {
    $vars[] = 'islem_tipi';
    return $vars;
}
add_filter( 'query_vars', 'custom_register_query_vars' );

Yukarıdaki filtre kancası (filter hook), WordPress'in izin verilen sorgu parametreleri listesine islem_tipi değişkenini ekler. Bu aşamadan sonra WordPress bu parametreyi URL'de gördüğünde temizler ve erişilebilir kılar.

Şimdi, bu parametre URL'de yer aldığında isteği yakalayıp işleyecek ve özel bir şablon veya veri döndürecek mekanizmayı kuralım. Bunun için template_redirect kancasını kullanacağız.

function custom_handle_request() {
    $islem = get_query_var( 'islem_tipi' );

    if ( ! empty( $islem ) ) {
        // Güvenlik için gelen veriyi sanitize ediyoruz (temizliyoruz)
        $islem_temiz = sanitize_key( $islem );

        if ( $islem_temiz === 'rapor_uret' ) {
            // İstendiği gibi rapor üretme fonksiyonunu tetikliyoruz
            header('Content-Type: application/json; charset=utf-8');
            echo wp_json_encode([
                'durum' => 'basarili',
                'mesaj' => 'Rapor isteği başarıyla alındı ve işlendi.',
                'zaman' => current_time( 'mysql' )
            ]);
            exit; // WordPress'in normal şablon yükleme sürecini sonlandırıyoruz
        }
    }
}
add_action( 'template_redirect', 'custom_handle_request' );

Bu kod bloğunda, get_query_var() fonksiyonu ile tanımladığımız parametreyi güvenli bir şekilde okuyoruz. Eğer parametre değeri rapor_uret ise, tarayıcıya JSON formatında bir yanıt dönüp işlemi sonlandırıyoruz (exit). Böylece WordPress gereksiz yere tema dosyalarını yüklemez ve sunucu kaynakları korunmuş olur.

3. WordPress REST API ile "As Requested" Uç Noktaları Oluşturma

Modern web uygulamalarında, gelen istekleri yönetmenin en standart ve güvenli yolu WordPress REST API kullanmaktır. REST API, rotaları (routes) ve uç noktalarını (endpoints) kolayca tanımlamamıza, gelen verileri doğrulamamıza (validation) ve yetkilendirme (authorization) kontrolleri yapmamıza olanak tanır.

Aşağıdaki örnek kodda, /wp-json/ozel/v1/veri-kaydet şeklinde çağrılabilecek özel bir POST uç noktası tanımlıyoruz. Bu uç nokta, dışarıdan gelen verileri "as requested" (talep edildiği şekilde) işleyecektir.

function custom_register_rest_routes() {
    register_rest_route( 'ozel/v1', '/veri-kaydet', [
        'methods'             => 'POST',
        'callback'            => 'custom_handle_api_request',
        'permission_callback' => 'custom_api_permission_check',
        'args'                => [
            'kullanici_id' => [
                'required'          => true,
                'validate_callback' => function($param, $request, $key) {
                    return is_numeric($param);
                },
                'sanitize_callback' => 'absint',
            ],
            'eposta' => [
                'required'          => true,
                'validate_callback' => 'is_email',
                'sanitize_callback' => 'sanitize_email',
            ]
        ],
    ]);
}
add_action( 'rest_api_init', 'custom_register_rest_routes' );

Yukarıdaki kodda, register_rest_route fonksiyonu ile yeni bir rota oluşturduk. Bu rotaya gönderilecek parametrelerin (kullanici_id ve eposta) zorunlu olduğunu belirttik, tiplerini doğruladık (validate) ve temizledik (sanitize). Şimdi yetkilendirme ve ana işlem fonksiyonlarını yazalım.

function custom_api_permission_check( $request ) {
    // Güvenlik kontrolü: İstek yapan kullanıcının yetkisini kontrol edin
    // Örnek olarak sadece giriş yapmış kullanıcıların erişimine izin veriyoruz
    return is_user_logged_in() || current_user_can( 'manage_options' );
}

function custom_handle_api_request( $request ) {
    $kullanici_id = $request->get_param( 'kullanici_id' );
    $eposta       = $request->get_param( 'eposta' );

    // Gelen verileri işleme adımı (Veritabanına kaydetme, e-posta gönderme vb.)
    // Bu örnekte sadece başarılı yanıt döndürüyoruz
    return new WP_REST_Response([
        'kod'     => 'islem_tamam',
        'mesaj'   => 'Veriler istendiği gibi başarıyla işlendi.',
        'data'    => [
            'id'    => $kullanici_id,
            'email' => $eposta
        ]
    ], 200);
}

Bu REST API mimarisi sayesinde, gelen istekler otomatik olarak güvenlik süzgecinden geçer. Eğer parametreler eksik veya geçersizse, WordPress istemciye otomatik olarak 400 Bad Request hatası döner. Bu, uygulamanızın güvenliğini en üst düzeye çıkarır.

4. wp_remote_post ve wp_remote_get ile Dış İstekleri Yönetme

Bazen WordPress sitemizin dışarıdaki bir API'ye istek göndermesi gerekir. Örneğin, bir CRM sistemine kullanıcı verisi göndermek veya bir hava durumu servisinden veri çekmek isteyebiliriz. WordPress, bu giden istekleri (outgoing requests) yönetmek için son derece güçlü olan HTTP API'yi sunar.

Aşağıdaki örnek kodda, harici bir API'ye güvenli bir şekilde POST isteği gönderme ve dönen yanıtı hata kontrolleriyle birlikte işleme adımları gösterilmiştir.

function custom_send_external_request( $veri_paketi ) {
    $url = 'https://api.ornekservis.com/v1/entegrasyon';

    $args = [
        'body'        => wp_json_encode( $veri_paketi ),
        'timeout'     => 15, // Saniye cinsinden zaman aşımı
        'redirection' => 5,
        'httpversion' => '1.1',
        'headers'     => [
            'Content-Type'  => 'application/json; charset=utf-8',
            'Authorization' => 'Bearer ' . 'SUREKLI_GUNCEL_API_ANAHTARINIZ'
        ],
        'data_format' => 'body',
    ];

    // İstek gönderiliyor
    $response = wp_remote_post( $url, $args );

    // Hata kontrolü
    if ( is_wp_error( $response ) ) {
        $error_message = $response->get_error_message();
        error_log( "Harici API Hatası: " . $error_message );
        return false;
    }

    $response_code = wp_remote_retrieve_response_code( $response );
    $response_body = wp_remote_retrieve_body( $response );

    if ( $response_code === 200 ) {
        return json_decode( $response_body, true );
    }

    return false;
}

Bu fonksiyonda wp_remote_post() kullanılarak harici sunucuya güvenli bir istek atılmıştır. is_wp_error() kontrolü ile bağlantı hataları (DNS çözümlenememesi, sunucuya ulaşılamaması vb.) yakalanır ve hata loguna kaydedilir. Bu, uygulamanın çökmesini engeller.

5. Güvenli AJAX İstekleri ve Nonce Doğrulama Adım Adım

WordPress yönetim panelinde veya ön yüzde (frontend) sayfa yenilenmeden dinamik işlemler yapmak için AJAX istekleri kullanılır. AJAX isteklerinde en kritik konu CSRF (Cross-Site Request Forgery) saldırılarını önlemek için "Nonce" (tek kullanımlık güvenlik anahtarı) doğrulaması yapmaktır.

İlk olarak, JavaScript dosyamıza dinamik URL ve Nonce değerini aktaralım:

function custom_enqueue_ajax_scripts() {
    wp_enqueue_script( 'custom-ajax-handle', get_stylesheet_directory_uri() . '/js/custom-ajax.js', ['jquery'], '1.0.0', true );

    wp_localize_script( 'custom-ajax-handle', 'custom_ajax_nesnesi', [
        'ajax_url' => admin_url( 'admin-ajax.php' ),
        'guvenlik' => wp_create_nonce( 'custom_ajax_guvenlik_kilidi' )
    ]);
}
add_action( 'wp_enqueue_scripts', 'custom_enqueue_ajax_scripts' );

Şimdi, gelen bu AJAX isteğini karşılayacak ve güvenliğini doğrulayacak PHP fonksiyonunu yazalım. Hem giriş yapmış kullanıcılar (wp_ajax_) hem de ziyaretçiler (wp_ajax_nopriv_) için kancaları tanımlıyoruz.

function custom_process_ajax_request() {
    // Nonce doğrulaması yapılıyor
    check_ajax_referer( 'custom_ajax_guvenlik_kilidi', 'guvenlik_kodu' );

    // Gelen veriyi alıp temizliyoruz
    if ( ! isset( $_POST['talep_turu'] ) ) {
        wp_send_json_error( [ 'mesaj' => 'Eksik parametre!' ], 400 );
    }

    $talep = sanitize_text_field( $_POST['talep_turu'] );

    // İşlem gerçekleştiriliyor
    if ( $talep === 'abone_ol' ) {
        // Abone kaydetme mantığı buraya yazılır
        wp_send_json_success( [ 'mesaj' => 'Aboneliğiniz istendiği gibi başarıyla tamamlandı.' ] );
    }

    wp_send_json_error( [ 'mesaj' => 'Geçersiz işlem talebi.' ], 400 );
}
add_action( 'wp_ajax_custom_action', 'custom_process_ajax_request' );
add_action( 'wp_ajax_nopriv_custom_action', 'custom_process_ajax_request' );

Bu yapıda, check_ajax_referer fonksiyonu gelen isteğin gerçekten bizim sitemiz üzerinden üretilen geçerli bir formdan gelip gelmediğini kontrol eder. Geçersiz istekler anında engellenir.

6. İstek Yönetiminde Performans ve Önbellekleme (Caching) Yöntemleri

Dış API'lere yapılan istekler veya karmaşık iç sorgular sunucu kaynaklarını tüketebilir ve sayfa açılış hızını düşürebilir. Bu durumun önüne geçmek için WordPress'in geçici bellek (Transient API) mekanizmasını kullanarak istek sonuçlarını önbelleğe almalıyız.

Aşağıdaki örnek kod, harici bir API'den çekilen verinin 1 saat boyunca nasıl önbellekte saklanacağını göstermektedir.

function custom_get_cached_api_data() {
    $transient_key = 'custom_api_verisi_cache';
    $cached_data   = get_transient( $transient_key );

    // Eğer önbellekte veri varsa, doğrudan döndür
    if ( false !== $cached_data ) {
        return $cached_data;
    }

    // Önbellekte veri yoksa, yeni istek at
    $url      = 'https://api.ornekservis.com/v1/veri';
    $response = wp_remote_get( $url );

    if ( is_wp_error( $response ) ) {
        return [];
    }

    $body = wp_remote_retrieve_body( $response );
    $data = json_decode( $body, true );

    // Veriyi 1 saat (3600 saniye) boyunca önbelleğe al
    set_transient( $transient_key, $data, HOUR_IN_SECONDS );

    return $data;
}

Bu yöntem sayesinde, sitenizi ziyaret eden yüzlerce kişi için harici API'ye her seferinde tekrar istek atılmaz. Veri yerel veritabanından çok hızlı bir şekilde çekilir, bu da hem API limitlerinizi korur hem de sitenizi hızlandırır.

İstek Yönetim Yöntemlerinin Karşılaştırılması

Aşağıdaki tabloda, WordPress'te istekleri yönetmek için kullandığımız yöntemlerin avantaj ve dezavantajlarını karşılaştırmalı olarak inceleyebilirsiniz:

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Kişisel gelişim ve zaman yönetimi odaklı pratik teknikler üzerine çalışıyorum. Günlük rutinleri iyileştiren, zaman kazandıran yöntemleri bilimsel temellere dayandırarak editöryal bir dille paylaşıyorum.

Yorumlar (0)

Yorum Yaz

Yöntem Kullanım Amacı Avantajları Dezavantajları
Query Variables