วิธีปรับแต่งผลิตภัณฑ์ที่เกี่ยวข้องกับ woocommerce [ปิด]


14

ฉันมีรหัสต่อไปนี้ในเว็บไซต์ของฉันที่จะแสดงผลิตภัณฑ์ที่เกี่ยวข้องที่ด้านล่างของหน้าผลิตภัณฑ์เดียวของฉันใน 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;
}

เนื่องจากจะแสดงผลิตภัณฑ์ 4 รายการที่ถูกจัดหมวดหมู่ภายใต้ชื่อเดียวกันฉันจะแก้ไขด้านบนเพื่อแสดงแท็กที่เกี่ยวข้องได้อย่างไร

ตัวอย่างเช่นฉันมีหมวดหมู่ผลิตภัณฑ์ที่เรียกว่า 'ยานยนต์' และภายในหมวดหมู่นี้มีแท็กบางอย่าง - 'Holden', 'Ford', 'Toyota', 'Nissan' เป็นต้น

ฉันต้องการให้แสดงผลิตภัณฑ์ 4 รายการที่ด้านล่างเกี่ยวข้องกับแท็กของผลิตภัณฑ์ที่ผู้ใช้กำลังดูอยู่

คำตอบ:


29

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


ขอบคุณ @ialocin มากสำหรับการตอบสนองที่รวดเร็วและมีรายละเอียด ในฐานะที่เป็นมาตรการชั่วคราวผมก็เปลี่ยนORไปANDในของฉันwp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.phpไฟล์และเร็ว ๆ นี้จะมีการเปลี่ยนแปลงนี้จะทำจากภายในfunctions.phpไฟล์ ขอขอบคุณอีกครั้ง.
user1752759

@ user1752759 ดูการแก้ไขของฉันเพื่อทำสิ่งนี้ผ่านทางfunctions.php
Nicolai

คำตอบที่สมบูรณ์แบบ! ควรใช้ในหนังสือคู่มือใด ๆ เกี่ยวกับวิธีทำความเข้าใจกับปลั๊กอินและวิธีขยายให้ตรงกับความต้องการของคุณ ไม่แน่ใจว่าหนังสือเหล่านี้มีอยู่จริงหรือไม่ แต่ก็ยัง :)
พ.ย.

@ ขอบคุณขอบคุณฉันไม่รู้ว่ามันดี แต่หลังจากอ่านมันเป็นครั้งแรกนับตั้งแต่เขียนฉันยังคงมีความสุขกับคำตอบนอกจากนั้นฉันก็ชื่นชมคำชมอย่างแน่นอนมันดีที่ได้ยินเสมอ :) มี คุณลองกับ WC 2.1.x หรือไม่
Nicolai

สวัสดี @ialocin รุ่นที่แก้ไขที่ด้านล่างขาดวงเล็บปิดสองสามอันและน่าเสียดายที่ไม่สามารถใช้งานได้เป็นโซลูชันในเวอร์ชัน 2.1.8 อีกต่อไป ถ้ามันไม่ใช่ปัญหามากเกินไปคุณช่วยกรุณาอัปเดตสิ่งนี้ให้ฉันได้ไหม
user1752759

2

อย่าหลอกตัวเองที่นี่พวก คำตอบที่ยอมรับจะนำผู้ใช้ไปยังเป้าหมายของเขาเท่านั้น

ปัญหาแรกอยู่ที่นี่:

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

การกระทำถูกลบแล้ววางในตำแหน่ง EXACT ที่ถูกลบออกจาก เป้าหมายไม่ชัดเจนอย่างสมบูรณ์

ฉันเจอสิ่งนี้กับการค้นหาผลิตภัณฑ์ที่เกี่ยวข้องเพราะฉันไม่เข้าใจว่าแท็กและประเภทเป็นสิ่งที่ขับเคลื่อนการwoocommerce_output_related_productsทำงานของปลั๊กอินนี้

คำตอบที่ดีที่สุดสำหรับคำถามนี้คือลิงค์ต่อไปนี้และมีทุกอย่างที่เกี่ยวข้องกับwoocommerce_output_related_products_args()ตัวกรอง: /programming/23554993/output-posts-relating-to-the-tags


จริง ๆ แล้วมันค่อนข้างตลก ทำไมคุณอาจถามเพราะถ้าคุณได้อ่านคำตอบของฉันอย่างรอบคอบแล้วคุณจะได้เห็นมันใช้ตัวกรองเดียวเท่านั้น แน่นอนว่ามีเพียงฟิลเตอร์เท่านั้นที่พร้อมใช้งานในเวลานั้น แต่คุณจะรู้ว่าถ้าคุณอ่านสิ่งที่ฉันเขียนและใช้เวลาในการดูไฟล์ต้นฉบับของเวอร์ชันต่าง ๆ แค่พูด. นอกเหนือจากนั้นคำตอบที่คุณเชื่อมโยงจะอธิบายถึง hooks ใหม่ที่มีอยู่ sine v2.1 เป็นอย่างดี
นิโคไล

ขออภัยเกี่ยวกับเรื่องนี้มันเป็นช่วงดึก ฉันหวังว่าจะอธิบายเล็กน้อยเกี่ยวกับความผิดที่ชัดเจนในรหัสโดย OP
Nathan Powell

ไม่ต้องกังวล แต่รู้สึกว่าฉันต้องพูดอะไรบางอย่าง
Nicolai

ลิงค์อ้างอิงของคุณใช้งานได้สำหรับฉันนาธานขอบคุณพยายามทำเพื่อตัวเองแล้ว 2 ชั่วโมง ตอนนี้ฉันรู้ที่จะใช้ตัวกรองอย่างถูกต้อง :)
marcovega
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.