这并不是pre\\u get\\u帖子的工作原理。您发送给函数的原始参数不好。
唯一需要的是$查询。
您的解决方法是在pre\\u get\\u posts函数中运行函数,返回与要包含的变体相对应的post\\u ID数组,然后在pre\\u get\\u posts函数中,您需要$query->set
论点,像这样(这只是一个例子,你必须找到正确的):
$query->set(\'post__in\', $include_products);
return $query; // at the end of the function
您可以阅读有关该操作的更多信息
hereUPDATE关于meta\\u query参数(也包括tax\\u query…):它总是必须是一个数组的数组才能启用不同meta\\u键之间的任何关系,因此,您的代码需要,
$query->set(\'meta_query\', array($meta_query) );
或者以另一种方式将数组的数组直接嵌入
$meta_query
$meta_query = array(
array(
\'key\' => \'_visibility\',
\'value\' => \'visible\',
\'compare\' => \'=\'
)
);
更新2
您可以使用WP_Query
post__in
参数,但我不知道它是否会起作用,因为它将取决于额外的woocommerce筛选器和隐藏产品的操作,在这种情况下,您可以尝试不同的pre\\u get\\u posts操作优先级:
function tm_remove_product_stock_region($query) {
$product_variable = new WC_Product_Variable();
$product_variations = $product_variable->get_available_variations();
// you don\'t need to run the function in the loop, the user_region is always the same
/** Get users region. */
$user_region = tm_get_user_region();
$post__in = array();
foreach ( $product_variations as $variation ) {
/** Get products regions. */
$product_region = $variation[\'attributes\'][\'attribute_pa_regions\'];
if ( $user_region === $product_region && ! $variation[\'is_in_stock\'] ) {
$post__in[] = $variation[\'product_id\'];
}
else if ( $user_region === $product_region && $variation[\'is_in_stock\'] ) {
$post__in[] = $variation[\'product_id\'];
}
}
if(is_array($post__in) && $post__in != null){
$query->set(\'post__in\', $post__in);
}
return $query;
}
//Look into apply_filter
add_action(\'pre_get_posts\', \'tm_remove_product_stock_region\');
希望有帮助!