Wordpress İle Özel Bir Dinamik E-Ticaret Sipariş Raporlama Sistemi Nasıl Yapılır?

Wordpress İle Özel Bir Dinamik E-Ticaret Sipariş Raporlama Sistemi Nasıl Yapılır?
Wordpress İle Özel Bir Dinamik E-Ticaret Sipariş Raporlama Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. WordPress 6.x ve üzeri sürümler, PHP 8.2+ ve WooCommerce 9.x sürümleri ile tam uyumluluk hedeflenmiştir. Eski PHP sürümlerinde kullanılan bazı fonksiyonlar (örneğin mysql_query) artık desteklenmemektedir; bu nedenle modern $wpdb sınıfı yöntemlerini kullanacağız.

  • Yerel Geliştirme Ortamı: LocalWP veya XAMPP gibi bir sunucu ortamı.
  • IDE: VS Code veya PHPStorm gibi gelişmiş bir kod düzenleyici.
  • Veritabanı Erişimi: phpMyAdmin veya WP-CLI kullanarak tablo yapılarını inceleyebilme yetisi.
  • Yedekleme: Kodları canlı siteye uygulamadan önce mutlaka veritabanı yedeği alınız.

WooCommerce Veritabanı Yapısını Anlamak

Sipariş verileri, WordPress veritabanında iki ana tablo grubunda tutulur: wp_posts (siparişin kendisi) ve wp_postmeta (sipariş detayları). Ancak WooCommerce, siparişleri 'shop_order' türünde bir post olarak saklar. Raporlama yaparken bu tabloları birleştirmek (JOIN) kritik öneme sahiptir.

Aşağıdaki tablo, raporlama sisteminde en çok ihtiyaç duyacağınız veritabanı alanlarını özetlemektedir:

Veri Alanı Tablo Açıklama
ID wp_posts Sipariş numarası
post_status wp_posts Sipariş durumu (wc-completed, wc-processing)
_order_total wp_postmeta Siparişin toplam tutarı
_billing_email wp_postmeta Müşteri e-posta adresi

Adım Adım Özel Rapor Sayfası Oluşturma

İlk adım olarak, WordPress yönetici paneline özel bir sayfa eklememiz gerekiyor. Bu sayfa, raporlarımızı görüntüleyeceğimiz arayüz olacaktır. Bunun için admin_menu kancasını (hook) kullanıyoruz.


function ozel_siparis_raporu_menu() {
    add_menu_page(
        'Sipariş Raporları', 
        'Sipariş Raporları', 
        'manage_woocommerce', 
        'ozel-raporlar', 
        'ozel_rapor_sayfasi_icerik', 
        'dashicons-chart-bar', 
        56
    );
}
add_action('admin_menu', 'ozel_siparis_raporu_menu');

Bu kod bloğu, WordPress sol menüsüne "Sipariş Raporları" adında yeni bir sekme ekler. manage_woocommerce yetkisi, sadece mağaza yöneticilerinin bu sayfaya erişmesini sağlar.

Veritabanından Dinamik Veri Çekme

Raporlama sisteminin kalbi, $wpdb sınıfını kullanarak veritabanından sipariş verilerini çekmektir. SQL Injection saldırılarına karşı verileri mutlaka prepare() metodu ile temizlemelisiniz.


function siparis_verilerini_getir($baslangic_tarihi, $bitis_tarihi) {
    global $wpdb;
    
    $query = "SELECT p.ID, p.post_date, pm.meta_value as total 
              FROM {$wpdb->posts} p
              JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
              WHERE p.post_type = 'shop_order' 
              AND pm.meta_key = '_order_total'
              AND p.post_date BETWEEN %s AND %s";
              
    return $wpdb->get_results($wpdb->prepare($query, $baslangic_tarihi, $bitis_tarihi));
}

Bu fonksiyon, belirtilen tarih aralığındaki tüm siparişlerin ID'sini, tarihini ve toplam tutarını getirir. $wpdb->prepare kullanımı, dışarıdan gelen verilerin SQL sorgusuna zarar vermesini engeller.

Kritik Güvenlik Uyarısı: Veritabanı sorgularında asla doğrudan kullanıcıdan gelen veriyi (örneğin $_GET veya $_POST) kullanmayın. Her zaman $wpdb->prepare() ile veriyi sanitize edin ve yetkilendirme kontrollerini (current_user_can) ihmal etmeyin.

Rapor Verilerini HTML Tablosuna Aktarma

Verileri çektikten sonra bunları kullanıcıya şık bir tablo olarak sunmalıyız. Aşağıdaki kod, veritabanından gelen veriyi döngüye sokarak bir HTML tablosu oluşturur.


function ozel_rapor_sayfasi_icerik() {
    echo '

Sipariş Raporları

'; $sonuclar = siparis_verilerini_getir('2026-01-01', '2026-12-31'); echo ''; echo ''; foreach ($sonuclar as $s) { echo ''; } echo '
Sipariş IDTarihTutar
'.$s->ID.''.$s->post_date.''.$s->total.' TL
'; }

Bu yapı, WordPress'in kendi CSS sınıflarını (wp-list-table) kullanarak yönetici paneliyle uyumlu bir görünüm sağlar.

Dinamik Filtreleme ve Güvenlik Önlemleri

Kullanıcının tarih seçebilmesi için bir form eklemeli ve bu formdan gelen veriyi işleyerek sorguyu güncellemeliyiz. Aşağıdaki örnek, formdan gelen veriyi güvenlik süzgecinden geçirerek sorguyu nasıl dinamik hale getireceğinizi gösterir.


$baslangic = isset($_GET['baslangic']) ? sanitize_text_field($_GET['baslangic']) : date('Y-m-01');
$bitis = isset($_GET['bitis']) ? sanitize_text_field($_GET['bitis']) : date('Y-m-t');

// Sorgu bu değişkenler kullanılarak çalıştırılmalıdır.

sanitize_text_field fonksiyonu, kullanıcı girdilerindeki zararlı karakterleri temizleyerek XSS (Cross-Site Scripting) saldırılarını önler.

Sıkça Sorulan Sorular

Bu raporlama sistemi veritabanını yavaşlatır mı?

Doğrudan SQL sorguları, WordPress'in yerleşik fonksiyonlarından (örneğin wc_get_orders) daha hızlı çalışır. Ancak çok büyük veritabanlarında (100.000+ sipariş) indeksleme yapılması önerilir.

Neden hazır eklenti kullanmıyorum?

Hazır eklentiler genellikle gereksiz kod yükü getirir ve özelleştirme sınırları dardır. Kendi sisteminizi yapmak, sadece ihtiyacınız olan veriyi çekmenizi sağlar.

Raporu Excel veya CSV olarak nasıl indirebilirim?

PHP'nin fputcsv fonksiyonunu kullanarak, sorgulanan veriyi bir header yönlendirmesi ile dosya olarak tarayıcıya gönderebilirsiniz.

Sistem canlı sitede hata verirse ne yapmalıyım?

WordPress hata ayıklama modunu (WP_DEBUG) açarak hatanın kaynağını görebilir ve kodu düzeltebilirsiniz.

Farklı sipariş durumlarını (iptal edilenler gibi) raporlayabilir miyim?

Evet, SQL sorgusundaki WHERE kısmına AND p.post_status = 'wc-cancelled' ekleyerek kolayca filtreleyebilirsiniz.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka test sitenizde deneyin. Kodun neden olabileceği veri kayıplarından yazar sorumlu değildir.

Veri Görselleştirme İçin Chart.js Entegrasyonu

Tablo verilerini görselleştirmek, satış trendlerini bir bakışta anlamanızı sağlar. WordPress yönetici paneline Chart.js kütüphanesini dahil ederek, SQL sorgusundan gelen verileri dinamik grafiklere dönüştürebilirsiniz.

Öncelikle, rapor sayfanızın en altına bir canvas etiketi ekleyin ve PHP verilerini JavaScript değişkenine aktarın:





    const ctx = document.getElementById('siparisGrafigi').getContext('2d');
    const myChart = new Chart(ctx, {
        type: 'bar',
        data: {
            labels: ['Ocak', 'Şubat', 'Mart', 'Nisan'], // Veritabanından gelen aylar
            datasets: [{
                label: 'Aylık Satış Adedi',
                data: [12, 19, 3, 5], // Veritabanından gelen toplam siparişler
                backgroundColor: 'rgba(54, 162, 235, 0.2)',
                borderColor: 'rgba(54, 162, 235, 1)',
                borderWidth: 1
            }]
        }
    });

Büyük Veri Setleri İçin Performans İpuçları

Mağazanızda on binlerce sipariş varsa, doğrudan $wpdb->get_results kullanmak bellek (memory) limitlerini zorlayabilir. Bu gibi durumlarda veritabanı sorgularını optimize etmeniz ve sonuçları önbelleğe almanız gerekir.

SQL Sorgularını Optimize Etme

Tüm siparişleri çekmek yerine, sadece ihtiyacınız olan sütunları seçin ve LIMIT ile OFFSET kullanarak verileri sayfalara bölün (pagination).

global $wpdb;
$sayfa = isset($_GET['paged']) ? intval($_GET['paged']) : 1;
$limit = 20;
$offset = ($sayfa - 1) * $limit;

$results = $wpdb->get_results(
    $wpdb->prepare(
        "SELECT post_date, post_status FROM {$wpdb->posts} WHERE post_type = 'shop_order' LIMIT %d OFFSET %d",
        $limit,
        $offset
    )
);

Transients API ile Önbellekleme

Rapor verileri her saniye değişmez. WordPress Transients API kullanarak sorgu sonucunu belirli bir süre (örneğin 1 saat) bellekte tutabilirsiniz:

$rapor_verisi = get_transient('ozel_satis_raporu');

if (false === $rapor_verisi) {
    // Veritabanı sorgusunu buraya yazın
    $rapor_verisi = $wpdb->get_results("SELECT ...");
    set_transient('ozel_satis_raporu', $rapor_verisi, HOUR_IN_SECONDS);
}

Hata Ayıklama ve Loglama

Sisteminizde bir sorun oluştuğunda, WordPress'in hata ayıklama modunu kullanarak sorgularınızın neden çalışmadığını görebilirsiniz. wp-config.php dosyanızda şu ayarları aktif edin:

  • WP_DEBUG: true
  • WP_DEBUG_LOG: true
  • SAVEQUERIES: true (Sorgu sürelerini görmek için)

Ayrıca, SQL sorgularınızın hata verip vermediğini kontrol etmek için şu yöntemi kullanın:

if ($wpdb->last_error) {
    error_log('SQL Hatası: ' . $wpdb->last_error);
    echo "Rapor oluşturulurken bir hata oluştu. Lütfen hata kayıtlarını kontrol edin.";
}

Sonuç

WordPress ile özel bir dinamik e-ticaret sipariş raporlama sistemi oluşturmak, mağazanızın verilerini daha derinlemesine analiz etmenize olanak tanır. Bu rehberde, yönetici paneline menü eklemeyi, $wpdb ile veritabanından güvenli veri çekmeyi ve bu verileri tablo halinde sunmayı öğrendiniz. Bir sonraki adım olarak, bu tabloya JavaScript (Chart.js) kütüphanesini entegre ederek verileri görsel grafiklere dönüştürmeyi deneyebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Deniz Arslan

Yedi yıllık dijital içerik deneyimiyle karmaşık süreçleri herkesin anlayabileceği basit adımlara dönüştürüyorum. Pratik yaşam hackleri ve ev yönetimi konularında uzmanım.

Yorumlar (0)

Yorum Yaz