Gereksinimler ve Ön Hazırlık
Özel bir sepet modülü geliştirmek için sunucunuzda PHP 8.2 veya üzeri bir sürümün yüklü olması önerilir. Ayrıca WordPress'in güncel sürümünü kullanmanız, güvenlik yamalarından yararlanmanız açısından kritiktir.
- PHP 8.2+: Modern sözdizimi ve performans iyileştirmeleri için gereklidir.
- WordPress 6.5+: REST API ve AJAX entegrasyonu için stabil bir ortam sağlar.
- Child Theme (Alt Tema): Kodlarınızı doğrudan ana tema dosyalarına yazmak yerine, her zaman bir alt tema veya özel bir eklenti dosyası kullanın.
- Tarayıcı Konsolu: JavaScript hatalarını izlemek için Chrome Geliştirici Araçları.
WordPress Session Yönetimi ile Sepet Verisini Başlatma
WordPress varsayılan olarak PHP session'larını desteklemez. Bu nedenle, sepet verisini tutmak için WordPress'in yerleşik "Transient API" yapısını veya kullanıcı meta verilerini kullanabiliriz. Dinamik bir yapı için kullanıcı oturumunu takip etmek en sağlıklı yöntemdir.
// functions.php içerisine eklenecek kod
if ( ! session_id() ) {
session_start();
}
function sepeti_baslat() {
if ( ! isset( $_SESSION['ozel_sepet'] ) ) {
$_SESSION['ozel_sepet'] = array();
}
}
add_action( 'init', 'sepeti_baslat' );
Bu kod bloğu, her sayfa yüklendiğinde bir oturum başlatır ve eğer sepet henüz tanımlanmamışsa boş bir dizi oluşturur. Bu, sepetin kullanıcı tarayıcıyı kapatana kadar aktif kalmasını sağlar.
AJAX ile Dinamik Ürün Ekleme İşlemi
Sayfa yenilenmeden ürün eklemek için JavaScript (Fetch API) ve WordPress AJAX kancalarını kullanacağız. Bu yöntem, kullanıcı deneyimini (UX) doğrudan iyileştirir.
// JavaScript tarafı: sepete-ekle.js
document.getElementById('sepete-ekle-btn').addEventListener('click', function() {
let urunId = this.getAttribute('data-id');
fetch(ajaxurl, {
method: 'POST',
body: new URLSearchParams({
'action': 'urun_sepete_ekle',
'urun_id': urunId
})
})
.then(response => response.json())
.then(data => alert('Ürün sepete eklendi!'));
});
Yukarıdaki JavaScript kodu, butona tıklandığında sunucuya bir istek gönderir. ajaxurl değişkeni WordPress tarafından otomatik olarak tanımlanır ve isteklerin nereye gideceğini belirler.
Sunucu Tarafında Sepet Verisini İşleme
İstemciden gelen veriyi karşılamak ve güvenli bir şekilde oturuma kaydetmek için wp_ajax_ kancasını kullanmalıyız. Güvenlik için nonce (tek kullanımlık sayı) kontrolü yapılması zorunludur.
// functions.php içerisine eklenecek kod
add_action( 'wp_ajax_urun_sepete_ekle', 'urun_sepete_ekle_callback' );
add_action( 'wp_ajax_nopriv_urun_sepete_ekle', 'urun_sepete_ekle_callback' );
function urun_sepete_ekle_callback() {
$urun_id = intval( $_POST['urun_id'] );
if ( $urun_id > 0 ) {
$_SESSION['ozel_sepet'][] = $urun_id;
wp_send_json_success( array( 'mesaj' => 'Başarılı' ) );
}
wp_send_json_error( array( 'mesaj' => 'Hata' ) );
}
Bu fonksiyon, gelen verinin bir tam sayı (integer) olduğunu doğrular. wp_send_json_success, istemciye temiz bir JSON yanıtı döner.
Sepet Modülü Karşılaştırma Tablosu
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Session (Oturum) | Hızlı ve kolay uygulanır | Sunucu yükünü artırabilir |
| Transients API | Veritabanı tabanlı, kalıcı | Süresi dolduğunda veri silinir |
| Custom Database Table | Tam kontrol, ölçeklenebilir | Karmaşık sorgular gerektirir |
Güvenlik Uyarıları ve Veri Doğrulama
Kritik Güvenlik Uyarısı: Sepet işlemleri sırasında kullanıcıdan gelen hiçbir veriye doğrudan güvenmeyin.
intval(),sanitize_text_field()gibi WordPress güvenlik fonksiyonlarını mutlaka kullanın. Ayrıca XSS (Siteler Arası Betik Çalıştırma) saldırılarını engellemek için çıktılarıesc_html()veyaesc_attr()ile filtreleyin.
SQL Injection riskini önlemek için veritabanı işlemlerinde mutlaka $wpdb->prepare() metodunu kullanın. Kullanıcı oturumlarını yönetirken, oturum verilerinin gizliliğini korumak için HTTPS protokolünün aktif olduğundan emin olun.
Dinamik Sepet İçeriğini Görüntüleme
Sepetteki ürünleri listelemek için bir kısa kod (shortcode) oluşturabiliriz. Bu, sepetin herhangi bir sayfada görüntülenmesini sağlar.
function sepeti_goster_shortcode() {
if ( empty( $_SESSION['ozel_sepet'] ) ) {
return 'Sepetiniz boş.';
}
$cikti = '';
foreach ( $_SESSION['ozel_sepet'] as $id ) {
$cikti .= '- Ürün ID: ' . esc_html( $id ) . '
';
}
$cikti .= '
';
return $cikti;
}
add_shortcode( 'sepetim', 'sepeti_goster_shortcode' );
Bu fonksiyon, [sepetim] kısa kodunu yazan kullanıcılara sepetteki ürünlerin listesini sunar. esc_html kullanımı, olası bir XSS saldırısını engellemek için alınan bir önlemdir.
Sıkça Sorulan Sorular
Sepet verisi tarayıcı kapatılınca silinir mi?
Evet, PHP session'ları varsayılan olarak tarayıcı oturumu ile sınırlıdır. Kalıcı bir sepet istiyorsanız, veriyi veritabanına (user_meta) kaydetmelisiniz.
Neden WooCommerce kullanmıyoruz?
WooCommerce, büyük ölçekli mağazalar için harikadır ancak çok basit bir ürün listeleme veya özel bir "satın al" akışı için ağır gelebilir. Özel modül, performans ve esneklik sağlar.
AJAX istekleri neden 403 hatası veriyor?
Genellikle nonce doğrulaması eksik olduğu veya wp_ajax_nopriv_ kancası tanımlanmadığı için oluşur. İsteklerin yetkilendirilmiş olduğundan emin olun.
Sepet verisini veritabanında nerede tutmalıyım?
Kullanıcı giriş yapmışsa update_user_meta(), giriş yapmamışsa set_transient() fonksiyonlarını kullanmak en iyi pratiktir.
Sepet modülünü nasıl test ederim?
Öncelikle yerel bir geliştirme ortamında (LocalWP gibi) test edin. Tarayıcı ağ sekmesinden (Network Tab) AJAX yanıtlarını kontrol ederek verinin doğru gidip gittiğini gözlemleyin.
Sepet Verilerinin Performans Optimizasyonu ve Önbellekleme Stratejileri
Dinamik sepet modüllerinde en büyük performans darboğazı, her sayfa yenilemesinde veya AJAX isteğinde sunucunun veritabanı ile sürekli etkileşime girmesidir. WordPress'in Transient API yapısını kullanarak sepet verilerini belirli bir süre önbelleğe almak, sunucu üzerindeki yükü önemli ölçüde azaltacaktır.
Aşağıdaki örnekte, sepet verisini geçici olarak önbelleğe alan ve sadece değişiklik olduğunda güncelleyen bir yapı kuruyoruz:
function get_cached_cart_data($user_id) {
$transient_key = 'user_cart_' . $user_id;
$cart_data = get_transient($transient_key);
if (false === $cart_data) {
// Veritabanından veya session'dan veriyi çek
$cart_data = my_custom_get_cart_from_db($user_id);
set_transient($transient_key, $cart_data, 12 * HOUR_IN_SECONDS);
}
return $cart_data;
}
function update_cart_cache($user_id, $new_data) {
set_transient('user_cart_' . $user_id, $new_data, 12 * HOUR_IN_SECONDS);
}
Bu yöntemle, kullanıcının sepet içeriği her seferinde ağır sorgularla çekilmek yerine, hızlı bir şekilde önbellekten sunulur. Özellikle yüksek trafikli sitelerde bu yaklaşım, sunucu yanıt süresini (TTFB) milisaniyeler seviyesinde iyileştirebilir.
Sepet Modülünde Hata Ayıklama (Debugging) Teknikleri
Özel geliştirilen sepet modüllerinde en yaygın karşılaşılan sorunlar; AJAX yanıtlarının JSON formatında dönmemesi veya session verilerinin beklenmedik şekilde sıfırlanmasıdır. Geliştirme aşamasında hataları izlemek için WordPress'in hata ayıklama modunu aktif etmeli ve özel loglar oluşturmalısınız.
wp-config.php dosyanızda WP_DEBUG_LOG özelliğini aktif ettikten sonra, sepet işlemlerinizde aşağıdaki gibi özel loglama yaparak süreci takip edebilirsiniz:
function log_cart_action($message) {
if (defined('WP_DEBUG') && WP_DEBUG) {
error_log('[Sepet Modülü]: ' . $message);
}
}
// Kullanımı:
if (empty($_SESSION['cart'])) {
log_cart_action('Sepet boş olduğu için işlem iptal edildi.');
}
Yaygın Hata Senaryoları ve Çözümleri
- JSON Parse Hatası: AJAX yanıtı döndürülürken, PHP kodunuzun başına veya sonuna eklenen boşluklar veya uyarı mesajları (Notice) JSON formatını bozar. Her zaman
wp_send_json_success()veyawp_send_json_error()fonksiyonlarını kullanın. - Session Kaybı: Eğer sepet verisi sayfalar arası geçişte kayboluyorsa, sunucunuzdaki
session_start()fonksiyonunun WordPress'ininitkancasında doğru tetiklendiğinden emin olun. - Cache Çakışmaları: Varnish veya Redis gibi sunucu taraflı önbellek sistemleri, sepet verisinin kullanıcıya yanlış gösterilmesine neden olabilir. Sepet sayfalarını veya sepeti tetikleyen AJAX uç noktalarını (endpoints) mutlaka "bypass cache" listesine ekleyin.
Geliştirme sürecinde tarayıcınızın "Network" sekmesini kullanarak, gönderilen AJAX isteklerinin Payload kısmını ve sunucudan dönen Response verisini anlık olarak incelemek, mantıksal hataları bulmanızı hızlandıracaktır.
Sonuç
WordPress ile özel bir dinamik e-ticaret sepet modülü oluşturmak, sistemin çalışma mantığını anlamanıza ve gereksiz eklenti yükünden kurtulmanıza yardımcı olur. Bu rehberde öğrendiğiniz AJAX, Session ve Shortcode yapıları, WordPress geliştirme sürecinde en çok kullanılan temel taşlardır.
Bir sonraki adım olarak, bu sepet yapısına bir "Ödeme (Checkout)" sayfası entegre edebilir ve veritabanına sipariş kayıtlarını ekleyen bir yapı kurabilirsiniz. Unutmayın, her zaman güvenlik standartlarına uygun kod yazmak, projenizin uzun ömürlü olmasını sağlar.
Yasal Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Ticari bir e-ticaret sitesinde kullanılacak ödeme sistemleri ve kullanıcı verileri için PCI-DSS uyumluluğu ve veri gizliliği yasaları (KVKK/GDPR) konusunda uzman desteği almanız önerilir.


Yorumlar (0)
Yorum Yaz