首页 文章

在Woocommerce 3.3中使用产品短代码的自定义分类法

提问于
浏览
1

我目前正在为Woocommerce网站开发主页,在此页面上的目标是有3行显示来自不同品牌的产品 . 例;第1行将显示Apple产品,第2行将显示Samsung产品,第3行将显示HTC产品 .

我使用插件CPT UI来创建自定义分类“品牌” . 现在,我希望使用上面的示例来仅显示特定品牌下列出的产品 .

看看Woocommerce Shortcodes,我看到了这个:

[products limit="8" columns="4" category="hoodies, tshirts" cat_operator="AND"]

这个案例品牌的定制分类是否可以做这样的事情?即:

[products limit="8" columns="4" brand="apple" cat_operator="AND"]

任何协助或推动正确的方向非常感谢!

1 回答

  • 1

    可以将Woocommerce [products] 短代码扩展为使用某种技巧来处理任何自定义分类,例如 "brand" .

    代码:

    add_filter( 'woocommerce_shortcode_products_query', 'extend_products_shortcode_to_brand', 10, 3 );
    function extend_products_shortcode_to_brand( $query_args, $atts, $loop_name ){
        if ( ! empty($atts['class']) && strpos($atts['class'], 'brand') !== false ) {
            global $wpdb;
    
            $terms = array_map( 'sanitize_title', explode( ',', $atts['class'] ) );
            array_shift( $terms );
            $terms = implode(',', $terms);
            $terms = str_replace(",", "','", $terms);
    
            $ids = $wpdb->get_col( "
                SELECT DISTINCT tr.object_id
                FROM {$wpdb->prefix}term_relationships as tr
                INNER JOIN {$wpdb->prefix}term_taxonomy as tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
                INNER JOIN {$wpdb->prefix}terms as t ON tt.term_id = t.term_id
                WHERE tt.taxonomy LIKE 'brand' AND t.slug IN ('$terms')
            " );
    
            if ( ! empty( $ids ) ) {
                if ( 1 === count( $ids ) ) {
                    $query_args['p'] = $ids[0];
                } else {
                    $query_args['post__in'] = $ids;
                }
            }
        }
        return $query_args;
    }
    

    代码位于活动子主题(或活动主题)的function.php文件中 . 经过测试和工作 .


    USAGE

    我们将在这里使用 class 短代码参数:

    1) One Brand - 显示"Apple"品牌的产品:

    [products limit="8" columns="4" class="brand,Apple"]
    

    2) multiple Brands - 显示"Apple"和"Samsung"品牌的产品:

    [products limit="8" columns="4" class="brand,Apple,Samsung"]
    

    所以 class “品牌”是强制性的,需要成为第一个 . 每个术语都是昏迷分开的 .

相关问题