Bagaimana cara menyesuaikan produk terkait woocommerce? [Tutup]

14

Saya memiliki baris kode berikut di situs web saya yang akan menampilkan produk terkait di bagian bawah halaman produk tunggal saya di WooCommerce ...

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;
}

Saat ini menampilkan 4 produk yang telah dikategorikan dengan nama yang sama, bagaimana cara saya memodifikasi di atas, untuk menampilkan tag terkait ?

Misalnya, saya memiliki kategori produk yang disebut 'Otomotif' dan dalam kategori ini, ada beberapa tag - 'Holden', 'Ford', 'Toyota', 'Nissan' dll.

Saya ingin menampilkan 4 produk di bagian bawah, terkait dengan tag produk yang sedang dilihat pengguna.

pengguna1752759
sumber

Jawaban:

29

Pertama , Anda tidak dapat segera mencapai tujuan yang Anda jelaskan dengan kode yang Anda tunjukkan dalam pertanyaan Anda. Untuk memahami mengapa tidak ada pendekatan langsung dengan kode itu, Anda harus melihat apa yang Anda gunakan - woocommerce_related_products()- untuk melakukan apa yang telah Anda lakukan sejauh ini.

Kedua , Anda harus mengerti, karena jika tidak, Anda tidak dapat mengajukan pertanyaan langsung, yang seharusnya menjadi tujuan Anda, untuk memastikan Anda mendapat jawaban. Selain itu Anda harus ingat bahwa Wordpress Development memiliki ruang lingkup utamanya ditetapkan pada pertanyaan-pertanyaan terkait inti wordpress - jika Anda tertarik, ini sedang dibahas di Wordpress Development Meta , satu topik khusus sedang merayu kami dan masa depan plugin platform di WPSE . Jadi, jika Anda mengajukan pertanyaan tentang plugin, seperti woocommerce, Anda harus memecahnya agar membuatnya terkait dengan fungsi inti mungkin - lihat poin berikutnya - karena Anda tidak dapat mengharapkan orang mengetahui setiap detail dari setiap plugin yang Anda gunakan. sedang menggunakan.

Ketiga , sekarang mari kita masuk ke wawasan yang lebih dalam apa yang terjadi. Seperti yang Anda katakan, Anda gunakan woocommerce_related_products()sekarang. Jika Anda melihat sumbernya Anda melihat bahwa fungsi ini digunakan woocommerce_get_template()untuk mendapatkan related.phptemplat. woocommerce_get_template()lagi digunakan woocommerce_locate_template()untuk menemukan templat, yang terakhir melakukannya dengan memanfaatkan fungsi inti wordpress locate_template().
Sekarang ada koneksi kembali ke inti, yang mengarah pada kesadaran bahwa fungsi-fungsi woocommerce yang disebutkan di atas - dan pada dasarnya adalah pembungkus untuk memperluas fungsionalitas inti. Hal lain yang menjadi jelas dengan menganalisis dependensi fungsionalitas adalah, apa yang saya katakan sebelumnya, Anda memerlukan pendekatan yang berbeda untuk mencapai tujuan Anda, karena - sekarang jelas tak terbantahkan - bukan yang benar. Jika Anda mengikuti saya dengan penjelasan saya dan telah membaca dengan seksama sejauh ini, Anda menyadari bahwa itu berisi apa yang Anda cari. Saya terutama berbicara tentang fungsi, yang mencakupwoocommerce_related_products()
related.phpget_related()woocommerce_product_related_posts kait dan memanfaatkan fungsi inti wp_get_post_terms()dan get_posts()- get_related()digunakan untuk mendapatkan satu set id. Selain itu ada woocommerce_related_products_argskait, yang dapat digunakan untuk mengubah argumen dari permintaan produk terkait di dalam related.php, WP_Querydigunakan untuk ini. Permintaan menggunakan id yang dihasilkan dari get_related()panggilan.
Saya pikir Anda memiliki segalanya untuk menyelesaikan masalah Anda. Sebenarnya jauh lebih dari itu, ini memberikan gambaran yang hampir lengkap tentang cara menyesuaikan produk terkait. Saya tidak menyebutkan setiap fungsionalitas - fungsi dan / atau hook - out dari kode sumber diperiksa, tapi pasti semua yang penting. Sekarang harus lebih jelas bagaimana fungsionalitas produk terkait woocommerce dapat ditelusuri kembali ke fungsi inti wordpress.

Keempat , saya datang ke, di mana Anda harus menerapkan penyesuaian Anda dan apa yang seharusnya Anda minta. Misalnya seperti ini:

Woocommerce memiliki woocommerce_product_related_postspengait untuk menyesuaikan get_posts()panggilan untuk menentukan produk terkait.

Kode:

        // 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
                        )
                )
        ) ) );

Bagaimana saya bisa menyesuaikan ini untuk mencapai tujuan saya? Yaitu untuk menampilkan produk terkait yang berada dalam kategori produk yang sama - product_cat- dan memiliki tag yang sama - product_tag- seperti produk tunggal yang ditampilkan.

Tanpa memberi Anda kesimpulan - setidaknya tidak jika Anda memiliki harapan untuk mendapatkan kode yang lengkap dan siap pakai - jawaban, hal pertama yang mungkin harus Anda lakukan adalah mengubah tax_queryparameter relationdari ORmenjadi AND.





Catatan:

  • Saya membuat ini jawaban yang lebih deskriptif dengan diskusi yang sedang berlangsung terkait di pikiran
  • Saya harap Anda tidak keberatan, bahwa itu bukan hanya jawaban untuk pertanyaan Anda, tetapi juga berupaya untuk memenuhi tujuan pendidikan umum
  • ini belum diuji , karena tidak ada kode siap pakai yang sebenarnya
  • last but not least, dapat diduga bahwa dengan dirilisnya woocoomerce 2.1 beberapa perubahan kode signifikan akan diterapkan, perhatikan itu, tetapi untuk sekarang pada 2.0.19 kode di atas valid



Edit:

Anda benar-benar tidak boleh mengedit (inti) kelas inti secara langsung. Ini bermasalah, karena Anda harus mempertahankan perubahan Anda pada pembaruan lagi, karena file inti diperbarui dan ditimpa jika Anda melakukannya. Terutama jika mudah dihindari seperti dalam kasus ini, kode di bawah ini melakukan apa yang ingin Anda lakukan, yaitu menerapkan perubahan ini melalui Anda functions.php.

Kode:

    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;
    }



Untuk WooCommerce versi 2.1.0 dan ke atas kait di atas tidak akan berfungsi, karena tidak ada lagi, jadi jawabannya dapat digunakan sampai versi 2.0.20. Tetapi @NathanPowell menemukan jawaban yang bagus di StackOverflow mengenai mulai dari v2.1.0 pada yang tersedia dan untuk penyesuaian produk terkait, set kait yang dapat digunakan .

Nicolai
sumber
Terima kasih banyak @ialocin atas respons yang cepat dan terperinci. Sebagai tindakan sementara, saya cukup mengubah ORke ANDdalam wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.phpfile saya dan akan segera mengubah ini dari dalam functions.phpfile. Terima kasih lagi.
user1752759
@ user1752759 Lihat hasil edit saya untuk melakukan ini melaluifunctions.php
Nicolai
Jawaban sempurna! Ini harus digunakan dalam buku panduan tentang cara memahami plugin dan bagaimana memperluasnya ke kebutuhan Anda. Tidak yakin apakah buku-buku ini ada .. Tapi tetap saja :)
ThdK
@ThdK Terima kasih, saya tidak tahu apakah itu sebagus itu, tapi setelah membacanya pertama kali sejak menulisnya saya masih senang dengan jawabannya, selain itu saya pasti menghargai pujiannya, selalu senang mendengarnya :) Anda mencoba ini dengan WC 2.1.x?
Nicolai
Hai, @ialocin. Versi yang diedit di bagian bawah kehilangan beberapa tanda kurung tutup, dan sayangnya, tidak lagi berfungsi sebagai solusi di versi 2.1.8. Jika tidak terlalu merepotkan, bisakah Anda memperbarui ini untuk saya?
user1752759
2

Jangan menipu diri sendiri di sini teman-teman. Jawaban yang diterima hanya membuat pengguna mencapai tujuannya.

Masalah pertama ada di sini:

<?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);

Suatu tindakan dihapus, dan kemudian ditempatkan di posisi EXACT dari tempat itu dihapus. Tujuannya sama sekali tidak jelas.

Saya menemukan ini dengan pencarian pada produk-produk terkait karena saya tidak mengerti bahwa TAG dan KATEGORI adalah yang mendorong woocommerce_output_related_productsfungsi dalam plugin ini.

Jawaban terbaik untuk pertanyaan INI adalah tautan berikut, dan semuanya terkait dengan woocommerce_output_related_products_args()filter: /programming/23554993/output-posts-relating-to-the-tags

Nathan Powell
sumber
Ini sebenarnya cukup lucu. Mengapa Anda mungkin bertanya, karena jika Anda sudah membaca jawaban saya dengan saksama, maka Anda akan melihatnya, hanya menggunakan satu filter. Tepatnya satu-satunya filter yang tersedia pada saat itu, tetapi Anda akan tahu itu, jika Anda benar-benar telah membaca apa yang saya tulis dan akan meluangkan waktu untuk melihat file sumber dari versi yang berbeda. Hanya mengatakan. Selain itu, jawaban yang Anda tautkan menjelaskan kait baru yang tersedia sinus v2.1 dengan sangat baik.
Nicolai
Maaf soal itu, itu sudah larut malam. Saya berharap untuk menjelaskan sedikit tentang kesalahan yang jelas dalam kode oleh OP.
Nathan Powell
Jangan khawatir, tetapi saya merasa harus mengatakan sesuatu.
Nicolai
Tautan referensi Anda berfungsi untuk saya Nathan, terima kasih, sudah mencoba melakukannya sendiri 2 jam sekarang. Sekarang saya tahu untuk menerapkan filter dengan benar :)
marcovega