WP_Query: Исключение скрытых товаров из списка продуктов WooCommerce

30 июн. 2016 г., 20:38:08
Просмотры: 19.7K
Голосов: 7

Надеюсь, это не слишком специфично для WooCommerce.

У меня есть удобный шорткод, который выводит список всех моих товаров с артикулами. Однако он также включает товары, которые я опубликовал, но установил видимость в каталоге как "скрытый".

Я не могу найти аргумент/параметр для исключения скрытых товаров (или включения только тех, что помечены как Видимый в каталоге/поиске).

Я знаю, что это должно быть просто, но пока не нашёл решения. Спасибо за любую помощь.

Вот код:

<?php
$params = array('posts_per_page' => -1, 'post_type' => 'product', 'orderby' => 'menu-order', 'order' => 'asc');
$wc_query = new WP_Query($params);
?>
<table class="product-list tablesorter"><thead><tr><th>Артикул</th><th>Название товара</th></tr></thead><tbody>
     <?php if ($wc_query->have_posts()) : ?>
     <?php while ($wc_query->have_posts()) :
                $wc_query->the_post(); ?>
 <tr>
<td><?php global $product; echo $product->get_sku(); ?></td>
<td><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></td>
</tr>
     <?php endwhile; ?>
     <?php wp_reset_postdata(); ?>
     <?php else:  ?>
     <tr><td>
          <?php _e( 'Нет товаров' ); ?>
    </td> </tr>
     <?php endif; ?>
</tbody>
</table>
1
Комментарии

Хочу отметить, что этот код в конечном итоге приведёт к катастрофическому сбою из-за того, что параметр posts_per_page установлен в значение -1. Лишь немногие серверы смогут обработать такой код при наличии 1000 записей, не говоря уже о 20 000. А теперь умножьте это на количество посетителей вашего сайта

Tom J Nowell Tom J Nowell
3 дек. 2016 г. 23:10:14
Все ответы на вопрос 2
0
24

Начиная с WooCommerce 3, видимость была изменена с мета-данных на таксономию. Поэтому вам нужно заменить meta_query на tax_query. Чтобы показать только видимые товары, используйте:

'tax_query' => array(
    array(
        'taxonomy' => 'product_visibility',
        'field'    => 'name',
        'terms'    => 'exclude-from-catalog',
        'operator' => 'NOT IN',
    ),
),

И пример для Рекомендуемых товаров:

'tax_query' => array(
    array(
        'taxonomy' => 'product_visibility',
        'field'    => 'name',
        'terms'    => 'featured',
    ),
),

Возможные значения terms: 'exclude-from-search' (исключить из поиска), 'exclude-from-catalog' (исключить из каталога), 'featured' (рекомендуемые), 'outofstock' (нет в наличии).

6 апр. 2017 г. 08:50:01
2

Важно: Следующее работает только для версий WooCommerce ниже 3.0. Для более актуального ответа, пожалуйста, ознакомьтесь с другим ответом от kalle.

WooCommerce сохраняет эти данные как метаданные, поэтому вам нужно выполнить Meta Query по имени _visibility. Например:

'meta_query' => array(
    array(
        'key'       => '_visibility',
        'value'     => 'hidden',
        'compare'   => '!=',
    )
)

Это выберет все записи, у которых мета-поле _visibility не равно значению hidden.

30 июн. 2016 г. 20:44:17
Комментарии

Идеально. Именно это мне и было нужно. Для тех, кто ищет этот ответ, вот полный запрос, соответствующий вышеописанному.

<?php $params = array('posts_per_page' => -1, 'post_type' => 'product', 'orderby' => 'menu-order', 'order' => 'asc', 'meta_query' => array( array( 'key' => '_visibility', 'value' => 'hidden', 'compare' => '!=', ) )); $wc_query = new WP_Query($params); ?>

Peter Ingersoll Peter Ingersoll
30 июн. 2016 г. 21:39:04

@PeterIngersoll К вашему сведению, вы можете отметить этот ответ как принятый, чтобы показать будущим посетителям, что сработало для вас :) Галочка находится слева от ответа Howdy. Подробнее читайте здесь: http://wordpress.stackexchange.com/help/someone-answers

Tim Malone Tim Malone
5 июл. 2016 г. 10:57:59