在WooCommerce中,我正在try 检索所有具有全局属性brand的产品.根据我之前的理解和一些谷歌搜索,我到目前为止已经做到了这一点:

function handle_custom_query_var($query, $query_vars)
{
    if (!empty($query_vars['with_brand'])) {
        $query['meta_query'][] = array(
            'key' => 'pa_brand',
        'field'    => 'term_id', 
        'compare' => 'EXISTS'
        );
    }
    return $query;
}
add_filter('woocommerce_product_data_store_cpt_get_products_query', 'handle_custom_query_var', 10, 2);

$args = array(
    'status' => 'publish',
    'type' => 'simple',
    'limit' => 50,
    'paginate' => true,
    'page' => $request['page'],
    'with_brand' => true
);  
$results = wc_get_products($args);

但我仍然得到了没有品牌属性的简单产品.我做错了什么? //PS:请忽略WC_GET_PRODUCTS参数中不相关的参数

我也试过了 'operator' => 'IN'

而不是 'compare' => 'EXISTS'

但它的效果并不是很好.

推荐答案

您需要使用tax_query,并将‘Compare’替换为‘OPERATOR’,如下所示:

add_filter('woocommerce_product_data_store_cpt_get_products_query', 'handle_pa_brand_product_attribute', 10, 2);
function handle_pa_brand_product_attribute($query, $query_vars)
{
    if ( isset($query_vars['brand']) && $query_vars['brand'] === 'EXISTS' ) {
        $query['tax_query'][] = array(
            'taxonomy'  => 'pa_brand',
            'operator'  => esc_attr($query_vars['brand']),
        );
    }
    return $query;
}

则您的WC_Product_Query将为:

    $args = array(
        'status'    => 'publish',
        'type'      => 'simple',
        'limit'     => 50,
        'paginate'  => true,
        'page'      => $request['page'],
        'brand'     => 'EXISTS',
    );  
    $results = wc_get_products($args);

经过测试,效果良好.


Addition: Handling multiple product attributes.

您可以处理多个产品属性(这里我们使用品牌和 colored颜色 ):

add_filter('woocommerce_product_data_store_cpt_get_products_query', 'handle_specific_product_attributes', 10, 2);
function handle_specific_product_attributes($query, $query_vars)
{
    // "Brand" with "EXISTS" parametter
    if ( isset($query_vars['brand']) && $query_vars['brand'] === 'EXISTS' ) {
        $query['tax_query'][] = array(
            'taxonomy'  => 'pa_brand',
            'operator'  => esc_attr($query_vars['brand']),
        );
    }

    // "Color" with term "slug" parametter
    if ( isset($query_vars['color']) && ! empty($query_vars['color']) ) {
        $terms = (array) implode(',', esc_attr($query_vars['color']));

        $query['tax_query'][] = array(
            'taxonomy'  => 'pa_color',
            'field'     => 'slug',
            'terms'     => $terms,
        );
    }
    return $query;
}

然后是使用两者的WC_Product_Query的示例:

    $args = array(
        'status'    => 'publish',
        'type'      => 'simple',
        'limit'     => 50,
        'paginate'  => true,
        'page'      => $request['page'],
        'brand'     => 'EXISTS',
        'color'     => 'red,green',
    );  
    $results = wc_get_products($args);

Php相关问答推荐

PHP php_mongodb.dll for 32bit

如果活动订阅者的购物车中有订阅项目,则在WooCommerce签出中显示通知

如何在WordPress中为特定自定义帖子类型自定义URL struct

闭包绑定$This和垃圾收集器

限制某些产品只能在WooCommerce的特定邮政编码/邮政编码范围内发货

我有一个显示记录的表格,每行在最右边有两个按钮.如何才能以正确的顺序获得表的值?

PHP按另一个二维数组的排序顺序对二维数组进行排序

表单提交返回空白页

Mockery在模拟Redis连接时抛出错误:Mockery\Exception\BadMethodCallException

启用 WooCommerce 我的帐户付款方式,允许客户添加付款方式

对 WooCommerce 购物车和 checkout 中显示的运输方式进行排序

使用 Spomky Labs JWT 框架中的 verifyWithKey 验证 id_token JWT 的签名需要 30 秒以上

添加产品标签以通过 WooCommerce 邮箱通知订购商品

使用动态地址和动态文件创建zip文件并获取zip文件链接

在 Botiga 主题模板中添加复选框到政策行.Woocommerce

如何在构建 PHP 类别数组树的递归函数中将父面包屑传递给子项?

php preg_match 验证 Tiktok 用户名

服务器遇到内部错误或配置错误,无法完成您的请求

如何正确使用Flysystem和Local Adapter

如何通过本地主机在同一台 PC 上同时运行 Microsoft IIS 和 WAMP