Можно изменить стандартный запрос получения товаров WooCommerсe (добавьте код в functions.php или в отдельный файл который подключается в него):
add_action( 'woocommerce_product_query', 'custom_woocommerce_product_query' );
function custom_woocommerce_product_query ($q) {
$q->set( 'post_type', array( 'product', 'product_variation' ) );
return $q;
}
У вас выведутся все товары и все их вариации, я думаю это будет избыточно, тогда нужно изменить этот запрос под себя, условиями или как-нибудь еще если вы умеете. Я добавил галочку для вариаций отображать в каталоге или нет и получаю только отмеченные товары, простые товары при этом запросе пропадают, мне этого было достаточно:
/**
* Добавление своего поля для вариаций
*/
add_action( 'woocommerce_variation_options', 'add_custom_field_to_variations', 10, 3 );
function add_custom_field_to_variations( $loop, $variation_data, $variation ) {
$checked = get_post_meta( $variation->ID, 'catalog_visibility', true ) ) ? 'checked="checked"' : '';
?>
<label>
Показать в каталоге?
<input type="checkbox" class="checkbox" name="catalog_visibility[<?= $loop ?>]" <?= $checked; ?>/>
</label>
<?php
}
/**
* Сохранение в админке своего поля для вариаций
*/
add_action( 'woocommerce_save_product_variation', 'save_custom_field_variations', 10, 2 );
function save_custom_field_variations( $variation_id, $i ) {
$catalog_visibility = $_POST['catalog_visibility'][$i];
if ( $catalog_visibility ) {
update_post_meta( $variation_id, 'catalog_visibility', true );
} else {
delete_post_meta( $variation_id, 'catalog_visibility' );
}
}
/**
* Добавление вариативных товаров в каталог
*/
add_action( 'woocommerce_product_query', 'custom_woocommerce_product_query' );
function custom_woocommerce_product_query ($q) {
// Добавление вариаций в каталог
$q->set( 'post_type', array( 'product', 'product_variation' ) );
// Оставляем только вариации в каталоге
$meta_query = (array) $q->get( 'meta_query' );
$meta_query[] = array(
'key' => 'catalog_visibility',
'value' => '1',
);
$q->set( 'meta_query', $meta_query );
return $q;
}