WooCommerce 商店中,變體商品是作為選項(xiàng)和主商品顯示在一起的,有時(shí)候,為了方便操作,我們可能想把變體商品作為一個(gè)單獨(dú)的商品顯示。WooCommerce 沒有為我們提供這樣的選項(xiàng),在本文中,我將為大家介紹怎么以編程的方式來實(shí)現(xiàn)這個(gè)功能。
以編程方式在商店和存檔頁面上將變體顯示為單個(gè)產(chǎn)品
產(chǎn)品查詢
老實(shí)說,這比你想象的要簡單得多——我們只需使用標(biāo)準(zhǔn)的 WooCommerce 的 woocommerce_product_query 動(dòng)作鉤子即可,它有點(diǎn)類似于 pre_get_posts。
/**
* 在 WooCommerce 中將變體顯示為單一產(chǎn)品
*/
add_action( 'woocommerce_product_query', function( $query ) {
$query->set( 'post_type', array( 'product','product_variation' ) );
}, 25 );
WooCommerce 產(chǎn)品頁面已經(jīng)完全兼容變體,而且 WC_Product_Variation PHP 類還擴(kuò)展了 WC_Product 類。換句話說,只需在商店中使用上述代碼片段,就足以將變體顯示為單個(gè)產(chǎn)品:
“Hoodie-Blue,Yes” 產(chǎn)品就是一個(gè)變體。
使用 pre_get_posts 的示例(不建議使用)
除此之外,我們可以使用 pre_get_posts 動(dòng)作鉤子來實(shí)現(xiàn)這個(gè)需求嗎?理論上可以,但我建議避免這樣做,因?yàn)槲覀冇幸粋€(gè) WooCommerce 專用的操作鉤子。另外,在使用 pre_get_posts 鉤子時(shí),它會(huì)在任何地方被觸發(fā),甚至是在WordPress 管理儀表板中。
這是否意味著變體也將開始在管理控制面板中顯示為單個(gè)產(chǎn)品?當(dāng)然不是,你只會(huì)得到一個(gè)錯(cuò)誤和為空的表格行,就像截圖一樣:

不過,我們可以添加一些限制條件來解決這個(gè)問題:
add_action( 'pre_get_posts', 'wprs_variations_as_single_products', 25 );
function wprs_variations_as_single_products( $query ) {
// 首先,檢查我們是否在管理儀表板中
if( is_admin() ) {
return;
}
// 其次,我們希望在哪些頁面上以單個(gè)產(chǎn)品的形式顯示變體
if( is_shop() || is_product_category() || is_product_tag() ) {
$query->set( 'post_type', array( 'product', 'product_variation' ) );
}
}
在 「products」 短代碼中使用 woocommerce_shortcode_products_query
在一些主題中,開發(fā)者還在使用 「products」 短代碼在調(diào)用產(chǎn)品。這些短代碼的查詢不在 woocommerce_product_query 鉤子的覆蓋范圍內(nèi),我們需要額外使用 woocommerce_shortcode_products_query:
add_filter( 'woocommerce_shortcode_products_query', function( $query_args, $atts ) {
$query_args[ 'post_type' ] = array( 'product', 'product_variation' );
return $query_args;
}, 25, 2 );
從產(chǎn)品循環(huán)中隱藏可變產(chǎn)品(不包括變體)
現(xiàn)在還有一個(gè)問題:既然現(xiàn)在我們?cè)诋a(chǎn)品循環(huán)中顯示變體產(chǎn)品就像顯示普通產(chǎn)品一樣,為什么我們還需要顯示它們的父變體產(chǎn)品呢?
例如,你可以看到在顯示 “Hoodie-Blue,Yes”的同時(shí),我們?nèi)匀伙@示了 “連帽衫 “產(chǎn)品。我認(rèn)為現(xiàn)在將它們排除在循環(huán)之外是非常合乎邏輯的,對(duì)嗎?
幸運(yùn)的是,我們可以很容易地做到這一點(diǎn),只需在 woocommerce_product_query 鉤子的回調(diào)函數(shù)中修改 Tax_Query 值即可,因?yàn)楫a(chǎn)品類型只是一個(gè)分類標(biāo)準(zhǔn) product_type,我們需要排除帶有變量項(xiàng)的產(chǎn)品。
add_action( 'woocommerce_product_query', function( $query ) {
$query->set( 'post_type', array( 'product', 'product_variation' ) );
// let's exclude variable products now
$tax_query = $query->get( 'tax_query' );
$tax_query[] = array(
'taxonomy' => 'product_type',
'field' => 'slug',
'terms' => 'variable',
'operator' => 'NOT IN',
);
$query->set( 'tax_query', $tax_query );
}, 25 );
如果出于某種原因,你不想修改 WooCommerce 產(chǎn)品查詢中的 tax_query,你也有另一個(gè)選擇–你可以通過特定的自定義字段 _variations 將變量產(chǎn)品過濾掉,從而排除變量產(chǎn)品。因此,我們只需修改 WooCommerce 產(chǎn)品循環(huán)中的Meta_Query 值即可。
add_filter( 'woocommerce_product_query_meta_query', function( $meta_query ) {
$meta_query[] = array(
'key' => '_variations',
'compare' => 'NOT EXISTS',
);
return $meta_query;
} );
在本文中,我們介紹了怎么通過 WooCommerce 或 WordPress 的動(dòng)作鉤子來把產(chǎn)品變體顯示為單個(gè)產(chǎn)品,對(duì)于一些產(chǎn)品不多的站點(diǎn)來說,可以豐富網(wǎng)站的產(chǎn)品,同時(shí)也方便用戶添加產(chǎn)品到購物車。


