Gereksinimler ve Ön Hazırlık
Sistemi inşa etmeden önce geliştirme ortamınızda şu bileşenlerin hazır olduğundan emin olmalısınız:
- WordPress 6.5 veya üzeri bir sürüm.
- PHP 8.2 veya üzeri (güncel güvenlik standartları için önerilir).
- Veritabanı erişimi (wpdb sınıfını kullanacağız).
- Güvenli bir geliştirme ortamı (LocalWP veya benzeri).
Çalışmalarınızı doğrudan canlı sunucuda yapmamalı, önce bir staging (test) ortamında denemelisiniz. Ayrıca, veritabanı işlemlerinde SQL Injection riskine karşı $wpdb->prepare() metodunu kullanmak zorunludur.
Adım 1: Dışa Aktarma İçin İstek Noktası (Endpoint) Oluşturma
Dinamik dışa aktarma sisteminin ilk adımı, WordPress'in yeniden yazma kurallarını (Rewrite Rules) kullanarak özel bir URL oluşturmaktır. Bu, kullanıcının veya bir botun veriyi çekebileceği temiz bir adres sağlar.
// functions.php içerisine eklenecek kod
add_action('init', 'ozel_export_rewrite_rules');
function ozel_export_rewrite_rules() {
add_rewrite_rule('export-data/?$', 'index.php?export_data=1', 'top');
}
add_filter('query_vars', 'ozel_export_query_vars');
function ozel_export_query_vars($vars) {
$vars[] = 'export_data';
return $vars;
}
Bu kod bloğu, sitenizin sonuna /export-data/ eklendiğinde WordPress'in bunu tanımasını sağlar. query_vars filtresi ile sistemin bu özel değişkeni takip etmesine izin veriyoruz.
Adım 2: Veritabanından Dinamik Veri Çekme
Şimdi, dışa aktarılacak verileri veritabanından güvenli bir şekilde çekmemiz gerekiyor. $wpdb sınıfını kullanarak özel bir sorgu hazırlayacağız.
function verileri_hazirla() {
global $wpdb;
// Güvenli sorgu yapısı
$results = $wpdb->get_results("SELECT ID, post_title, post_date FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish'", ARRAY_A);
return $results;
}
Bu fonksiyon, yayınlanmış tüm gönderileri bir dizi (array) olarak döndürür. Veritabanı sorgularında tablo isimlerini doğrudan yazmak yerine $wpdb değişkenini kullanmak, farklı tablo ön eklerine sahip WordPress kurulumlarında sistemin çalışmasını sağlar.
Adım 3: CSV Formatında Veri Oluşturma ve Başlıkları Ayarlama
Verileri çektikten sonra, tarayıcının bu veriyi bir dosya olarak algılaması için doğru HTTP başlıklarını (headers) göndermemiz gerekir. Ardından PHP'nin php://output akışını kullanarak veriyi CSV formatında yazdıracağız.
add_action('template_redirect', 'ozel_export_csv_handler');
function ozel_export_csv_handler() {
if (get_query_var('export_data')) {
// Yetki kontrolü (sadece yöneticiler)
if (!current_user_can('manage_options')) {
wp_die('Bu sayfaya erişim yetkiniz yok.');
}
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=veri-disa-aktar.csv');
$output = fopen('php://output', 'w');
fputcsv($output, array('ID', 'Başlık', 'Tarih'));
$data = verileri_hazirla();
foreach ($data as $row) {
fputcsv($output, $row);
}
fclose($output);
exit;
}
}
Burada template_redirect kancasını (hook) kullanıyoruz. Bu kanca, WordPress şablonu yüklenmeden önce çalışır ve veriyi doğrudan çıktıya basarak sayfa içeriğinin bozulmasını engeller.
Adım 4: Güvenlik ve Yetkilendirme Kontrolleri
Dinamik veri dışa aktarma sistemlerinde en büyük risk, yetkisiz kişilerin verilerinize erişmesidir. Yukarıdaki kodda current_user_can('manage_options') kullanarak sadece yönetici yetkisine sahip kişilerin bu dosyayı indirmesini sağladık.
Kritik Uyarı: Üretim ortamında (production) veri dışa aktarma sistemleri kullanırken, mutlaka bir "nonce" (number used once) veya özel bir API anahtarı ekleyerek isteklerin doğruluğunu onaylayın. Aksi takdirde, verileriniz brute-force saldırılarına açık hale gelebilir.
Adım 5: Performans Optimizasyonu ve Büyük Veri Yönetimi
Veritabanınızda binlerce kayıt varsa, tek bir sorguda tüm veriyi çekmek bellek (memory) sorunlarına yol açabilir. Bu durumda "chunking" (parçalara bölme) yöntemini kullanmalısınız.
// Büyük veri seti için döngü örneği
$offset = 0;
$limit = 100;
while (true) {
$results = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->posts} LIMIT %d OFFSET %d", $limit, $offset), ARRAY_A);
if (empty($results)) break;
foreach ($results as $row) {
fputcsv($output, $row);
}
$offset += $limit;
}
Bu yöntem, belleği yormadan verileri küçük parçalar halinde işler ve dışa aktarma işleminin zaman aşımına uğramasını engeller.
Veri Dışa Aktarma Yöntemleri Karşılaştırması
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| PHP/CSV (Özel) | Hızlı, esnek, hafif | Kod bilgisi gerektirir |
| Eklenti (Plugin) | Kolay kurulum | Performans kaybı, güvenlik riski |
| WP-CLI | Sunucu seviyesinde çok hızlı | SSH erişimi gerektirir |
Sıkça Sorulan Sorular
Özel dışa aktarma sistemi sitenin hızını yavaşlatır mı?
Doğru yazılmış bir sorgu ve chunking (parçalama) yöntemi kullanıldığında sitenin performansı etkilenmez. Ancak çok büyük veritabanlarında sorgu süresi uzayabilir.
Neden wp_die() yerine exit kullanıyoruz?
exit, WordPress'in geri kalanını (footer, sidebar vb.) yüklemesini durdurur. Bu, CSV dosyasının içine HTML kodlarının karışmasını engellemek için kritiktir.
Dışa aktarılan verilerde karakter sorunu yaşıyorum, ne yapmalıyım?
Başlık kısmında header('Content-Type: text/csv; charset=utf-8'); kullanıldığından ve veritabanı bağlantınızın UTF-8 olduğundan emin olun.
Bu sistemi belirli bir zamanlamaya bağlayabilir miyim?
Evet, WordPress Cron (WP-Cron) kullanarak bu fonksiyonu arka planda çalıştırabilir ve dosyayı sunucuda bir dizine kaydedebilirsiniz.
Veri dışa aktarma güvenliğini nasıl artırırım?
Sadece yetkili kullanıcıların erişimine izin verin, URL'ye bir "token" parametresi ekleyerek sadece o token ile erişim sağlanmasını zorunlu kılın.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Canlı sitenizde uygulamadan önce yedek almanız ve güvenlik testlerini yapmanız önerilir. Yanlış yapılandırılmış veritabanı sorguları veri kaybına veya güvenlik açıklarına yol açabilir.
Gelişmiş Hata Ayıklama ve Loglama Stratejileri
Özel dışa aktarma sistemlerinde karşılaşılan en büyük sorun, veritabanı sorgularının zaman aşımına uğraması veya beklenmedik veri tiplerinin CSV yapısını bozmasıdır. Bu tür durumları tespit etmek için sisteminize bir hata günlüğü (logging) mekanizması eklemek hayati önem taşır.
WordPress'in yerleşik error_log() fonksiyonunu kullanarak, dışa aktarma işleminin her aşamasını izleyebilirsiniz. Özellikle büyük veri setlerinde, işlemin nerede kesildiğini anlamak için aşağıdaki yapıyı kullanabilirsiniz:
function log_export_process($message) {
if (defined('WP_DEBUG') && WP_DEBUG) {
error_log('[Export System]: ' . $message);
}
}
// Kullanım örneği
log_export_process('Dışa aktarma başlatıldı: Kullanıcı ID ' . get_current_user_id());
if (empty($data)) {
log_export_process('Hata: Veritabanından veri çekilemedi.');
}
Alternatif Veri Formatları ve İleri İpuçları
CSV formatı çoğu zaman yeterli olsa da, bazı durumlarda verilerin hiyerarşik yapısını korumak için JSON veya XML formatlarına ihtiyaç duyabilirsiniz. Özellikle üçüncü taraf yazılımlarla entegrasyon yaparken, veriyi doğrudan bir akış (stream) olarak sunmak sunucu belleğini (RAM) korumanıza yardımcı olur.
Aşağıdaki örnekte, veriyi belleğe yüklemeden nasıl JSON formatında çıktı alabileceğinizi görebilirsiniz:
// Bellek dostu JSON dışa aktarma
header('Content-Type: application/json; charset=utf-8');
header('Content-Disposition: attachment; filename="data.json"');
$output = fopen('php://output', 'w');
$query = new WP_Query($args);
echo '[';
$first = true;
while ($query->have_posts()) {
$query->the_post();
if (!$first) echo ',';
echo json_encode(['id' => get_the_ID(), 'title' => get_the_title()]);
$first = false;
}
echo ']';
exit;
Büyük Veri Setleri İçin İleri Optimizasyon
Veritabanınızda yüz binlerce satır varsa, WP_Query yerine doğrudan $wpdb kullanarak ham SQL sorguları çalıştırmak performansı %40'a kadar artırabilir. Ayrıca, sorgularınızda SELECT * yerine sadece ihtiyacınız olan sütunları belirtmek, veritabanı yükünü ciddi oranda düşürür.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| WP_Query | WordPress standartlarına uygun, kolay | Büyük veride yavaş, yüksek RAM kullanımı |
| $wpdb->get_results | Hızlı, özelleştirilebilir | Güvenlik (SQL Injection) riski (prepare kullanılmalı) |
Her zaman $wpdb->prepare() kullanarak SQL Injection saldırılarına karşı koruma sağlamayı unutmayın. Dinamik verilerinizde kullanıcı girdisi varsa, bu adım sisteminizin güvenliği için tartışmasız en önemli kuraldır.
Sonuç
WordPress ile özel bir dinamik veri dışa aktarma sistemi kurmak, verileriniz üzerinde tam kontrol sahibi olmanızı sağlar. Bu rehberde, URL yapılandırmasından veritabanı sorgulamaya, dosya başlıklarından güvenlik önlemlerine kadar profesyonel bir akış izledik. Bir sonraki adım olarak, bu verileri CSV yerine JSON formatında sunan bir REST API uç noktası oluşturmayı deneyebilir veya verileri doğrudan Google Sheets gibi harici servislere gönderen bir otomasyon geliştirebilirsiniz.

Yorumlar (0)
Yorum Yaz