WooCommerce Varyantlı Entegrasyon Problemi
Merhabalar,
WooCommerce ile oluturduğumuz bir sitemiz mevcut ve birde web tabanlı stok takip sistemimiz mevcut. İkisi arasında bir entegrasyon yapıyoruz ancak ürünlerimizin hepsi varyantlı olduğu için bazı problemler yaşamaktayız.Anlatımımı daha net anlaşılması için örnekler üzerinden yapacağım.
Ürünümüz örneğin atlet, biz bu atlet ürününü varyasyonlu şekilde woocommerce üzerinden oluşturuyoruz. S,M,L,XL bedenlerini varyant olarak kaydediyoruz ve temsili 333 TL olarak fiyat giriyoruz. Bu varyantları girerkende ürün SKU'sunu stok takip sistemimizdeki ile aynı SKU olarak giriyoruz.
Bildiğiniz üzere woocommerce veritabanında hem ana ürün için bir ID oluşturuyor hem de alt varyantlar için bir ID oluturuyor.
Örneğin;
Ana ürün : 1001
S Beden : 1002
M Beden : 1003
L Beden : 1004
XL Beden : 1005 ID'leri olduğunu farz edelim. Biz stok takip sistemimizden ürün stokkodu, fiyat ve stok miktarını barındıran bir XML yayınlıyoruz.
Daha sonra woocommerce sitemizde bir php kod çalıştırarak xml'i okuyup sırayla wp_postmeta ve wp_wc_product_meta_lookup tablolarında arama yapıp ürünün woocommerce'deki ID'sini öğrenip gene bu tablolardaki ilgili ürün ID'sindeki fiyat, stok bilgilerini güncelliyoruz.
Buraya kadar varyantların stok miktarı ve fiyatını güncellemekte hiçbir sorunumuz bulunmuyor. Ancak ana ürünü güncelleyemiyoruz yani verdiğim örnek üzerinden anlatacak olursak;
1002,1003,1004,1005 ID 'li varyantların fiyat ve stoğu güncelleniyor, kullanıcı bu varyantı seçip sepete eklediğinde ilgili fiyat zaten gözüküyor, ancak site anasayfasında ya da ürün sayfasında herhangi bir alt varyant seçmemişse ilk seferde girdiğimiz farazi fiyat olan 333 TL gözüküyor.
Not : ürünleri eklerken varsayılan varyant seçsekte bu şekilde oluyor. Eklenti ile en düşük olan varyantı ana ürün kabul et desekte genede 333 TL'nin gzükmesine engel olmaıyoruz.
Ürünü düzenlemeye girip bir değiiklik yapıp güncellediğimizde WC otamatik olarak en düşük varyantın fiyatını alıyor.
WooCommerce entegrasyon ya da WC ile detaylı uğraşan üstadlar konu hakkında fikir verebilir sorunumuzun çözümü için yardımcı olabilirse çok sevinirim.
İyi çalışmalar saygılarımla.
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (2)
Sorunumu çözebildim, araştırmalarım nihayetinde woocommerce'nin ana ürün ve varyant fiyatlarının wp_options tablosunda önbellekleme niteliğinde tuttuğunu ve buradaki satırın güncellenmesinin sadece ürünün panel üzerinden güncellenmesi ve yeni kayıt oluşturduğunda yapıldığını tespit ettim. Ben ise varyant stok ve fiyat bilgilerini entegrasyonum ile direkt veritabanı üzerinden değiştirdiğim için bu güncellemeyi yapmıyordu.
WooCommerce'de bulunan wc_delete_product_transients() fonksiyonu bu önbelleklemeyi güncelliyormuş. Buna istinaden aşağıdaki kod yardımıyla ürün stok ve fiyat bilgilerimi gncelledikten sonra fonksiyonu çağırıp sorunumu çözmüş oldum. Benzer sorun yaşayacaklar için kodu bıraya bırakmaktayım.
<?php
require_once('../wp-load.php');
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => -1,
'post_parent' => 0, // Sadece ana ürünleri almak için post_parent'ı 0 olarak ayarlayın
);
$products = get_posts( $args );
foreach ( $products as $product ) {
wc_delete_product_transients( $product->ID );
}
echo "Tüm ana ürünlerin fiyatları başarıyla güncellendi.";
?>
Merhabalar,
Öncelikle önerim direk veritabanı üzerinden çalışmak yerine entegrasyon için WooCommerce tarafından sağlanan API arayüzünü kullanmanızdır.
Sorunuza gelirsek, temelde bir ürünü varyantlı hale getirdiğiniz zaman ortada bir ana ürün kalmaz. Yani bir ayakkabının 38, 40, 42 numaralı varyantlı bir ürün olarak eklendiğini düşünün. Bu durumda hangisi ana ürün? Cevap hepsi. Bu yüzden varyantlarla çalışırken varyantlara ait SKU kodlarını baz alarak çalışmak gerekir.
Sizin durumunuzda sistemi bilmediğim için net bir şey söylemek zor, ancak görünen o ki veritabanı işlemlerinde bir yerleri eksik veya hatalı düzenliyorsunuz. Dolayısıyla ortaya böyle tuhaf bir durum çıkıyor. Kolay gelsin, umarım yardımı olur.