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

问题描述 投票:0回答:2

我目前正在开发 Woocommerce 网站的主页,在此页面上的目标是有 3 行显示来自不同品牌的产品。例子;第一排将展示苹果产品,第二排将展示三星产品,第三排将展示 HTC 产品。

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

查看 Woocommerce 简码,我看到了这个:

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

是否可以通过针对该案例品牌的自定义分类来执行类似的操作?即:

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

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

php wordpress woocommerce shortcode custom-taxonomy
2个回答
9
投票

可以将 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 文件中。已测试并有效。


使用

我们将在这里使用

class
短代码参数:

1) 单一品牌 - 展示“Apple”品牌的产品:

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

2)多个品牌 - 展示“Apple”和“Samsung”品牌的产品:

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

所以

"brand"
类是强制性的,并且需要是第一个。每个术语均以逗号分隔。


0
投票

这只是加载所有产品。我必须更改什么'代码中的标题是什么?

© www.soinside.com 2019 - 2024. All rights reserved.