Woocommerce ile ilgili ürünler nasıl özelleştirilir? [kapalı]


14

Web sitemde ilgili ürünleri WooCommerce'deki tek ürün sayfamın altında görüntüleyecek aşağıdaki kod satırlarına sahibim ...

functions.php:

// display upsells and related products within dedicated div with different column and number of products
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products',20);
remove_action( 'woocommerce_after_single_product', 'woocommerce_output_related_products',10);
add_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);

function woocommerce_output_related_products() {
    $output = null;

    ob_start();
    woocommerce_related_products(4,4); 
    $content = ob_get_clean();
    if($content) { $output .= $content; }

    echo '<div class="clear"></div>' . $output;
}

Aynı ad altında kategorize edilmiş 4 ürün görüntülediğinden, bunun yerine ilgili etiketleri görüntülemek için yukarıdakileri nasıl değiştirebilirim ?

Örneğin, 'Otomotiv' adlı bir ürün kategorim var ve bu kategori içinde birkaç etiket var - 'Holden', 'Ford', 'Toyota', 'Nissan' vb.

Kullanıcının görüntülemekte olduğu ürünün etiketi ile ilgili olarak altta 4 ürün görüntülemek istiyorum.

Yanıtlar:


29

İ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.phpiçerdiğini fark ettiniz. Özellikle kanca get_related()içeren woocommerce_product_related_postsve 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_argsilgili ürünler sorgu iç argümanları değiştirmek için kullanılabilir kanca related.php, WP_Querybunun 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_postsiç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_queryparametreyi relationgelen ORetmek 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 .


Hızlı ve ayrıntılı yanıt için çok teşekkürler @ialocin. Geçici bir önlem olarak, ben sadece değişmiş ORiçin ANDbenim de wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.phpdosya ve yakında bu içinden yapılacak değişecektir functions.phpdosyası. Tekrar teşekkürler.
user1752759

@ user1752759 Bunu yapmak için düzenlememi görünfunctions.php
Nicolai

Mükemmel cevap! Eklentileri nasıl anlayacağınız ve bunları ihtiyaçlarınıza göre nasıl genişleteceğiniz konusunda herhangi bir kılavuzda kullanılmalıdır. Bu kitapların var olup olmadığından emin değilim .. Ama yine de :)
ThdK

@ThdK Teşekkürler, iyi olup olmadığını bilmiyorum, ancak yazdıktan sonra ilk kez okuduktan sonra hala cevaptan memnunum, ayrıca iltifatı takdir ediyorum, duymak her zaman güzel :) Var WC 2.1.x ile denediniz mi?
Nicolai

Merhaba, @ialocin. Altta düzenlenen sürümde birkaç kapanış köşesi eksik ve maalesef 2.1.8 sürümünde artık bir çözüm olarak çalışmıyor. Eğer sorun çok fazla değilse, lütfen bunu benim için güncelleyebilir misiniz?
user1752759

2

Burada kendimizi kandırmayalım arkadaşlar. Kabul edilen cevap kullanıcıyı yalnızca amacına ulaştırdı.

İlk sorun burada yatıyor:

<?php
// display upsells and related products within dedicated div with different column and number of    products
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products',20);
remove_action( 'woocommerce_after_single_product', 'woocommerce_output_related_products',10);
add_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);

Bir eylem kaldırılır ve ardından kaldırıldığı EXACT konumuna yerleştirilir. Amaç tamamen belirsiz.

Ben ilgili ürünlerde bir arama ile karşılaştım çünkü TAGS ve CATEGORIES woocommerce_output_related_productsbu eklentideki işlevi tahrik ne olduğunu anlamadım .

BU soruya en iyi cevap aşağıdaki bağlantıdır ve woocommerce_output_related_products_args()filtreyle ilgili her şeye sahiptir : /programming/23554993/output-posts-relating-to-the-tags


Bu aslında oldukça komik. Neden sorabilirsin, çünkü cevabımı dikkatlice okursan, o zaman görürdün, sadece bir filtre kullanıyor. Tam olarak söylemek gerekirse, o zaman mevcut tek filtre, ama aslında yazdıklarımı okumuş olsaydınız ve farklı sürümlerin kaynak dosyalarına bakmak için zaman alacaktı. Sadece söylüyorum. Bunun yanı sıra, bağladığınız cevap sinüs v2.1'deki yeni kancaları çok iyi açıklıyor.
Nicolai

Üzgünüm, gece geç saatte. Ben OP tarafından koddaki belirgin arıza hakkında biraz açıklamak umuyordum.
Nathan Powell

Endişeye gerek yok, ama bir şey söylemek zorunda olduğumu hissettim.
Nicolai

Referans bağlantım benim için çalıştı Nathan, teşekkürler, 2 saattir kendim için yapmaya çalışıyordum. Şimdi filtreleri düzgün bir şekilde uygulayacağımı biliyorum :)
marcovega
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.