Я понял:
Вы используете
$q->set('post__in', $postIDs);
Это заставляет WooCommerce отображать точный массив продуктов в массиве $ postIDs;
Окончательный код выглядит например:
add_action( 'woocommerce_product_query', array($this, 'your_product_function') );
function your_product_function(){
/* MAKE YOUR 2 CUSTOM PRODUCT QUERIES AS WP QUERIES */
$queryA = new WP_Query($queryAparams);
$queryB = new WP_Query($queryBparams);
$postIDs= array_merge($queryA->posts,$queryB->posts);
/* IMPORTANT, if the ARRAY is EMPTY, ALL PRODUCTS WILL BE SHOWN. A quick bypass is to pass an array of invalid ids as you can see below */
if(!empty($allTheIDs)){
$q->set('post__in',$postIDs);
} else {
$q->set('post__in',array('invalidid'));
}
}
Очень важно, чтобы в параметрах передавались «поля» -> «идентификаторы», чтобы получить только идентификаторы. Так выглядят отдельные запросы
$queryBparams = array(
'posts_per_page' => -1,
'post_type' => 'product',
'fields' => 'ids',
'meta_query'=> array(
'relation' => 'AND',
array(
'relation' => 'OR',
array(
'key' => 'b2bking_group_'.$currentusergroupidnr,
'value' => '1'
),
array(
'key' => 'b2bking_user_'.$currentuserlogin,
'value' => '1'
)
),
array(
'key' => 'b2bking_product_visibility_override',
'value' => 'manual',
)
));