
E-Ticarette Ürün Öneri Sistemleri: Ne Zaman Kurar, Nasıl Çalıştırırsınız?
WooCommerce için ürün öneri sistemi rehberi: collaborative filtering, content-based, session-based algoritmalar, Redis cache optimizasyonu ve Python tabanlı ML entegrasyonu.
E-Ticarette Ürün Öneri Sistemleri: Ne Zaman Kurar, Nasıl Çalıştırırsınız?
"Sepete eklenen ürünle 'bu ürünü alanlar şunu da aldı' önerisi gerçekten satışı artırıyor mu?" Bu soruyu e-ticaret danışmanlık görüşmelerinde sık duyuyoruz. Kısa yanıt: evet, artırıyor — ama her mağaza için aynı karmaşıklıkta bir sistem kurmak gerekmiyor. 100 ürünlü küçük bir WooCommerce mağazası ile 50.000 ürünlü bir katalog tamamen farklı yaklaşımlar istiyor. Bu yazıda öneri sistemlerinin nasıl çalıştığını, hangi durumda ne kurmanız gerektiğini ve Buyukweb altyapısında bunları nasıl hayata geçireceğinizi aktarıyoruz.
Buyukweb perspektifi: cPanel hosting paketlerimizde LiteSpeed + MariaDB 10.6 + Redis Object Cache kombinasyonu aktif. WooCommerce öneri sorguları Redis cache'te yaşadığında DB her sayfa yüklemesinde tekrar sorgulanmıyor; 50-100 ms TTFB ile öneri widget'ları yükleniyor. Orta ölçek öneri motoru self-host etmek isteyenler için VDS paketlerimiz (₺500/ay'dan) CPU+RAM odaklı, embedding ve k-NN inference'a yeterli performans sunar.
Öneri Sistemleri Nasıl Çalışır?
Temel mantık basit: kullanıcı verisini (bakma, satın alma, sepete ekleme) ve ürün verisini (kategori, etiket, fiyat, özellik) analiz edip "bu kişiye şu ürünü göster" kararı veriliyor. Algoritma türleri bu verinin nasıl kullanıldığını belirliyor.
Algoritma Türleri Karşılaştırması
| Algoritma | Nasıl Çalışır | Veri Gereksinimi | WooCommerce Uygulaması |
|---|---|---|---|
| Rule-based | Elle tanımlı kurallar: "elektronik + aksesuarlar kategorisi" | Sıfır (kural yeterli) | "İlgili ürünler" widget, elle etiketleme |
| Popularity-based | En çok satılan/en çok görüntülenen öner | 100+ sipariş yeterli | Best-seller widget, WooCommerce orderby=popularity |
| Content-based filtering | Ürün özellikleri benzerliğine göre: kategori, etiket, fiyat aralığı | Ürün meta verisi yeterli | Kategori bazlı ilgili ürün sorgusu |
| Collaborative filtering | "Bu ürünü alanlar şunu da aldı" — kullanıcı davranışı benzerliği | 10.000+ sipariş, 1.000+ aktif kullanıcı | Sipariş tablosunu madencileştiren özel sorgu veya ML |
| Session-based | Aktif oturumda gezilen ürünlere göre anlık öneri | Oturum verisi yeterli | Son görüntülenenleri takip eden PHP/JS |
| Matrix factorization | Kullanıcı-ürün matrisini ayrıştırır; gizli faktörler çıkarır | Büyük veri seti (100K+ etkileşim) | Python servisi, WooCommerce API |
| Hybrid (karma) | Content-based + collaborative birlikte | Orta-büyük veri seti | İki yöntemi birleştiren özel mimari |
Dürüst "Tercih Etmeyin" Notu
100-500 ürünlü bir mağaza için collaborative filtering kurmaya gerek yok. Bunun nedeni cold-start problemi: yeterli etkileşim verisi olmadan algoritma anlamlı sonuç üretemiyor; "bu ürünü alanlar bunu da aldı" bloğu ya boş kalıyor ya da tesadüfi öneriyle dolduruluyor. ML modeli kurmadan önce şu eşikleri geçiyor olmalısınız:
- 1.000+ aktif kullanıcı (aylık)
- 10.000+ ürün tıklaması/görüntülenme
- 500+ farklı sipariş (unique müşteri)
Bu sayılara ulaşana kadar manuel kurallar + popularity-based + content-based üçlüsü hem daha ucuz hem daha iyi sonuç verir.
WooCommerce'de Öneri Uygulamaları
1. İçerik Tabanlı Öneri: Kategoriye Göre İlgili Ürünler
En basit ve en güvenilir yaklaşım. Mevcut ürünle aynı kategoriden ürünleri getir.
<?php
// Kategoriye göre ilgili ürünleri getir
function bw_get_related_by_category( int $product_id, int $limit = 4 ): array {
$product = wc_get_product( $product_id );
if ( ! $product ) { return []; }
$cat_slugs = array_map(
fn( $id ) => get_term( $id, 'product_cat' )->slug,
array_slice( $product->get_category_ids(), 0, 2 )
);
return wc_get_products( [
'category' => $cat_slugs,
'exclude' => [ $product_id ],
'limit' => $limit,
'status' => 'publish',
'orderby' => 'popularity',
] );
}
2. Sipariş Tabanlı "Birlikte Alanlar" — SQL Sorgusu
Collaborative filtering'in WooCommerce'deki manuel versiyonu. Karmaşık ML gerektirmiyor; sipariş tablosunu sorgula, aynı siparişte hangi ürünler birlikte yer almış bul.
-- Belirli bir ürünle (product_id = 42) birlikte en sık sipariş edilen ürünler
SELECT
oim2.meta_value AS co_product_id,
COUNT(*) AS co_count
FROM wp_woocommerce_order_items oi1
JOIN wp_woocommerce_order_itemmeta oim1
ON oi1.order_item_id = oim1.order_item_id
AND oim1.meta_key = '_product_id'
AND oim1.meta_value = '42'
JOIN wp_woocommerce_order_items oi2
ON oi1.order_id = oi2.order_id
AND oi2.order_item_id <> oi1.order_item_id
JOIN wp_woocommerce_order_itemmeta oim2
ON oi2.order_item_id = oim2.order_item_id
AND oim2.meta_key = '_product_id'
AND oim2.meta_value <> '42'
GROUP BY co_product_id
ORDER BY co_count DESC
LIMIT 4;
Bu sorguyu her sayfa yüklemesinde çalıştırmak yerine Redis'e önbelleğe alın; TTL 1 saat yeterli.
<?php
function bw_get_frequently_bought_together( int $product_id, int $limit = 3 ): array {
$cache_key = "bw_fbt_{$product_id}";
$cached = wp_cache_get( $cache_key, 'bw_recommendations' );
if ( false !== $cached ) { return $cached; }
global $wpdb;
$ids = $wpdb->get_col( $wpdb->prepare(
"SELECT oim2.meta_value
FROM {$wpdb->prefix}woocommerce_order_items oi1
JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim1
ON oi1.order_item_id = oim1.order_item_id
AND oim1.meta_key = '_product_id' AND oim1.meta_value = %s
JOIN {$wpdb->prefix}woocommerce_order_items oi2
ON oi1.order_id = oi2.order_id AND oi2.order_item_id <> oi1.order_item_id
JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim2
ON oi2.order_item_id = oim2.order_item_id
AND oim2.meta_key = '_product_id' AND oim2.meta_value <> %s
GROUP BY oim2.meta_value ORDER BY COUNT(*) DESC LIMIT %d",
$product_id, $product_id, $limit
) );
$products = array_filter( array_map( 'wc_get_product', $ids ) );
wp_cache_set( $cache_key, $products, 'bw_recommendations', HOUR_IN_SECONDS );
return $products;
}
3. Oturum Tabanlı: Son Görüntülenenlere Göre Öneri
Ziyaretçi oturumunu takip ederek "son baktıklarına benzer ürünler" göster. Giriş yapmış kullanıcılara kişisel, giriş yapmamışlara genel best-seller.
<?php
// Ürün görüntülemeyi kaydet
add_action( 'template_redirect', function() {
if ( ! is_product() || ! ( $uid = get_current_user_id() ) ) { return; }
$viewed = (array) get_user_meta( $uid, '_bw_recently_viewed', true );
$viewed = array_values( array_diff( $viewed, [ get_the_ID() ] ) );
array_unshift( $viewed, get_the_ID() );
update_user_meta( $uid, '_bw_recently_viewed', array_slice( $viewed, 0, 20 ) );
} );
// Son görüntülenen kategorilere göre öneri
function bw_get_session_recommendations( int $user_id, int $limit = 6 ): array {
$viewed = (array) get_user_meta( $user_id, '_bw_recently_viewed', true );
if ( empty( $viewed ) ) {
return wc_get_products( [ 'limit' => $limit, 'orderby' => 'popularity', 'status' => 'publish' ] );
}
$cat_ids = [];
foreach ( array_slice( $viewed, 0, 5 ) as $pid ) {
$p = wc_get_product( $pid );
if ( $p ) { $cat_ids = array_merge( $cat_ids, $p->get_category_ids() ); }
}
return wc_get_products( [
'category' => array_map( fn( $id ) => get_term( $id, 'product_cat' )->slug, array_unique( $cat_ids ) ),
'exclude' => $viewed, 'limit' => $limit, 'orderby' => 'rand', 'status' => 'publish',
] );
}
Python ile Collaborative Filtering (Orta Ölçek)
Sipariş veriniz 10.000+ satıra ulaştığında Python tabanlı bir öneri motoru kurmak anlamlı. Surprise kütüphanesi WooCommerce sipariş verisini matris ayrıştırma (SVD) ile işler.
# requirements: scikit-surprise, pandas, mysql-connector-python
import pandas as pd, mysql.connector, pickle
from surprise import SVD, Dataset, Reader
from surprise.model_selection import cross_validate
conn = mysql.connector.connect(host="localhost", user="wp_user",
password="SIFRE", database="wp_veritabani")
query = """
SELECT oim_user.meta_value AS user_id,
oim_prod.meta_value AS product_id,
COUNT(*) AS purchase_count
FROM wp_woocommerce_order_items oi
JOIN wp_woocommerce_order_itemmeta oim_prod
ON oi.order_item_id = oim_prod.order_item_id
AND oim_prod.meta_key = '_product_id'
JOIN wp_posts p ON oi.order_id = p.ID
JOIN wp_postmeta oim_user ON p.ID = oim_user.post_id
AND oim_user.meta_key = '_customer_user'
WHERE p.post_type = 'shop_order'
AND p.post_status IN ('wc-completed', 'wc-processing')
GROUP BY user_id, product_id
HAVING user_id > 0
"""
df = pd.read_sql(query, conn); conn.close()
reader = Reader(rating_scale=(1, df['purchase_count'].clip(upper=5).max()))
data = Dataset.load_from_df(df[['user_id', 'product_id', 'purchase_count']], reader)
algo = SVD(n_factors=50, n_epochs=30, lr_all=0.005, reg_all=0.02)
cross_validate(algo, data, measures=['RMSE'], cv=3, verbose=True)
algo.fit(data.build_full_trainset())
with open('/opt/bw-recommender/model.pkl', 'wb') as f:
pickle.dump(algo, f)
print("Model eğitildi.")
Bu modeli Flask veya FastAPI ile sararak WooCommerce'in çağırabileceği bir REST endpoint'e dönüştürürsünüz. Buyukweb VDS (₺500/ay'dan) bu tür Python servisini barındırmak için yeterli; GPU gerekmez, CPU+RAM yeterli.
Öneri Sistemi Performans Metrikleri
Öneri sistemi kurduğunuzda ne ölçeceksiniz? Şu üç metriği takip edin:
| Metrik | Tanım | İyi Eşik | Ölçüm Yöntemi |
|---|---|---|---|
| CTR (Click-Through Rate) | Öneri gösterilen ziyaretçi / öneri tıklayanlar | %5–15 | GA4 event takibi |
| Conversion Uplift | Öneri tıklayan vs. tıklamayan grup dönüşüm farkı | %10–30+ | A/B testi |
| AOV (Average Order Value) | Öneri kullanan siparişlerin ortalama değeri | Baseline'dan +%15 | WooCommerce raporu |
| Coverage | Kataloğun kaçta biri öneri alıyor | >%60 | Ürün bazlı log |
| Diversity | Önerilerde aynı ürünün tekrar oranı | Düşük olmalı | Log analizi |
A/B Testi ile Öneri Optimizasyonu
Hangi öneri algoritmasının daha iyi çalıştığını kör test olmadan bilemezsiniz. Basit bir A/B test yapısı:
<?php
// Kullanıcıyı tutarlı A/B grubuna ata (aynı kullanıcı her zaman aynı grubu görür)
function bw_get_ab_variant( int $user_id ): string {
return ( crc32( $user_id . date( 'Ymd' ) ) % 2 === 0 ) ? 'A' : 'B';
}
// WooCommerce ilgili ürünler filtresine bağla
add_filter( 'woocommerce_related_products', function( array $ids, int $product_id ) {
$uid = get_current_user_id();
if ( ! $uid ) { return $ids; }
if ( bw_get_ab_variant( $uid ) === 'B' ) {
$fbt = bw_get_frequently_bought_together( $product_id, 4 );
if ( ! empty( $fbt ) ) {
return array_map( fn( $p ) => $p->get_id(), $fbt );
}
}
return $ids; // A grubu: orijinal öneri
}, 10, 2 );
GA4'te hangi varyantın daha fazla dönüşüm aldığını izlemek için her öneri tıklamasında event gönderin:
// Öneri tıklama event'i — GA4
document.querySelectorAll('.bw-recommendation-card').forEach(function(card) {
card.addEventListener('click', function() {
gtag('event', 'recommendation_click', {
item_id: card.dataset.productId,
variant: card.dataset.abVariant, // 'A' veya 'B'
position: parseInt(card.dataset.position, 10),
rec_type: card.dataset.recType // 'fbt', 'related', 'session'
});
});
});
WooCommerce Öneri Eklentileri
Kendi kodunuzu yazmak istemiyorsanız eklentilerle hızlı başlayabilirsiniz:
| Eklenti | Yaklaşım | Avantaj | Dikkat |
|---|---|---|---|
| WooCommerce — İlgili Ürünler (built-in) | Content-based (kategori+etiket) | Sıfır maliyet, anında aktif | Kişiselleştirme yok |
| Smart Offers (WooThemes) | Kural tabanlı upsell/cross-sell tetikleyici | Sepet/ödeme sayfası odaklı, BOGO | Fiyatlı |
| YITH WooCommerce Frequently Bought Together | Item-to-item sipariş analizi | Hızlı kurulum, görsel | Performans gözlemlenmeli |
| Recommendation Engine for WooCommerce | Hybrid (collaborative + content) | ML benzeri sonuç | Kalabalık katalog için ağır |
| Özel geliştirme | Her türlü algoritma | Tam kontrol | Geliştirme maliyeti |
Eklenti seçerken dikkat: Büyük kataloglarda (5.000+ ürün) bazı eklentiler sipariş tablosunu her sayfa yüklemesinde tarar; Redis Object Cache aktif değilse DB yükü ciddi artar. Buyukweb cPanel paketlerinde Redis aktivasyonu destek hattından yapılıyor; etkinleştirmeden öneri eklentisi kurmayın.
Buyukweb Altyapısında Öneri Sistemi Mimarisi
cPanel Hosting + WooCommerce
[Ziyaretçi] → [LiteSpeed] → [WooCommerce PHP] → Redis Object Cache → Öneri Bloğu
↘ Cache Miss → MariaDB 10.6 → Redis'e yaz
Redis Object Cache eklentisi kurulduğunda bw_get_frequently_bought_together() sonuçları 1 saat Redis'te saklanır. İkinci çağrıda DB sorgusu yok; 50-100 ms TTFB. Buyukweb cPanel paketlerinde Redis aktivasyonu destek hattından yapılıyor.
VDS + Python Öneri Servisi
Sipariş verisi 10.000+ satıra ulaştığında ve ML algoritması gerektiğinde, Buyukweb VDS (₺500/ay'dan) Python Flask servisini barındırmak için yeterli. GPU gerekmez; SVD ve k-NN modeli CPU üzerinde milisaniyeler içinde inference verir. Self-host yaklaşım: tam kontrol, KVKK uyum kolaylığı, aylık sabit maliyet.
KVKK ve Veri Uyumu
Kişiselleştirilmiş öneri sistemi kullanıcı davranış verisi işlediğinden KVKK kapsamına girer. Uyumlu olmak için: (1) KVKK aydınlatma metninde "gezinme ve satın alma geçmişi kişiselleştirilmiş öneriler için işleniyor" ifadesi yer almalı; (2) kullanıcıya opt-out imkanı tanınmalı — o durumda popularity-based öneriye geri dönün; (3) kullanıcı ID + ürün ID + zaman damgası dışında ek veri işlemekten kaçının; (4) etkileşim verisi genellikle 6-12 ay saklama yeterlidir. Self-host model (Buyukweb VDS) veriyi Türkiye sınırlarında tutar; büyük bulut sağlayıcılarına aktarım KVKK Madde 9 gereklilikleri doğurur.
Sıkça Sorulan Sorular
Collaborative filtering mi, content-based filtering mi?
Veri varsa collaborative, veri yoksa content-based. Collaborative filtering ("bu ürünü alanlar bunu da aldı") için 1.000+ aktif kullanıcı ve 10.000+ etkileşim gerekiyor; altındaysa cold-start nedeniyle kötü öneri üretir. Content-based filtering (kategori, etiket, fiyat benzerliği) sıfır kullanıcı verisiyle başlar; yeni açılmış mağazalar için doğru seçim.
Cold-start problemi ne demek, nasıl aşılır?
Yeni ürün veya yeni kullanıcı için yeterli veri yok; sistem öneri üretemiyor. Yeni ürün için: manuel etiket + kategori doğru girilirse content-based devreye girer. Yeni kullanıcı için: ilk birkaç oturumda popularity-based (en çok satılan) göster; 3-5 etkileşim sonrasında kişisel öneri açılır.
A/B testi yapmadan öneri sistemini nasıl değerlendiririm?
Değerlendiremezsiniz — en azından kaba ölçümle. Minimum kontrol yöntemi: öneri widget'ına tıklayan vs. tıklamayan kullanıcı gruplarının sepet ortalamasını karşılaştırın (GA4 segment karşılaştırması). Daha sağlıklısı: yukarıdaki A/B test kodunu 2-4 hafta çalıştırın, gruplardaki conversion uplift farkına bakın.
Öneri sistemi ROI'si nasıl ölçülür?
Temel formül: (Öneri kaynaklı ek gelir) / (Kurulum + işletme maliyeti). GA4'te recommendation_click event'inden dönüşüm değerini takip edin. %10 AOV artışı, 1.000 siparişte 500 ₺ ortalama sepette yıllık 50.000 ₺ ek gelir anlamına gelir.
WooCommerce'de öneri sistemi DB'yi yavaşlatır mı?
Yavaşlatabilir — Redis olmadan. Sipariş tablosu büyüdüğünde her sayfa yüklemesinde "birlikte alanlar" sorgusu ciddi yük oluşturur. Çözüm: Redis Object Cache ile öneri sonuçlarını önbelleğe alın (1 saat TTL yeterli). Buyukweb cPanel paketlerinde Redis aktivasyonu destek hattından yapılıyor.
ML modeli kurmak için hangi Python kütüphaneleri önerilir?
Başlangıç için Surprise (scikit-surprise) en pratik seçim: kurulumu basit, SVD ve k-NN algoritmaları dahil, WooCommerce verisini pandas ile doğrudan besleyebilirsiniz. Daha gelişmiş senaryo için LightFM (hibrit öneri, örtük geri bildirim), büyük kataloglarda TensorFlow Recommenders (BERT4Rec, two-tower model) alternatif. Apache Mahout büyük veri altyapısı (Hadoop/Spark) gerektirir; KOBİ ölçeği için aşırı.
GDPR/KVKK ile öneri sistemi çakışır mı?
Çakışmaz, ama veri işleme bildirimi gerektirir. KVKK aydınlatma metninde açıklanmalı, opt-out imkanı tanınmalı. Self-host model (Buyukweb VDS) veriyi Türkiye'de tutar; büyük bulut sağlayıcılarına aktarım KVKK Madde 9 gereklilikleri doğurar.
Sonuç
Ürün öneri sistemi kurmanın önkoşulu veridir. 100 ürünlü, yeni açılmış bir mağaza için en doğru yatırım: ürün kategorilerini ve etiketlerini düzgün doldurmak, WooCommerce'in built-in "İlgili Ürünler" widget'ını etkinleştirmek, Redis Object Cache ile sorgu yükünü azaltmak. Veriler biriktikçe ve sipariş sayısı 500-1.000'i geçtikçe "birlikte alanlar" SQL sorgusu eklenebilir. 10.000+ sipariş ve 1.000+ aktif kullanıcı eşiği aşıldığında Python tabanlı collaborative filtering anlamlı hale gelir.
Buyukweb cPanel hosting'de Redis Object Cache, LiteSpeed ve MariaDB 10.6 bu sürecin her adımını destekler. Orta ölçek öneri motoru self-host etmek isteyenler için VDS paketlerimiz (₺500/ay'dan) Python servislerini çalıştırmaya yeterli. Teknik destek ve kurulum soruları için 0850 302 60 70 numaralı destek hattımıza ulaşabilirsiniz.
İlgili Büyükweb Hizmetleri
WooCommerce ve e-ticaret altyapısı için Türkiye lokasyonlu paketler:
- WooCommerce için WordPress Hosting
- E-Ticaret VDS
- cPanel Web Hosting
- VDS Sunucu
- Yüksek Hacim için Dedicated
Sorularınız için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz.
E-Ticaret İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:
