Как отобразить шорткодом [products] товары только главной категории без подкатегорий в Woo

Вот уже месяц я мучаю гугл запросами:

  • Показать товары шорткодом без товаров подкатегорий в  Woocommerce
  • Настройки woo отображение товара подкатегорий
  • Woocommerce disable products subcategory in shortcode
  • Shortcode woocommerce show products only category

И нашел я код, который должен был убрать с отображения товары из подкатегории. Все пишут, что это работает, но у меня не работает никак. И тут я понял — это работает для страницы категории, но никак не для шорткода типа

[products category = "samsung"]

 

И теперь я в поисках либо кода, либо шорткода.


Пришлось все делать самому. Два месяца гуглил и писал на форумы — безрезультатно.

Сначала я нашел хук, который ловит событие шорткод, который отображает товары из категории (ну и подкатегорий).

Далее надо было посмотреть, какой массив приходит в эту функцию, для этого я использовал команду print_r:

add_filter( ‘woocommerce_shortcode_products_query’, ‘woocommerce_shortcode_products_orderby’ );

function woocommerce_shortcode_products_orderby( $wp_query ) {

print_r($wp_query);

return $wp_query;
}

Эта штука вывела мне массив в вот таком виде:

Array ( [post_type] => product [post_status] => publish [ignore_sticky_posts] => 1 [no_found_rows] => 1 [orderby] => menu_order title [order] => ASC [posts_per_page] => -1 [meta_query] => Array ( ) [tax_query] => Array ( [0] => Array ( [taxonomy] => product_visibility [field] => term_taxonomy_id [terms] => Array ( [0] => 101 ) [operator] => NOT IN ) [1] => Array ( [taxonomy] => product_cat [terms] => Array ( [0] => remont-xiaomi ) [field] => slug [operator] => IN [include_children] => 0 ) ) )

Трудно разобраться в структуре массива, потому что он многоуровневый (трехэтажный массив в массиве).

Запускаю нормальный редактор, и табами распределяю уровни.

Похоже, что нам нужен предпоследний ключ [include_children] и его значение 1 надо изменить на 0 (выключить дочерние категории).

Так как я программист такой себе, сначала я «затупил» и написал $wp_query[include_children]=0;
Это не изменило искомый ключ в под-под-под массиве, а добавило в массив в верхнем уровне новый ключ.

Почитав, инструкцию к PHP, написал в итоге правильно:

add_filter( ‘woocommerce_shortcode_products_query’, ‘woocommerce_shortcode_products_orderby’ );

function woocommerce_shortcode_products_orderby( $wp_query ) {

$wp_query[tax_query][1][include_children]=0;
//print_r($wp_query);

return $wp_query;
}

Оставьте комментарий