ประการแรกคุณไม่สามารถบรรลุเป้าหมายที่คุณอธิบายได้ในทันทีด้วยรหัสที่คุณแสดงในคำถาม เพื่อทำความเข้าใจว่าทำไมไม่มีวิธีการโดยตรงกับรหัสนั้นคุณต้องดูสิ่งที่คุณใช้woocommerce_related_products()
- เพื่อทำสิ่งที่คุณได้ทำจนถึงตอนนี้
ประการที่สองคุณต้องเข้าใจเพราะมิฉะนั้นคุณจะไม่สามารถถามคำถามตรงประเด็นซึ่งควรเป็นเป้าหมายของคุณอย่างแน่นอนเพื่อให้มั่นใจว่าคุณได้รับคำตอบ นอกจากนี้คุณต้องจำไว้ว่าการพัฒนา Wordpressมีขอบเขตหลักในคำถามที่เกี่ยวข้องกับคอร์ - ถ้าคุณสนใจนี่คือการหารือเกี่ยวกับการพัฒนา Wordpress Metaหนึ่งหัวข้อที่เฉพาะเจาะจงเป็นwooes ของเราและอนาคตของปลั๊กอินแพลตฟอร์มที่ WPSE . ดังนั้นหากคุณกำลังถามคำถามเกี่ยวกับปลั๊กอินเช่น woocommerce คุณควรทำลายมันเพื่อให้เกี่ยวข้องกับฟังก์ชั่นหลักที่เป็นไปได้ - ดูประเด็นต่อไป - เนื่องจากคุณไม่สามารถคาดหวังให้คนรู้รายละเอียดทุกส่วนของปลั๊กอินที่คุณต้องการ กำลังใช้งาน
ประการที่สามตอนนี้ขอทำความเข้าใจอย่างลึกซึ้งยิ่งขึ้นว่าเกิดอะไรขึ้น อย่างที่คุณพูดคุณกำลังใช้งานwoocommerce_related_products()
อยู่ หากคุณดูที่แหล่งที่มาคุณจะเห็นว่าฟังก์ชั่นนี้ใช้woocommerce_get_template()
ในการรับrelated.php
แม่แบบ woocommerce_get_template()
อีกครั้งที่ใช้ในการค้นหาแม่แบบหลังมีการทำเช่นนั้นโดยการใช้ฟังก์ชั่นwoocommerce_locate_template()
WordPress หลัก ขณะนี้มีการเชื่อมต่อกลับไปที่แกนหลักซึ่งนำไปสู่การตระหนักถึงสิ่งที่กล่าวมาข้างต้น - และหวังว่าจะได้รับการตรวจสอบ - ฟังก์ชั่น woocommerce นั้นเป็นสิ่งห่อหุ้มเพื่อขยายการทำงานหลัก อีกสิ่งหนึ่งที่ชัดเจนโดยการวิเคราะห์การพึ่งพาฟังก์ชั่นคือสิ่งที่ฉันพูดก่อนหน้านี้คุณต้องการแนวทางที่แตกต่างเพื่อให้บรรลุเป้าหมายของคุณเพราะ- ตอนนี้ปฏิเสธไม่ได้ชัดเจน - ไม่ใช่สิ่งที่ถูกต้องlocate_template()
woocommerce_related_products()
หากคุณตามฉันด้วยคำอธิบายของฉันและอ่านอย่างละเอียดจนถึงตอนนี้คุณก็รู้ว่าrelated.php
สิ่งที่บรรจุอยู่นั้นกำลังมองหา โดยเฉพาะอย่างยิ่งฉันกำลังพูดถึงget_related()
ฟังก์ชั่นซึ่งรวมถึงwoocommerce_product_related_posts
ตะขอและใช้ประโยชน์จากฟังก์ชั่นหลักwp_get_post_terms()
และget_posts()
- get_related()
ใช้ในการรับชุดรหัส นอกจากนี้ยังมีเป็นwoocommerce_related_products_args
ตะขอซึ่งสามารถนำมาใช้ในการปรับเปลี่ยนการขัดแย้งภายในผลิตภัณฑ์ที่เกี่ยวข้องแบบสอบถามrelated.php
, WP_Query
ใช้สำหรับการนี้ แบบสอบถามใช้รหัสผลลัพธ์จากการget_related()
โทร
ฉันคิดว่าคุณมีทุกอย่างพร้อมที่จะแก้ปัญหาของคุณ จริงๆแล้วมันให้ภาพรวมที่เกือบสมบูรณ์เกี่ยวกับวิธีปรับแต่งผลิตภัณฑ์ที่เกี่ยวข้อง ฉันไม่ได้พูดถึงทุกฟังก์ชั่น - ฟังก์ชั่นและ / หรือขอตรวจสอบซอร์สโค้ด แต่สิ่งที่สำคัญทั้งหมดนั้นแน่นอน ตอนนี้ควรชัดเจนว่าการทำงานของผลิตภัณฑ์ที่เกี่ยวข้องของ woocommerce สามารถตรวจสอบย้อนกลับไปยังฟังก์ชันหลักของ wordpress ได้อย่างไร
ประการที่สี่ฉันมาที่คุณควรใช้การปรับแต่งของคุณและสิ่งที่คุณควรจะถาม ตัวอย่างเช่นนี้:
Woocommerce มีระบบเบ็ดเสร็จในwoocommerce_product_related_posts
การปรับแต่งการget_posts()
โทรเพื่อกำหนดผลิตภัณฑ์ที่เกี่ยวข้อง
รหัส:
// 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
)
)
) ) );
ฉันจะปรับแต่งสิ่งนี้เพื่อให้บรรลุเป้าหมายได้อย่างไร ซึ่งจะแสดงผลิตภัณฑ์ที่เกี่ยวข้องที่อยู่ในหมวดหมู่ผลิตภัณฑ์เดียวกัน - product_cat
- และมีแท็กเดียวกัน - product_tag
- เป็นผลิตภัณฑ์เดียวที่แสดง
โดยไม่ต้องให้คุณสรุป - อย่างน้อยไม่ได้ถ้าคุณมีความคาดหวังที่จะได้รับที่สมบูรณ์และพร้อมทำรหัส - คำตอบสิ่งแรกที่คุณควรจะทำคือการเปลี่ยนtax_query
พารามิเตอร์relation
จากไปOR
AND
หมายเหตุ:
- ฉันทำสิ่งนี้เป็นคำตอบที่มีความหมายมากกว่าโดยมีการอภิปรายอย่างต่อเนื่องในใจ
- ฉันหวังว่าคุณจะไม่รังเกียจว่ามันไม่ได้เป็นเพียงคำตอบสำหรับคำถามของคุณ แต่ยังมุ่งมั่นที่จะเติมเต็มวัตถุประสงค์ทางการศึกษาทั่วไป
- นี่คือยังไม่ทดลองเพราะไม่มีรหัสสำเร็จรูปจริง
- ท้ายสุด แต่ไม่ท้ายสุดคาดการณ์ได้ว่าด้วยการเปิดตัว woocoomerce 2.1 การเปลี่ยนแปลงรหัสที่สำคัญบางอย่างจะถูกนำไปใช้งานโดยไม่คำนึงถึงเรื่องนี้
แก้ไข:
คุณไม่ควรแก้ไข (ปลั๊กอิน) คลาสหลักโดยตรง มันเป็นปัญหาเพราะคุณจะต้องรักษาการเปลี่ยนแปลงในการอัพเดตอีกครั้งเนื่องจากไฟล์หลักจะได้รับการอัปเดตและเขียนทับหากคุณทำสิ่งนั้น functions.php
โดยเฉพาะอย่างยิ่งถ้ามันหลีกเลี่ยงได้อย่างง่ายดายเช่นเดียวกับในกรณีนี้ด้านล่างรหัสไม่สิ่งที่คุณตั้งใจจะทำอยู่แล้วซึ่งเป็นการดำเนินการเปลี่ยนแปลงนี้ของคุณผ่านทาง
รหัส:
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 เวอร์ชั่น 2.1.0 ขึ้นไป hook ด้านบนจะไม่ทำงานเนื่องจากไม่มีอยู่อีกต่อไปดังนั้นคำตอบสามารถใช้ได้จนถึงรุ่น 2.0.20 แต่ @NathanPowell ค้นพบคำตอบที่ดีใน StackOverflow เกี่ยวกับการจาก v2.1.0 บนที่มีอยู่และสำหรับการปรับแต่งของผลิตภัณฑ์ที่เกี่ยวข้องชุดใช้สอยตะขอ
OR
ไปAND
ในของฉันwp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.php
ไฟล์และเร็ว ๆ นี้จะมีการเปลี่ยนแปลงนี้จะทำจากภายในfunctions.php
ไฟล์ ขอขอบคุณอีกครั้ง.