Gereksinimler ve Ön Hazırlık
Bu projeyi hayata geçirmek için temel düzeyde PHP, JavaScript (ES6+) ve WordPress'in Hooks (kanca) yapısı hakkında bilgi sahibi olmanız gerekir. Çalışma ortamınızda şu gereksinimlerin karşılandığından emin olun:
- WordPress 6.5 veya üzeri bir sürüm.
- PHP 8.1 veya üzeri (daha yüksek performans ve güvenlik için).
- Bir döviz kuru sağlayıcısı API anahtarı (Örn: ExchangeRate-API veya Open Exchange Rates).
- Güvenli bir geliştirme ortamı (LocalWP veya benzeri bir yerel sunucu).
Uyarı: Canlı sitenizde deneme yapmadan önce mutlaka yedek alınız. Kodlarınızı doğrudan functions.php dosyasına eklemek yerine, özel bir eklenti oluşturarak yönetmek çok daha sürdürülebilir bir yöntemdir.
Adım 1: Döviz Kurlarını API ile Çekme ve Önbelleğe Alma
Dış API'ye her sayfa yüklenişinde istek atmak, sitenizi yavaşlatır ve API limitlerinizi hızla tüketir. Bu nedenle, WordPress'in Transient API özelliğini kullanarak verileri belirli aralıklarla önbelleğe almalıyız.
function get_exchange_rates() {
$rates = get_transient('custom_currency_rates');
if (false === $rates) {
$api_url = 'https://v6.exchangerate-api.com/v6/YOUR_API_KEY/latest/USD';
$response = wp_remote_get($api_url);
if (is_wp_error($response)) return false;
$body = json_decode(wp_remote_retrieve_body($response), true);
$rates = $body['conversion_rates'];
set_transient('custom_currency_rates', $rates, 12 * HOUR_IN_SECONDS);
}
return $rates;
}
Yukarıdaki kod, wp_remote_get fonksiyonu ile API'den veriyi çeker ve 12 saat boyunca veritabanında saklar. Bu sayede sunucu üzerindeki yükü ciddi oranda azaltmış olursunuz.
Adım 2: Kullanıcı Seçimini Yönetmek İçin Cookie Kullanımı
Kullanıcının seçtiği para birimini oturum boyunca hatırlamak için çerezleri (cookies) kullanacağız. PHP tarafında çerez set etmek, sayfa yüklenmeden önce para birimini belirlememize olanak tanır.
function set_currency_cookie() {
if (isset($_GET['currency'])) {
$currency = sanitize_text_field($_GET['currency']);
setcookie('user_currency', $currency, time() + (86400 * 30), COOKIEPATH, COOKIE_DOMAIN);
}
}
add_action('init', 'set_currency_cookie');
Burada sanitize_text_field kullanarak XSS (Cross-Site Scripting) saldırılarına karşı girdi temizliği yapıyoruz. Kullanıcıdan gelen veriyi asla doğrudan işlememelisiniz.
Adım 3: Fiyatları Dönüştüren PHP Fonksiyonu
Şimdi, veritabanındaki fiyatı alıp seçilen para birimine göre dönüştüren yardımcı bir fonksiyon yazalım. Bu fonksiyon, ürün fiyatlarını dinamik olarak hesaplayacaktır.
function convert_price($price) {
$rates = get_exchange_rates();
$currency = isset($_COOKIE['user_currency']) ? $_COOKIE['user_currency'] : 'USD';
if (isset($rates[$currency])) {
return $price * $rates[$currency];
}
return $price;
}
Bu fonksiyon, temel fiyatı (genellikle USD bazlı) alır ve mevcut kur ile çarparak yeni değeri döndürür. Bu yapıyı WooCommerce fiyat filtrelerine (woocommerce_get_price_html gibi) kolayca entegre edebilirsiniz.
Adım 4: JavaScript ile Dinamik Arayüz Güncelleme
Sayfayı yenilemeden fiyatları güncellemek için JavaScript kullanmak, kullanıcı deneyimini (UX) iyileştirir. Aşağıdaki kod, bir dropdown menüsünden seçim yapıldığında para birimini değiştirir.
document.addEventListener('DOMContentLoaded', function() {
const currencySelector = document.getElementById('currency-selector');
currencySelector.addEventListener('change', function() {
const selectedCurrency = this.value;
document.cookie = "user_currency=" + selectedCurrency + ";path=/";
location.reload();
});
});
Bu basit script, kullanıcı seçimi değiştirdiğinde çerezi günceller ve sayfayı yeniden yükleyerek yeni fiyatların sunucu tarafından doğru hesaplanmasını sağlar.
Adım 5: Güvenlik ve Performans Karşılaştırması
Dinamik para birimi dönüştürücünüzü kurarken kullanabileceğiniz farklı yöntemlerin karşılaştırması aşağıdadır:
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Transient API (Önerilen) | Yüksek performans, düşük API maliyeti | Veri 12 saat gecikmeli olabilir |
| Doğrudan API Sorgusu | Anlık kur bilgisi | Sunucu yavaşlaması ve API limit aşımı |
| Statik Veritabanı | Hızlı sorgu | Manuel güncelleme gerektirir |
Kritik Güvenlik Uyarısı: API anahtarınızı asla doğrudan JavaScript dosyalarına gömmeyin. API anahtarlarınızı her zamanwp-config.phpdosyasında bir sabit (constant) olarak tanımlayın vegetenv()ile çağırın. Ayrıca, tüm kullanıcı girdileriniesc_html()veyasanitize_text_field()ile temizlediğinizden emin olun.
Adım 6: Hata Ayıklama (Debugging) İpuçları
Sistemin çalışmadığı durumlarda şu adımları izleyin:
WP_DEBUGmodunu açarak PHP hatalarını kontrol edin.get_transient('custom_currency_rates')değerinin veritabanında oluşup oluşmadığını inceleyin.- Tarayıcı konsolunda (F12) JavaScript hatalarının olup olmadığını kontrol edin.
- API sağlayıcısının yanıtını
error_log()fonksiyonu ile sunucu loglarına yazdırarak gelen veriyi doğrulayın.
Sıkça Sorulan Sorular
Döviz kurları ne kadar sürede güncellenmeli?
Genel e-ticaret siteleri için günde 1 veya 2 kez güncelleme yeterlidir. Çok yüksek hacimli işlemlerde ise API limitleriniz elverdiği sürece 1 saatlik aralıklar tercih edilebilir.
Bu yöntem WooCommerce ile uyumlu mu?
Evet, yukarıdaki convert_price fonksiyonunu WooCommerce'in woocommerce_get_price filtresine bağlayarak tüm mağaza fiyatlarını otomatik dönüştürebilirsiniz.
API anahtarım çalınırsa ne yapmalıyım?
Hemen API sağlayıcınızın paneline girerek anahtarı iptal edin ve yenisini oluşturun. Ardından wp-config.php dosyanızdaki eski anahtarı güncelleyin.
Neden JavaScript yerine sadece PHP kullanmıyoruz?
PHP sunucu tarafında çalışır, ancak kullanıcı arayüzündeki etkileşimleri (seçim yapma, anlık değişim) yönetmek için JavaScript zorunludur. Hibrit bir yapı en iyi performansı verir.
Fiyatlarda yuvarlama hatası olur mu?
Evet, çarpma işlemlerinde küsuratlı sayılar oluşabilir. round($price, 2) fonksiyonunu kullanarak fiyatları her zaman iki basamağa yuvarlamalısınız.
Finansal Sorumluluk Reddi: Bu makalede sunulan kodlar, teknik bir eğitim amacı taşımaktadır. Döviz kurları, piyasa koşullarına göre anlık olarak değişebilir. Bu sistem, herhangi bir finansal işlem garantisi içermez ve bir yatırım tavsiyesi değildir. Gerçek ticari işlemlerde, kur farklarından kaynaklanabilecek kayıpları önlemek için her zaman güncel verileri ve profesyonel muhasebe çözümlerini kullanın.
Kod Güvenliği Sorumluluk Reddi: Paylaşılan kod örneklerinin üretim (production) ortamında kullanılmadan önce güvenlik denetiminden geçirilmesi kullanıcının sorumluluğundadır. SQL Injection, XSS ve CSRF gibi yaygın güvenlik açıklarına karşı WordPress'in yerleşik güvenlik fonksiyonlarını (sanitize, escape, prepare) kullanmaya özen gösterin.
Gelişmiş Senaryo: IP Tabanlı Otomatik Para Birimi Algılama
Kullanıcıların manuel seçim yapmasını beklemeden, ziyaretçinin bulunduğu ülkeye göre para birimini otomatik olarak belirlemek dönüşüm oranlarını ciddi oranda artırır. Bu işlem için WordPress'in $_SERVER['HTTP_CF_IPCOUNTRY'] (Cloudflare kullanıyorsanız) veya GeoIP veritabanlarını kullanabilirsiniz.
Aşağıdaki örnek, kullanıcının IP adresinden gelen ülke koduna göre varsayılan para birimini belirleyen bir mantık sunar:
function get_currency_by_ip() {
// Cloudflare IP ülke başlığı örneği
$country_code = isset($_SERVER['HTTP_CF_IPCOUNTRY']) ? $_SERVER['HTTP_CF_IPCOUNTRY'] : 'TR';
$mapping = [
'TR' => 'TRY',
'US' => 'USD',
'GB' => 'GBP',
'DE' => 'EUR'
];
return isset($mapping[$country_code]) ? $mapping[$country_code] : 'USD';
}
// Cookie yoksa otomatik ata
if (!isset($_COOKIE['user_currency'])) {
$default_currency = get_currency_by_ip();
setcookie('user_currency', $default_currency, time() + (86400 * 30), "/");
}
Performans Optimizasyonu ve Önbellek Stratejileri
Dış API çağrıları sitenizin yüklenme süresini (TTFB) doğrudan etkiler. Eğer her sayfa yüklenişinde API'ye istek atarsanız, siteniz yavaşlayacak ve API limitlerinize hızlıca ulaşacaksınız. Bu sorunu aşmak için WordPress Transient API'sini verimli kullanmalısınız.
Önbellek Süresini Dinamik Yönetme
Döviz kurları genellikle gün içinde çok sık değişmez. Bu nedenle veriyi 12 saatlik periyotlarla önbelleğe almak en sağlıklı yöntemdir. Aşağıdaki kod bloğu, verinin önbellekte olup olmadığını kontrol eder ve yoksa API'yi tetikler:
function get_cached_exchange_rates() {
$rates = get_transient('daily_exchange_rates');
if (false === $rates) {
// API çağrısı yap
$response = wp_remote_get('https://api.exchangerate-api.com/v4/latest/USD');
$data = json_decode(wp_remote_retrieve_body($response), true);
$rates = $data['rates'];
// 12 saat boyunca sakla
set_transient('daily_exchange_rates', $rates, 12 * HOUR_IN_SECONDS);
}
return $rates;
}
Veritabanı Sorgularını Azaltma
Dönüştürücü sisteminizde her fiyat hesaplaması için veritabanına gitmek yerine, kur değerlerini bir kez çekip PHP değişkeni olarak bellekte tutun. Ayrıca, get_option yerine transient kullanmak, veritabanı yükünü wp_options tablosundan ayırarak performansı artırır.
Dağıtım (Deployment) ve Ölçeklendirme İpuçları
Projenizi canlıya alırken şu kontrol listesini uyguladığınızdan emin olun:
- SSL Zorunluluğu: API anahtarlarınızın ve çerezlerinizin güvenliği için sitenizin HTTPS üzerinden çalıştığından emin olun.
- Hata Loglama: API servisinin çöktüğü durumlar için
error_log()fonksiyonu ile özel bir log dosyası tutun. - CDN Uyumluluğu: Eğer Cloudflare veya benzeri bir CDN kullanıyorsanız, çerezlerin önbelleğe alınmadığından emin olun (Bypass cache for cookies).
- Yedekleme: API servisinin erişilemez olduğu durumlar için sisteminize "fallback" (varsayılan) bir kur değerleri dizisi ekleyin.
Profesyonel İpucu: Eğer yüksek trafikli bir e-ticaret siteniz varsa, API'den gelen verileri her 12 saatte bir arka plan görevi (WP-Cron) ile çekerek kullanıcı deneyimini kesintisiz hale getirebilirsiniz.
Sonuç
WordPress ile özel bir dinamik çoklu para birimi dönüştürücü oluşturmak, sitenize profesyonel bir dokunuş katar ve müşteri memnuniyetini artırır. Bu rehberde öğrendiğiniz Transient API kullanımı, çerez yönetimi ve güvenli API entegrasyonu, WordPress geliştirme yeteneklerinizi bir üst seviyeye taşıyacaktır. Bir sonraki adım olarak, bu sisteme otomatik vergi hesaplamaları veya kullanıcının IP adresine göre otomatik para birimi atama özelliklerini ekleyerek projenizi daha da geliştirebilirsiniz.


Yorumlar (0)
Yorum Yaz