如何通过产品变体对可变产品进行 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 文件。已测试并有效。
在 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 文件。已测试并有效。