【问题标题】:How to do WC meta_query on variable products via their product variations?如何通过产品变体对可变产品进行 WC meta_query?
【发布时间】:2019-04-23 02:13:06
【问题描述】:

在 WooCommerce 产品上,我有一个名为“amazon_price”的自定义元字段,如果没有为此“amazon_price”自定义字段设置价格,我想隐藏产品以防止在前端显示。

我使用此代码进行过滤,这对简单产品有效,但即使它们设置了“amazon_price”字段,它也不会显示可变产品,我猜该问题背后的原因是该代码可能正在寻找“ amazon_price" 产品主帖子 ID 上的字段值,所以我认为这可能是在寻找变量产品的主帖子 ID,而不是在变量 ID 中查找该字段,但即使我的猜测是真的,我仍然没有知道如何解决这个问题。

add_action( 'woocommerce_product_query', 'apm_products_meta_query' );
function apm_products_meta_query( $q ){
    $meta_query = $q->get( 'meta_query' );

    $meta_query[] = array(
        'key'       => 'amazon_price',
        'value'     => 0,
        'compare'   => '>'
    );

    $q->set( 'meta_query', $meta_query );
}

【问题讨论】:

  • 我真的很抱歉,几个小时过去了,现在回答,所以我虽然如果我的问题在第 1 页或第 2 页之后,我将没有任何改变来得到答案,这就是我复制它的原因..顺便说一句,我删除了重复的问题。

标签: php sql wordpress woocommerce metadata


【解决方案1】:

我认为不可能对可变产品的产品变体进行 WC 元查询。但是使用自定义轻量级 SQL 查询,您可以同时进行所有操作:

// The custom SQL query
function custom_query_incl_ids() {
    global $wpdb;

    $meta_key = 'amazon_price';

    return $wpdb->get_col( "
        SELECT DISTINCT p.ID FROM {$wpdb->prefix}posts p
        LEFT JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
        WHERE p.post_type = 'product' AND p.post_status = 'publish'
        AND ( ( pm.meta_key = '$meta_key' AND pm.meta_value > 0 )
        OR p.ID IN (
            SELECT DISTINCT v.post_parent FROM {$wpdb->prefix}posts v
            LEFT JOIN {$wpdb->prefix}postmeta as vm ON v.ID = vm.post_id
            WHERE v.post_type = 'product_variation'
            AND v.post_status = 'publish' AND v.post_parent > 0
            AND vm.meta_key = '$meta_key' AND vm.meta_value > 0
        ) )
    ");
}

// The WC query
add_action( 'woocommerce_product_query', 'product_query_action_callback' );
function product_query_action_callback( $q ){
    $q->set( 'post__in', (array) custom_query_incl_ids() );
}

代码进入您的活动子主题(或活动主题)的 function.php 文件中。经过测试并且可以工作。

【讨论】:

  • 非常感谢您的回答,这似乎对默认产品循环非常有效,但是我总是使用具有内置查询过滤器的过滤器插件。这是我与该插件一起使用的功能,该插件运行良好,但主要问题是可变产品 ``` add_filter('prdctfltr_meta_query', 'prdctfltr_apm_query'); function prdctfltr_apm_query($meta_query) { $meta_query[] = array('key' => 'amazon_price', 'value' => 0, 'compare' => '>' );返回 $meta_query; } ```
  • 所以我想知道如何使用这个过滤器来实现你的查询,给出那个语法?我试过``` $meta_query = product_query_action_callback();``` 但没用
  • @IslamMohamed 在使用post__in 时,它似乎禁用了元查询 (以及税务查询。所以你需要在 SQL 中包含你的查询...
  • 我认为因为我必须使用该过滤器,所以这个插件提供了 'prdctfltr_meta_query' 来进行查询,并且由于这个 wp 过滤器期望一个 WC 元查询作为输入,所以我想到了一个改变自定义字段的想法保存功能,因此自定义字段值(对于具有最高值的变体)不仅保存在变体 ID 中,而且还保存在父帖子 ID 中,您如何看待这个想法?
  • @IslamMohamed 是的,这是一个聪明的主意
猜你喜欢
  • 2021-06-04
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 2023-03-14
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多