在 Woocommerce 3 的 WC_Product_Query 中使用自定义元数据

Use custom meta data in a WC_Product_Query on Woocommerce 3

我曾经使用标准的 wordpress WP_Query 来获取基于元数据的 woocommerce 产品。我的产品是曲目,有很多元列(如流派、乐器、情绪等)。使用 WP_Query 我可以根据用户从表单输入的内容创建一个 meta_query,用于搜索满足元要求的产品。所有这些都很好用。

现在我想使用 wp_get_products 而不是 WP_Query,因为这是获取产品的新方式,而且应该比旧方式更适合未来。但是,我似乎无法弄清楚如何将 meta_query 传递给该函数。 github 上宣布 wc_get_products 将支持 2.8 版的元数据。我能找到的唯一信息如下 link:https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query(最后一段)。

我尝试将 meta_query 作为数组的数组传递,每个数组包含 3 个用于键、值和比较的键值对,就像在 WP_Query 中一样。我还尝试将元添加为 Meta: meta-field-name,这是实际字段的名称,只有名称本身没有 'meta' 前缀,以及其他一些变体。 None 这些方法虽然有效。谁能告诉我这个 'custom parameter support' 是否仅指元字段以外的自定义参数,还是我做错了什么?

处理 自定义元数据 WC_Product_Query (位于 wp_postmeta table),它非常简单并且有效,as explained in the very last paragraph of the related documentation

But it doesn't handle multiple values and comparison arguments like in a WP_Query, if you don't set them in the function that extend the meta_query.

对于定制产品元键,例如_volume来处理产品占用的数量在 m3 (立方米) 中,以下代码将启用具有特定 compare 参数的自定义 meta_key "bigger than":

add_filter( 'woocommerce_product_data_store_cpt_get_products_query', 'handling_custom_meta_query_keys', 10, 3 );
function handling_custom_meta_query_keys( $wp_query_args, $query_vars, $data_store_cpt ) {
    $meta_key = '_volume'; // The custom meta_key

    if ( ! empty( $query_vars[$meta_key] ) ) {
        $wp_query_args['meta_query'][] = array(
            'key'     => $meta_key,
            'value'   => esc_attr( $query_vars[$meta_key] ),
            'compare' => '>', // <=== Here you can set other comparison arguments
        );
    }
    return $wp_query_args;
}

代码进入活动子主题(或活动主题)的 function.php 文件。

现在您只需根据特定的 'compare' 参数对该自定义 _volume 元键进行查询,然后 get体积大于 '0.2' 的所有产品:

$queried_products = wc_get_products( array( '_volume' => '0.2' ) );

已测试并有效。

As you can see, you can continue using a WP_Query as many Woocommerce developers still do or even SQL queries through WordPress WPDB Class…

The announced revolution around this is not going to come soon and I suppose that they will extend WC_Product_Query and WC_Order_query like WP_Query with many more features and possibilities.

您可以添加这个小功能来解决所有问题:

add_filter( 'woocommerce_product_data_store_cpt_get_products_query', static function($wp_query_args, $query_vars, $data_store_cpt){
    if ( ! empty( $query_vars['meta_query'] ) ) {$wp_query_args['meta_query'][] = $query_vars['meta_query'];}
    return $wp_query_args;
}, 10, 3 );

现在只需将 meta_query 传递给 wc_get_products,它就支持它:)。 他们可能应该雇用我哈哈。