如何在某个Woocommerce类别存档页面中显示已售出/缺货的商品,而不显示在其他商品中?

时间:2020-01-09 14:05:08

标签: php wordpress woocommerce hook-woocommerce woocommerce-theming

我想在一个类别存档页面上显示“缺货”项目:“已售项目”。

所有其他类别都需要隐藏其“缺货”项目。

在WC设置中未选中“隐藏目录中的缺货商品”。

我有以下代码,该代码成功隐藏了缺货商品,但是我无法让has_term()函数正常工作并过滤掉“已售商品”页面。

我相信这可能是因为我迷上了“ pre_get_posts”,并且可能在添加“已售商品”一词之前就触发了。

哪个是最好的动作?还是我需要将其分成两个钩子?

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

1 个答案:

答案 0 :(得分:0)

最好使用高级WooCommerce特定的筛选器挂钩,而不是使用低级的WordPress挂钩,因为这可能会引起头痛和麻烦。 (例如pre_get_posts) 对于您的情况,我建议使用woocommerce_product_query_tax_query过滤器挂钩。 假设您有一个类别,其中所有产品都缺货,并且塞满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中不区分大小写:)