如何在某个 Woocommerce 类别存档页面中显示 sold/out 库存项目,但不在其他页面中显示它们?
How do I show sold/out of stock items in a certain Woocommerce category archive page, but not display them in others?
我想在一个类别存档页面上显示 'Out of Stock' 项:'Sold Items'。
所有其他类别需要隐藏其缺货商品。
'Hide out of stock items from the catalog',WC设置里面没有勾选
我有下面的代码,它成功地隐藏了缺货商品,但是我无法让 has_term() 函数正常工作并过滤掉 'Sold Items' 页面。
我相信这可能是因为我正在连接到 'pre_get_posts',也许这会在添加 'Sold Items' 术语之前触发。
挂钩的最佳动作是什么?或者我需要把它分成两个钩子吗?
add_action( 'pre_get_posts', 'VG_hide_out_of_stock_products' );
function VG_hide_out_of_stock_products( $q ) {
if ( ! $q->is_main_query() || is_admin() ) {
return;
}
global $post;
if ( !has_term( 'Sold Items', 'product_cat', $post->ID ) ) {
if ( $outofstock_term = get_term_by( 'name', 'outofstock', 'product_visibility' ) ) {
$tax_query = (array) $q->get('tax_query');
$tax_query[] = array(
'taxonomy' => 'product_visibility',
'field' => 'term_taxonomy_id',
'terms' => array( $outofstock_term->term_taxonomy_id ),
'operator' => 'NOT IN'
);
$q->set( 'tax_query', $tax_query );
}
}
}
最好使用高级 WooCommerce 特定过滤器挂钩,而不是低级别 WordPress 挂钩,后者可能会引起头痛和麻烦。 (例如 pre_get_posts
)
对于您的场景,我建议 woocommerce_product_query_tax_query
过滤器挂钩。
假设您有一个类别,其中包含所有缺货产品,并带有 slug sold-items
,最终代码可能如下所示:
add_filter( 'woocommerce_product_query_tax_query', 'vg_hide_out_of_stock_products' );
function vg_hide_out_of_stock_products( $tax_query ) {
if( !is_shop() && !is_product_category() && !is_product_tag() ) {
return $tax_query;
}
if( is_product_category('sold-items') ) {
$tax_query[] = array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => ['outofstock'],
'operator' => 'IN',
);
} else {
$tax_query[] = array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => ['outofstock'],
'operator' => 'NOT IN',
);
}
return $tax_query;
}
P.S: PHP 函数名不区分大小写:)
我想在一个类别存档页面上显示 'Out of Stock' 项:'Sold Items'。
所有其他类别需要隐藏其缺货商品。
'Hide out of stock items from the catalog',WC设置里面没有勾选
我有下面的代码,它成功地隐藏了缺货商品,但是我无法让 has_term() 函数正常工作并过滤掉 'Sold Items' 页面。
我相信这可能是因为我正在连接到 'pre_get_posts',也许这会在添加 'Sold Items' 术语之前触发。
挂钩的最佳动作是什么?或者我需要把它分成两个钩子吗?
add_action( 'pre_get_posts', 'VG_hide_out_of_stock_products' );
function VG_hide_out_of_stock_products( $q ) {
if ( ! $q->is_main_query() || is_admin() ) {
return;
}
global $post;
if ( !has_term( 'Sold Items', 'product_cat', $post->ID ) ) {
if ( $outofstock_term = get_term_by( 'name', 'outofstock', 'product_visibility' ) ) {
$tax_query = (array) $q->get('tax_query');
$tax_query[] = array(
'taxonomy' => 'product_visibility',
'field' => 'term_taxonomy_id',
'terms' => array( $outofstock_term->term_taxonomy_id ),
'operator' => 'NOT IN'
);
$q->set( 'tax_query', $tax_query );
}
}
}
最好使用高级 WooCommerce 特定过滤器挂钩,而不是低级别 WordPress 挂钩,后者可能会引起头痛和麻烦。 (例如 pre_get_posts
)
对于您的场景,我建议 woocommerce_product_query_tax_query
过滤器挂钩。
假设您有一个类别,其中包含所有缺货产品,并带有 slug sold-items
,最终代码可能如下所示:
add_filter( 'woocommerce_product_query_tax_query', 'vg_hide_out_of_stock_products' );
function vg_hide_out_of_stock_products( $tax_query ) {
if( !is_shop() && !is_product_category() && !is_product_tag() ) {
return $tax_query;
}
if( is_product_category('sold-items') ) {
$tax_query[] = array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => ['outofstock'],
'operator' => 'IN',
);
} else {
$tax_query[] = array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => ['outofstock'],
'operator' => 'NOT IN',
);
}
return $tax_query;
}
P.S: PHP 函数名不区分大小写:)