Пользовательский цикл Woocommerce для отображения всех товаров
Я сейчас работаю над сайтом электронной коммерции и столкнулся с проблемой. Мой клиент хочет страницу e-boutique со всеми отображаемыми категориями товаров, за которыми следуют три продвигаемых товара и кнопка "показать все".
Эта кнопка "Показать все" должна отображать все товары, которые есть в магазине, с настройками сортировки и постраничной навигации WooCommerce по умолчанию.
Во-первых, я не уверен, правильно ли я это делаю. На данный момент у меня есть страница, показывающая категории товаров, и когда на этой странице я нажимаю кнопку "показать все", я перезагружаю страницу с аргументом GET
/?all=1
и отображаются товары.
<a class="product-category-view-all" href="?all=1"><?php _e('Показать все'); ?></a>
Я скопировал идею из этого поста, и вот мой код:
<div id="content" class="hfeed">
<h1><?php _e('E-boutique'); ?></h1>
<?php
if (isset($_GET['all']))
{
$args = array(
'post_type' => 'product',
'orderby' => $orderby,
);
$wp_query = new WP_Query($args);
?>
<?php do_action('woocommerce_before_shop_loop'); // сортировка woocommerce ?>
<div class="clear"></div>
<ul class="products-list">
<?php woocommerce_product_subcategories(); ?>
<?php while ($wp_query->have_posts()) : $wp_query->the_post(); ?>
<?php woocommerce_get_template_part('content', 'product'); ?>
<?php
endwhile; // конец цикла
wp_reset_query();
?>
</ul>
<div class="clear"></div>
<?php do_action('woocommerce_after_shop_loop'); // пагинация woocommerce ?>
<?php
}
else
{
// Код для отображения категорий товаров с миниатюрами.
}
?>
Товары отображаются правильно, и селект для сортировки виден. Когда я хочу изменить сортировку, страница перезагружается, но порядок не меняется, а постраничная навигация установлена на 3 товара на странице, но это не соблюдается (кнопки постраничной навигации не отображаются).
Хочу добавить, что это мой первый сайт с использованием WordPress и WooCommerce.

Я не полностью решил свою проблему. Мой клиент передумал и больше не хотел сортировки.
Что касается пагинации, мне удалось заставить её работать, добавив новый аргумент в мой запрос. Вот код, который сработал для меня:
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'product',
'paged' => $paged,
);
$wp_query = new WP_Query($args);
if (isset($_GET['all']))
{
?>
<?php do_action('woocommerce_archive_description'); ?>
<?php if (have_posts()) : ?>
<?php
// Мне больше не нужна сортировка
//do_action('woocommerce_before_shop_loop');
?>
<ul class = "products-list">
<?php while (have_posts()) : the_post(); ?>
<?php woocommerce_get_template_part('content', 'product'); ?>
<?php endwhile; // конец цикла. ?>
</ul>
<?php
/* пагинация woocommerce */
do_action('woocommerce_after_shop_loop');
?>
<?php elseif (!woocommerce_product_subcategories(array('before' => woocommerce_product_loop_start(false), 'after' => woocommerce_product_loop_end(false)))) : ?>
<?php woocommerce_get_template('loop/no-products-found.php'); ?>
<?php endif; ?>
<?php
}
else
{
// Код для отображения категорий товаров с миниатюрами.
}
?>
Переменная $paged
помогает мне получить текущую страницу, переданную в URL через GET.
Ещё раз, я не знаю, является ли это лучшим способом сделать это. Но это сработало для меня.
Надеюсь, это поможет кому-то.

В вашем массиве $args вы можете добавить 'posts_per_page' => -1
, чтобы показать все товары. Результат будет выглядеть так:
$args = array(
'post_type' => 'product', // Тип записи - товар
'paged' => $paged, // Номер страницы
'posts_per_page' => -1 // Показать все товары
);
