Buyukweb
E-Ticarette Ürün Öneri Sistemleri: Ne Zaman Kurar, Nasıl Çalıştırırsınız?

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.

Büyükweb Editör EkibiHosting, Sunucu ve Sistem Yönetimi Editörü12 dakika okuma

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:

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:

#ürün önerileri#kişiselleştirme#collaborative filtering#woocommerce#e-ticaret ai

Bu yazıyı paylaş