如何通过产品变体对可变产品进行 WC meta_query?

How to do WC meta_query on variable products via their product variations?

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

我使用此代码进行过滤,它适用于简单产品,但它不会显示可变产品,即使它们设置了 "amazon_price" 字段,我猜这个问题背后的原因是此代码也许在产品的主要 post ID 上寻找 "amazon_price" 字段值,所以我认为这可能是在寻找可变产品的主要 post 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 );
}

我认为不可能对可变产品的产品变体进行 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 文件。已测试并有效。