問題描述
我的網站中有以下幾行代碼,將在 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 個已經被分類為相同名稱的產品,那麼我如何修改上述內容呢?
例如,我有一個名為’Automotive’ 的產品類別,在這個類別中,是幾個標籤 – ‘Holden’,’Ford’,’Toyota’,’Nissan’ 等。
我希望在底部顯示 4 個產品,與用户當前正在查看的產品標籤相關。
最佳解決方案
首先,您無法立即通過您在問題中顯示的代碼實現您所描述的目標。要了解為什麼沒有直接的方法與該代碼,你必須看看你正在使用的 – woocommerce_related_products() – 做你迄今為止做的。
其次,你必須明白,因為否則你不能問一個一個問題,這絕對是你的目標,以確保你得到一個答案。此外,您必須記住,WordPress Development 的主要範圍設置在 wordpress 核心相關問題上 – 如果您有興趣,則正在討論 WordPress Development Meta,一個特定主題是 Our wooes and future of platform plugins at WPSE 。所以,如果您提出有關插件的問題,例如 woocommerce,您應該將其分解為使其與核心功能儘可能相關 – 請參閲下一點 – 因為您不能指望人們瞭解每個插件的每個細節使用。
第三,現在讓我深入瞭解發生了什麼。正如你所説,你現在使用 woocommerce_related_products()。如果你看看源碼,你會發現這個功能使用 woocommerce_get_template()獲取 related.php 模板。 woocommerce_get_template()再次使用 woocommerce_locate_template()來定位模板,後者通過使用 wordpress 核心函數 locate_template()來實現。現在有一個連接回到核心,導致認識到上述 – 並且有希望的檢查 – woocommerce 功能本質上是包裝以擴展核心功能。通過分析功能依賴關係變得清晰的另一件事情是,我之前説過,需要一種不同的方法來實現您的目標,因為 woocommerce_related_products() – 現在是不可否認的 – 顯而易見的 – 不是正確的。如果您跟隨我的解釋,並且到目前為止已經徹底閲讀,您意識到 related.php 包含您要查找的內容。我特別在談論 get_related()功能,其中包括 woocommerce_product_related_posts 鈎子,並使用 wp_get_post_terms()和 get_posts()的核心功能 – get_related()用於獲取一組 ids 。另外還有 woocommerce_related_products_args 掛鈎,可用於修改 related.php 內相關產品查詢的參數,WP_Query 用於此。該查詢使用 get_related()調用中生成的 ID 。我想你現在有一切可以解決你的問題。實際上,這樣做比較簡單,給出瞭如何定製相關產品的幾乎完整的概述。我沒有提到檢查的源代碼的每個功能 – 功能和/或鈎子,但絕對是所有重要的。現在應該更清楚的是,如何將 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 參數關係從 OR 更改為 AND 。
筆記:
-
我把這個更長的描述性答案與上面連接的正在進行的討論相結合
-
我希望你不介意,這不僅是你的問題的答案,而且還追求實現一般的教育目的
-
這是未經測試的,因為沒有實際的準備好的代碼
-
最後但並非最不重要的是,可以預見,隨着發行版 2.1 的發佈,將會實現一些重要的代碼更改,但是考慮到現在的 2.0.19 以上代碼是有效的
編輯:
你真的不應該直接編輯 (插件) 核心類。這是有問題的,因為您必須再次維護對更新的更改,因為核心文件如果執行一個更新並覆蓋。特別是如果在這種情況下很容易避免,下面的代碼將會執行您打算做的任何操作,也就是通過 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 及更高版本,上述鈎子將不起作用,因為它不再存在,所以答案可用到版本 2.0.20 之前。但是 @NathanPowell 在 StackOverflow 上發現了一個關於可用的 v2.1.0 和 customization of the related products usable set of hooks 的一個很好的答案。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。