Как вывести товары в выпадающее меню из определенной категории?

Ссылка скопирована
PHP
1 ответ

Подскажите пожалуйста как вывести товары в выпадающее меню из определенной категории? Сейчас выводит все товары, которые есть на сайте. Спасибо

<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>

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Backend-редакция Ответ

Чтобы в выпадающем меню выводились товары только из нужной категории 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'],
        ],
    ],
]);

$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();
}

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. Тогда будут показаны только выбранные товары, которые относятся к нужной категории.

  • Для WooCommerce категория товара — это product_cat, а не обычная category.
  • Для slug используйте 'field' => 'slug', для ID — 'field' => 'term_id'.
  • Не ставьте posts_per_page => -1 в шапке, если товаров много: меню станет тяжёлым.
  • После кастомного WP_Query всегда вызывайте wp_reset_postdata().

С точки зрения UX обычно лучше выводить в верхнем меню категории и ключевые товары, а не весь каталог. Большой список товаров ухудшит скорость, мобильную навигацию и поддержку меню.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно