如何通过变量产品的变体形式对它们进行WC meta_query?

时间:2019-04-22 14:53:54

标签: php sql wordpress woocommerce metadata

在WooCommerce产品上,我有一个名为“ amazon_price”的自定义元字段,并且如果该“ amazon_price”自定义字段未设置价格,我想隐藏产品而不显示在前端。

我使用此代码进行了过滤,该过滤对于简单的产品而言效果很好,但是即使它们设置了“ amazon_price”字段,它也不会显示可变的产品,我想这个问题背后的原因是该代码可能正在寻找“产品主帖子ID上的amazon_price”字段值,因此我认为这可能是在寻找变量产品的主帖子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 个答案:

答案 0 :(得分:0)

我认为不可能对可变产品的产品变化进行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文件中。经过测试,可以正常工作。