Как вывести товары в выпадающее меню из определенной категории?
Подскажите пожалуйста как вывести товары в выпадающее меню из определенной категории? Сейчас выводит все товары, которые есть на сайте. Спасибо
<li class="menu__list"> <button type="button" class="menu__button _icon-arrow-2" data-spoller> <a href='#'><?php echo get_field('menu-3', 'options'); ?></a> </button> <div class="menu__items"> <?php $page_id = get_the_ID(); $catalog_products = carbon_get_post_meta( $page_id, 'catalog_products' ); $catalog_products_ids = wp_list_pluck( $catalog_products, 'id'); $catalog_products_query_args = [ 'post_type' => 'product', 'post__in' => $catalog_products_ids, ]; $catalog_products_query = new WP_Query ( $catalog_products_query_args ); ?> <ul data-spollers="767.98, max" class="menu__product"> <?php if ( $catalog_products_query -> have_posts() ) : ?> <?php while ( $catalog_products_query -> have_posts() ) : $catalog_products_query -> the_post(); ?> <li class="menu__item"> <a href="<?php echo get_permalink(); ?>"> <?php the_title(); ?> </a> </li> <?php endwhile; ?> <?php wp_reset_postdata(); ?> <?php endif; ?> </ul> </div> </li> |
<li class="menu__list"> <button type="button" class="menu__button _icon-arrow-2" data-spoller> <a href='#'><?php echo get_field('menu-3', 'options'); ?></a> </button> <div class="menu__items"> <?php $page_id = get_the_ID(); $catalog_products = carbon_get_post_meta( $page_id, 'catalog_products' ); $catalog_products_ids = wp_list_pluck( $catalog_products, 'id'); $catalog_products_query_args = [ 'post_type' => 'product', 'post__in' => $catalog_products_ids, ]; $catalog_products_query = new WP_Query ( $catalog_products_query_args ); ?> <ul data-spollers="767.98, max" class="menu__product"> <?php if ( $catalog_products_query -> have_posts() ) : ?> <?php while ( $catalog_products_query -> have_posts() ) : $catalog_products_query -> the_post(); ?> <li class="menu__item"> <a href="<?php echo get_permalink(); ?>"> <?php the_title(); ?> </a> </li> <?php endwhile; ?> <?php wp_reset_postdata(); ?> <?php endif; ?> </ul> </div> </li>
Дополнительно
Неужели так сложно отформатировать код перед добавлением в вопрос? Что бы не было этих огромных отступов. Смотреть неудобно...
Ответы:
<li class="menu__list"> <button type="button" class="menu__button _icon-arrow-2" data-spoller> <a href='#'><?php echo get_field('menu-3', 'options'); ?></a> </button> <div class="menu__items"> <ul data-spollers="767.98, max" class="menu__product"> <?php // ID или slug категории, из которой нужно получить товары $category_id = 'категория-id-или-слуг'; // Аргументы для запроса $args = array( 'post_type' => 'product', 'posts_per_page' => -1, // Вывести все товары 'tax_query' => array( array( 'taxonomy' => 'product_cat', 'field' => 'term_id', // Можно использовать 'slug' вместо 'term_id', если используете slug категории 'terms' => $category_id, 'operator' => 'IN', ), ), ); $catalog_products_query = new WP_Query($args); if ($catalog_products_query->have_posts()) : while ($catalog_products_query->have_posts()) : $catalog_products_query->the_post(); ?> <li class="menu__item"> <a href="<?php echo get_permalink(); ?>"> <?php the_title(); ?> </a> </li> <?php endwhile; wp_reset_postdata(); endif; ?> </ul> </div> </li> |
<li class="menu__list"> <button type="button" class="menu__button _icon-arrow-2" data-spoller> <a href='#'><?php echo get_field('menu-3', 'options'); ?></a> </button> <div class="menu__items"> <ul data-spollers="767.98, max" class="menu__product"> <?php // ID или slug категории, из которой нужно получить товары $category_id = 'категория-id-или-слуг'; // Аргументы для запроса $args = array( 'post_type' => 'product', 'posts_per_page' => -1, // Вывести все товары 'tax_query' => array( array( 'taxonomy' => 'product_cat', 'field' => 'term_id', // Можно использовать 'slug' вместо 'term_id', если используете slug категории 'terms' => $category_id, 'operator' => 'IN', ), ), ); $catalog_products_query = new WP_Query($args); if ($catalog_products_query->have_posts()) : while ($catalog_products_query->have_posts()) : $catalog_products_query->the_post(); ?> <li class="menu__item"> <a href="<?php echo get_permalink(); ?>"> <?php the_title(); ?> </a> </li> <?php endwhile; wp_reset_postdata(); endif; ?> </ul> </div> </li>
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Чтобы в выпадающем меню выводились товары только из нужной категории WooCommerce, запрос нужно ограничить таксономией
product_cat. Сейчас у вас запрос строится по выбранным ID из Carbon Fields, а если эти ID пустые или не фильтруются категорией, в меню может попадать лишний набор товаров.Если категория известна заранее, используйте
tax_query:$products = new WP_Query([ 'post_type' => 'product', 'post_status' => 'publish', 'posts_per_page' => 20, 'tax_query' => [ [ 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => ['slug-kategorii'], ], ], ]);
Вывод ссылок:
if ($products->have_posts()) { echo '<ul class="menu__product">'; while ($products->have_posts()) { $products->the_post(); echo '<li class="menu__item"><a href="' . esc_url(get_permalink()) . '">' . esc_html(get_the_title()) . '</a></li>'; } echo '</ul>'; wp_reset_postdata(); }
Если Carbon Fields нужен именно для ручного выбора товаров, можно совместить оба условия: оставить
post__inи дополнительно добавитьtax_query. Тогда будут показаны только выбранные товары, которые относятся к нужной категории.product_cat, а не обычнаяcategory.'field' => 'slug', для ID —'field' => 'term_id'.posts_per_page => -1в шапке, если товаров много: меню станет тяжёлым.WP_Queryвсегда вызывайтеwp_reset_postdata().С точки зрения UX обычно лучше выводить в верхнем меню категории и ключевые товары, а не весь каталог. Большой список товаров ухудшит скорость, мобильную навигацию и поддержку меню.