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.php
templat. 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.php
get_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_args
kait, yang dapat digunakan untuk mengubah argumen dari permintaan produk terkait di dalam related.php
, WP_Query
digunakan 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_posts
pengait 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_query
parameter relation
dari OR
menjadi 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 .
OR
keAND
dalamwp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.php
file saya dan akan segera mengubah ini dari dalamfunctions.php
file. Terima kasih lagi.