ประการแรกคุณไม่สามารถบรรลุเป้าหมายที่คุณอธิบายได้ในทันทีด้วยรหัสที่คุณแสดงในคำถาม เพื่อทำความเข้าใจว่าทำไมไม่มีวิธีการโดยตรงกับรหัสนั้นคุณต้องดูสิ่งที่คุณใช้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จากไปORAND
หมายเหตุ:
- ฉันทำสิ่งนี้เป็นคำตอบที่มีความหมายมากกว่าโดยมีการอภิปรายอย่างต่อเนื่องในใจ
- ฉันหวังว่าคุณจะไม่รังเกียจว่ามันไม่ได้เป็นเพียงคำตอบสำหรับคำถามของคุณ แต่ยังมุ่งมั่นที่จะเติมเต็มวัตถุประสงค์ทางการศึกษาทั่วไป
- นี่คือยังไม่ทดลองเพราะไม่มีรหัสสำเร็จรูปจริง
- ท้ายสุด แต่ไม่ท้ายสุดคาดการณ์ได้ว่าด้วยการเปิดตัว 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ไฟล์ ขอขอบคุณอีกครั้ง.