Làm thế nào để tùy chỉnh các sản phẩm liên quan đến thương mại điện tử? [đóng cửa]


14

Tôi có các dòng mã sau trong trang web của mình sẽ hiển thị các sản phẩm liên quan ở cuối trang sản phẩm duy nhất của tôi trong WooC Commerce ...

Hàm.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;
}

Vì nó hiển thị 4 sản phẩm đã được phân loại dưới cùng tên, tôi sẽ sửa đổi như thế nào để thay thế các thẻ liên quan ?

Ví dụ: tôi có một danh mục sản phẩm gọi là 'Ô tô' và trong danh mục này, có một vài thẻ - 'Holden', 'Ford', 'Toyota', 'Nissan', v.v.

Tôi muốn nó hiển thị 4 sản phẩm ở phía dưới, liên quan đến thẻ của sản phẩm mà người dùng hiện đang xem.

Câu trả lời:


29

Đầu tiên , bạn không thể ngay lập tức đạt được mục tiêu bạn đã mô tả với mã bạn hiển thị trong câu hỏi của mình. Để hiểu tại sao không có cách tiếp cận trực tiếp với mã đó, bạn phải xem những gì bạn đang sử dụng -woocommerce_related_products() - để làm những gì bạn đã làm cho đến nay.

Thứ hai , bạn phải hiểu, bởi vì nếu không, bạn không thể hỏi một câu hỏi tại điểm, đó hoàn toàn là mục tiêu của bạn, để đảm bảo bạn sẽ nhận được câu trả lời. Bên cạnh đó, bạn phải nhớ rằng Phát triển Wordpress có phạm vi chính được đặt cho các câu hỏi liên quan đến cốt lõi của wordpress - nếu bạn quan tâm, đây là cuộc thảo luận về Wordpress Development Meta , một chủ đề cụ thể là các wooes và tương lai của các plugin nền tảng tại WPSE . Vì vậy, nếu bạn đang đặt câu hỏi về các plugin, như thương mại điện tử, bạn nên chia nhỏ nó để làm cho nó liên quan đến các chức năng cốt lõi nhất có thể - xem điểm tiếp theo - vì bạn không thể mong mọi người biết mọi chi tiết của mọi plugin bạn Đang sử dụng.

Thứ ba , bây giờ chúng ta hãy tìm hiểu sâu hơn những gì đang xảy ra. Như bạn đã nói, bạn đang sử dụng woocommerce_related_products()ngay bây giờ. Nếu bạn xem nguồn bạn thấy rằng hàm này sử dụng woocommerce_get_template()để lấy related.phpmẫu. woocommerce_get_template()một lần nữa sử dụng woocommerce_locate_template()để định vị khuôn mẫu, cái sau sẽ làm như vậy bằng cách sử dụng chức năng lõi wordpress locate_template().
Bây giờ có một kết nối trở lại cốt lõi, dẫn đến nhận ra rằng các chức năng thương mại điện tử được đề cập ở trên - và hy vọng đã được kiểm tra - về cơ bản là các trình bao bọc để mở rộng chức năng cốt lõi. Một điều khác trở nên rõ ràng bằng cách phân tích các phụ thuộc chức năng là, những gì tôi đã nói trước đây, bạn cần một cách tiếp cận khác để đạt được mục tiêu của mình, bởi vì woocommerce_related_products()- bây giờ không thể phủ nhận rõ ràng - không phải là chính xác.
Nếu bạn làm theo tôi với những lời giải thích của tôi và đã đọc kỹ cho đến nay, bạn nhận ra rằng nó related.phpchứa những gì bạn đang tìm kiếm. Tôi đặc biệt nói về get_related()chức năng, bao gồm woocommerce_product_related_postshook và sử dụng các chức năng cốt lõi wp_get_post_terms()get_posts()- get_related()được sử dụng để có được một bộ id. Ngoài ra, còn có woocommerce_related_products_argshook, có thể được sử dụng để thay đổi các đối số của truy vấn sản phẩm liên quan bên trong related.php, WP_Queryđược sử dụng cho việc này. Truy vấn sử dụng id kết quả từ get_related()cuộc gọi.
Tôi nghĩ rằng bạn có mọi thứ trong tay để giải quyết vấn đề của bạn. Trên thực tế, nhiều hơn thế, điều này cung cấp một cái nhìn tổng quan gần như đầy đủ về cách tùy chỉnh các sản phẩm liên quan. Tôi đã không đề cập đến mọi chức năng - chức năng và / hoặc hook - ra khỏi mã nguồn được kiểm tra, nhưng chắc chắn là tất cả những chức năng quan trọng. Bây giờ nên rõ ràng hơn về cách chức năng sản phẩm liên quan của thương mại điện tử có thể được truy trở lại các chức năng cốt lõi của wordpress.

Thứ tư , tôi đến, nơi bạn nên áp dụng các tùy chỉnh của mình và những gì bạn nên yêu cầu. Ví dụ như thế này:

Wooc Commerce có woocommerce_product_related_postsmóc nối để tùy chỉnh get_posts()cuộc gọi để xác định các sản phẩm liên quan.

Mã số:

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

Làm thế nào tôi có thể tùy chỉnh điều này để đạt được mục tiêu của tôi? Đó là hiển thị các sản phẩm liên quan thuộc cùng loại sản phẩm - product_cat- và có cùng (các) thẻ - product_tag- như sản phẩm duy nhất được hiển thị.

Không đưa ra kết luận - ít nhất là không nếu bạn có mong muốn nhận được mã hoàn chỉnh và sẵn sàng - trả lời, điều đầu tiên bạn có thể nên làm là thay đổi tax_querytham số relationtừ ORsang AND.





Ghi chú:

  • Tôi đã thực hiện điều này một câu trả lời mô tả dài hơn với tâm trí thảo luận liên tục ở trên
  • Tôi hy vọng bạn không phiền, rằng đó không chỉ là câu trả lời cho câu hỏi của bạn, mà còn theo đuổi để hoàn thành mục đích giáo dục chung
  • Điều này chưa được kiểm tra , vì không có mã thực hiện sẵn sàng thực tế
  • cuối cùng nhưng không kém phần quan trọng, có thể dự đoán rằng với việc phát hành woocoomerce 2.1, một số thay đổi mã quan trọng sẽ được triển khai, hoàn toàn có ý nghĩa, nhưng hiện tại kể từ 2.0.19, đoạn mã trên là hợp lệ



Biên tập:

Bạn thực sự không nên chỉnh sửa trực tiếp (plugin) các lớp lõi. Vấn đề là do bạn phải duy trì các thay đổi của mình trên các bản cập nhật một lần nữa, vì các tệp cốt lõi sẽ được cập nhật và ghi đè nếu bạn thực hiện. Đặc biệt là nếu nó dễ dàng tránh được như trong trường hợp này, bên dưới mã thực hiện những gì bạn định làm dù sao, đó là, thực hiện thay đổi này thông qua của bạn functions.php.

Mã số:

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



Đối với phiên bản WooC Commerce 2.1.0 trở lên , hook ở trên sẽ không hoạt động, vì nó không còn tồn tại nữa, vì vậy câu trả lời có thể sử dụng được cho đến phiên bản 2.0.20. Nhưng @NathanPowell đã phát hiện ra một câu trả lời hay trên StackOverflow liên quan đến phiên bản v2.1.0 có sẵn và để tùy chỉnh các sản phẩm liên quan có thể sử dụng bộ móc .


Cảm ơn bạn rất nhiều @ialocin đã phản hồi nhanh chóng và chi tiết. Như một biện pháp tạm thời, tôi chỉ cần thay đổi ORthành ANDtrong wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.phptệp của mình và sẽ sớm thay đổi điều này để được thực hiện từ trong functions.phptệp. Cám ơn bạn một lần nữa.
dùng1752759

@ user1752759 Xem chỉnh sửa của tôi để thực hiện việc này quafunctions.php
Nicolai

Câu trả lời hoàn hảo! Nó nên được sử dụng trong bất kỳ cuốn sách hướng dẫn nào về cách hiểu các plugin và cách mở rộng chúng theo nhu cầu của bạn. Không chắc những cuốn sách này có tồn tại không .. Nhưng vẫn còn :)
ThdK

@ThdK Cảm ơn, tôi không biết nó có tốt không, nhưng sau khi đọc nó lần đầu tiên kể từ khi viết nó, tôi vẫn hài lòng với câu trả lời, bên cạnh đó tôi chắc chắn đánh giá cao lời khen, thật tuyệt khi nghe :) Bạn đã thử điều này với WC 2.1.x?
Nicolai

Xin chào @ialocin. Phiên bản chỉnh sửa ở phía dưới thiếu một vài dấu ngoặc đóng, và thật không may, không còn hoạt động như một giải pháp trong phiên bản 2.1.8. Nếu nó không quá rắc rối, bạn có thể vui lòng cập nhật cái này cho tôi không?
dùng1752759

2

Chúng ta đừng tự lừa mình ở đây các bạn ạ. Câu trả lời được chấp nhận chỉ đưa người dùng đến mục tiêu của mình.

Vấn đề đầu tiên nằm ở đây:

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

Một hành động được loại bỏ, và sau đó được đặt ở vị trí CHÍNH XÁC mà nó đã bị xóa khỏi. Mục tiêu hoàn toàn không rõ ràng.

Tôi đã tìm thấy điều này với một tìm kiếm trên các sản phẩm liên quan vì tôi không hiểu rằng TAGS và CATEGORIES là thứ điều khiển woocommerce_output_related_productschức năng trong plugin này.

Câu trả lời tốt nhất cho câu hỏi NÀY là liên kết sau và có mọi thứ liên quan đến woocommerce_output_related_products_args()bộ lọc: /programming/23554993/output-posts-relating-to-the-tags


Điều này thực sự khá buồn cười. Tại sao bạn có thể hỏi, bởi vì nếu bạn đọc kỹ câu trả lời của tôi, thì bạn sẽ thấy, nó chỉ sử dụng một bộ lọc. Chính xác là bộ lọc duy nhất có sẵn tại thời điểm đó, nhưng bạn sẽ biết rằng, nếu bạn thực sự đã đọc những gì tôi đã viết và sẽ dành thời gian để xem các tệp nguồn của các phiên bản khác nhau. Chỉ cần nói. Bên cạnh đó, câu trả lời bạn liên kết giải thích các móc mới có sẵn sine v2.1 rất tốt.
Nicolai

Xin lỗi về điều đó, đó là một đêm muộn. Tôi đã hy vọng giải thích một chút về lỗi rõ ràng trong mã của OP.
Nathan Powell

Không phải lo lắng, nhưng cảm thấy tôi phải nói điều gì đó mặc dù.
Nicolai

Liên kết tham khảo của bạn đã làm việc cho tôi, cảm ơn, đã cố gắng làm điều đó cho chính tôi 2 giờ. Bây giờ tôi biết áp dụng các bộ lọc đúng cách :)
marcovega
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.