Đầ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.php
mẫ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.php
chứ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_posts
hook và sử dụng các chức năng cốt lõi wp_get_post_terms()
và get_posts()
- get_related()
được sử dụng để có được một bộ id. Ngoài ra, còn có woocommerce_related_products_args
hook, 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_posts
mó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_query
tham số relation
từ OR
sang 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 .
OR
thànhAND
trongwp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.php
tệp của mình và sẽ sớm thay đổi điều này để được thực hiện từ trongfunctions.php
tệp. Cám ơn bạn một lần nữa.