Как получить критерий сортировки в общем цикле?

Добрый день
Мне поставили задачу отображать товары в магазине по определенному порядку. Причем в каждой категории товаров порядок разный. Например: Есть категория спортивная одежда и в ней есть такие товары как футболки, майки, перчатки, шорты. Задача - вывести на странице этой категории сначала все футболки, потом все шорты, потом остальное. Но эти же товары есть и в других категориях, причем в других категориях футболки уже не будут на первом месте.
После долгих хождений по googl-у решил, что самый подходящий вариант - это сделать как описано здесь.
Процитирую
Это сделать не сложно, но требует знания php как минимум. Смысл в том что бы изменить шаблон archive-product.php. Нужно изменить в этом шаблоне цикл и отключить wc_get_template_part(). Нужно в цикле while не выводить контент, а формировать ассоциативный массив. Грубо говоря у нас есть список всех товаров(записей). В цикле мы проходим по всем товарам. У каждого товара мы получаем метку. И записывай в массив, где ключ ячейки это как раз метка товара. В итоге массив будет иметь примерный вид array('metka_tovara1' => array('массив товаров'), 'metka_tovara2' => array('массив товаров2'), 'metka_tovara3' => array('массив товаров3')). В массиве товаров хранятся товары. Для каждого товара имеется список необходимых полей для вывода - ссылка, изображение, заголовок, описание, цен и т.д.. После этого выводим с помощью этого массива поблочно(пометочно) товары

Такой способ не повлияет на стандартную работу woocommerce и на фильтр. Возможно написано сложно, но подробнее - это написать код.

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

А теперь ВОПРОС: Как мне, когда я нахожусь в основном цикле вывода товаров или перед ним, узнать была ли сортировка по умолчанию (default) или пользователь что-то выбрал?

ps/ Возможно я иду не в правильном направлении, тогда поправьте пожалуйста и подскажите как такое организовать.
Спасибо
  • Вопрос задан
  • 201 просмотр
Решения вопроса 1
trampick
@trampick
Веб-разработчик
А теперь ВОПРОС: Как мне, когда я нахожусь в основном цикле вывода товаров или перед ним, узнать была ли сортировка по умолчанию (default) или пользователь что-то выбрал?
- 1 вариант, посмотреть $_REQUEST. Когда используется сортировка то, там что то есть.
- 2 вариант посмотреть global wp_query при разной сортировке, узнать что там меняется.

Тут нужно прикинуть насколько много товаров в каждой категории и сколько категорий. Я подскажу самый легкий способ реализации через кастомные поля. Для каждой карточки товара нужно создавать кастомное поле с названием 'order_$term_id'. Т.е. в зависимости от количество рубрик в которых находится товар, будет количество таких полей. Можно написать скрипт который сам будет создавать эти поля в зависимости от количества выбранных категорий. В эти поля нужно проставлять числа позиций. К примеру у футболок будет число от 0 до 100, у шорт от 100 до 200 и т.д. Здесь не принципиально и нужно делать как нужно. Можно всем шортам проставить одно число или разное в зависимости нужно ли сортировать дополнительно внутри группы шорт.
Получается что у всех карточек категории с id 16 будет кастомное поле order_16 с значениями внутри. Важно что бы хотя бы 0 там стоял.
Ну и последним шагом нужно находясь в категории перехватывать запрос wp_query и изменять сортировку
$args = array(
   'meta_key' => 'order_16',
   'orderby' => 'meta_value_num',
   'order' => 'ASC',
 );

add_action( 'pre_get_posts', 'modify_main_query' );
function filters_modify_main_query( $query ) {

	return $query;
}

Делать это нужно, если конечно в $_REQUEST в ячейки сортировки нет ничего.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы