İlk olarak , sorunuzda gösterdiğiniz kodla tarif ettiğiniz hedefe hemen ulaşamazsınız. Neden bu kodla doğrudan bir yaklaşım olmadığını anlamak için woocommerce_related_products()
şu ana kadar yaptığınız şeyi - - kullandığınız şeye bir göz atmalısınız .
İkincisi , anlamak zorundasınız, aksi takdirde bir yanıt aldığınızdan emin olmak için kesinlikle hedefiniz olması gereken bir nokta sorusu soramazsınız. Bunun yanı sıra, Wordpress Geliştirme'nin temel olarak wordpress çekirdeği ile ilgili sorular üzerine kurulu olduğunu unutmayın - ilgileniyorsanız, bu Wordpress Geliştirme Meta üzerinde tartışılmaktadır, belirli bir konu Bizim wooes ve WPSE platform eklentilerinin geleceği . Bu nedenle, woocommerce gibi eklentiler hakkında sorular soruyorsanız, mümkün olduğunca temel işlevlerle ilgili hale getirmek için onu parçalamanız gerekir - bir sonraki noktaya bakın - insanların her eklentinin her ayrıntısını bilmelerini beklemediğiniz için kullanıyorsunuz.
Üçüncüsü , şimdi olanları daha derin bir kavrayışa sokalım. Dediğiniz gibi, woocommerce_related_products()
şimdi kullanıyorsunuz . Kaynağa bakarsanız, bu işlevin şablonu woocommerce_get_template()
almak için kullandığını görürsünüz related.php
. woocommerce_get_template()
yine woocommerce_locate_template()
şablonu bulmak için kullanır , ikincisi wordpress çekirdek işlevini kullanarak yapıyor locate_template()
.
Şimdi çekirdeğe geri bir bağlantı var, yukarıda bahsedilen ve umarım denetlenen woocommerce işlevlerinin temel işlevselliği genişletmek için sarıcılar olduğu gerçeğine yol açıyor. İşlevsel bağımlılıkları analiz ederek netleşen bir başka şey, daha önce söylediğim gibi, hedefinize ulaşmak için farklı bir yaklaşıma ihtiyacınız var, çünkü woocommerce_related_products()
- şimdi inkar edilemez açık - doğru olan değil.
Açıklamalarımla beni takip ettiyseniz ve şimdiye kadar okuduysanız, aradığınızı related.php
içerdiğini fark ettiniz. Özellikle kanca get_related()
içeren woocommerce_product_related_posts
ve temel işlevleri kullanan wp_get_post_terms()
ve get_posts()
- get_related()
bir dizi id almak için kullanılan işlev hakkında konuşuyorum . Ayrıca orada woocommerce_related_products_args
ilgili ürünler sorgu iç argümanları değiştirmek için kullanılabilir kanca related.php
, WP_Query
bunun için kullanılır. Sorgu, get_related()
çağrıdan elde edilen kimlikleri kullanır .
Sanırım şimdi sorununuzu çözmek için her şey hazır. Aslında bundan çok daha fazlası, ilgili ürünlerin nasıl özelleştirileceği hakkında neredeyse eksiksiz bir genel bakış sağlar. Her işlevsellikten bahsetmedim - fonksiyon ve / veya incelenen kaynak kodunun dışında - ama kesinlikle tüm önemli olanlardan. Şimdi woocommerce'in ilgili ürün işlevselliğinin wordpress çekirdek işlevlerine kadar nasıl izlenebileceği daha açık olmalıdır.
Dördüncüsü , özelleştirmelerinizi ve neyi istemeniz gerektiğine geliyorum. Örneğin şöyle:
Woocommerce, ilgili ürünleri belirlemek woocommerce_product_related_posts
için get_posts()
çağrıyı özelleştirmek için kancaya sahiptir .
Kod:
// Get the posts
$related_posts = get_posts( apply_filters('woocommerce_product_related_posts', array(
'orderby' => 'rand',
'posts_per_page' => $limit,
'post_type' => 'product',
'fields' => 'ids',
'meta_query' => $meta_query,
'tax_query' => array(
'relation' => 'OR',
array(
'taxonomy' => 'product_cat',
'field' => 'id',
'terms' => $cats_array
),
array(
'taxonomy' => 'product_tag',
'field' => 'id',
'terms' => $tags_array
)
)
) ) );
Hedefime ulaşmak için bunu nasıl özelleştirebilirim? Bu, gösterilen tek ürünle aynı ürün kategorisindeki - product_cat
- ve aynı etiket (ler) e - ilgili ürünleri göstermektir product_tag
.
Eğer tam ve hazır kodu almak için beklenti vardı en azından değilse - - sana bir sonuçlandırılması vermeden cevap, muhtemelen yapmanız gereken ilk şey değiştirmektir tax_query
parametreyi relation
gelen OR
etmek AND
.
Notlar:
- Yukarıdaki bağlantılı devam eden tartışmayı akılda tutarak daha uzun açıklayıcı bir cevap verdim
- Umarım bunun sadece sorunuzun cevabı değil, aynı zamanda genel bir eğitim amacını yerine getirmeye çalıştığını umursamazsınız
- bu test edilmemiştir , çünkü gerçek bir hazır kod yoktur
- son fakat en az değil, woocoomerce 2.1'in piyasaya sürülmesiyle bazı önemli kod değişikliklerinin uygulanacağı öngörülebilir, ancak bunu aklınızda bulundurun, ancak şimdilik 2.0.19'dan itibaren yukarıdaki kod geçerli
Düzenle:
Temel sınıfları gerçekten doğrudan (eklenti) düzenlememelisiniz. Sorunludur, çünkü temel dosyalar güncellenir ve üzerine yazılırsa, güncellemelerdeki değişikliklerinizi tekrar korumanız gerekir. Özellikle bu durumda olduğu gibi kolayca önlenebilirse, aşağıdaki kod zaten ne yapmak istediğinizi yapar, yani bu değişikliği sizin aracılığınızla uygular functions.php
.
Kod:
add_filter( 'woocommerce_product_related_posts',
'wpse_123436_change_wc_related_products_relation_to_and' );
function wpse_123436_change_wc_related_products_relation_to_and() {
$get_related_products_args = array(
'orderby' => 'rand',
'posts_per_page' => $limit,
'post_type' => 'product',
'fields' => 'ids',
'meta_query' => $meta_query,
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'product_cat',
'field' => 'id',
'terms' => $cats_array
),
array(
'taxonomy' => 'product_tag',
'field' => 'id',
'terms' => $tags_array
)
)
);
return $get_related_products_args;
}
WooCommerce sürüm 2.1.0 ve üstü için, yukarıdaki kanca artık mevcut olmadığından çalışmaz, bu nedenle cevap 2.0.20 sürümüne kadar kullanılabilir. Ancak @NathanPowell, mevcut v2.1.0'dan ve ilgili ürünlerin kullanılabilir kanca setinin özelleştirilmesine ilişkin StackOverflow üzerinde güzel bir cevap keşfetti .
OR
içinAND
benim dewp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.php
dosya ve yakında bu içinden yapılacak değişecektirfunctions.php
dosyası. Tekrar teşekkürler.