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

Rob*_*wen 6 php wordpress product metadata woocommerce

我曾经使用标准的wordpress WP_Query来基于元数据获取woocommerce产品。我的产品是曲目,并且有许多meta列(例如类型,乐器,情绪等)。使用WP_Query,我可以根据来自表单的用户输入创建meta_query,该表单搜索满足meta要求的产品。所有这些都很好。

现在,我想使用wp_get_products而不是WP_Query,因为它是获取产品的新方法,并且应该比旧方法更具前瞻性。但是,我似乎无法弄清楚如何将meta_query传递给该函数。在github上宣布wc_get_products将支持2.8版本的meta。我可以在以下链接上找到唯一的信息:https : //github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query(最后一段)。

我尝试将meta_query传递为一个数组数组,每个数组包含3个键,值和比较键值对,就像WP_Query中一样。我还尝试将meta添加为Meta: meta-field-name,这是实际字段的名称,只是名称本身没有'meta'前缀,以及其他一些名称。这些方法均无效。谁能告诉我这个“自定义参数支持”是否仅引用元字段以外的自定义参数,还是我做错了?

Loi*_*tec 5

为了处理产品的自定义元数据WC_Product_Query (位于wp_postmeta表),它的宁静简单的作品,如在相关文档的最后一个段落解释

但是WP_Query如果未在扩展meta_query的函数中设置它们它不会像一样处理多个值和比较参数

对于自定义产品的元键(例如_volume以m3 (立方米)为单位的产品处理,以下代码将使用特定参数“大于”来启用该自定义: meta_keycompare

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;
}
Run Code Online (Sandbox Code Playgroud)

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

现在,您将_volume根据特定的'compare'参数对此自定义元键进行查询,以获取所有容量大于的产品'0.2'

$queried_products = wc_get_products( array( '_volume' => '0.2' ) );
Run Code Online (Sandbox Code Playgroud)

经过测试和工作。

如您所见,您可以继续使用WP_Query许多Woocommerce开发人员仍在使用的方法甚至可以通过WordPress WPDB类使用SQL查询

解决此宣布革命是不会很快到来,我想,他们将延长WC_Product_Query,并WC_Order_query喜欢WP_Query与更多的功能和可能性。


ste*_*etz 5

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

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 );
Run Code Online (Sandbox Code Playgroud)

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