Произвольная сортировка для категории товаров в Woocommerce

Комментариев: 0

В Woocommerce есть несколько встроенных вариантов сортировки товаров:

  1. Внешний вид -> Настроить -> Woocommerce -> Каталог товаров -> Исходная сортировка товаров. Данный способ позволяет установить сортировку по-умолчанию для всех категорий товаров.
  2. Второй вариант заключается в том, чтобы выставить вручную сортировку товара в нужной категории. Для этого переходим в консоли в раздел "Товары" -> Все товары, выбираем в фильтре нужную категорию, нажимаем кнопку "Фильтр", затем нажимаем ссылку "Сортировка" и сортируем товары на своё усмотрение (путем обычного перетаскивания вверх или вниз).

Но, иногда товаров очень много и ручная сортировка не вариант. Например нужно одну категорию отсортировать по названию, другую по возрастанию цены, третью по убыванию и т.д.
Для решения данной задачи можно воспользоваться следующим кодом, который необходимо добавить в файл function.php вашей темы:

add_action('product_cat_edit_form_fields', 'custom_category_sorting_field', 10, 1);

// Сохраняем значения полей сортировки при сохранении категории
function save_custom_category_sorting_fields($term_id) {
    if (isset($_POST['category_sorting_type'])) {
        update_term_meta($term_id, 'category_sorting_type', sanitize_text_field($_POST['category_sorting_type']));
    }
    if (isset($_POST['category_sorting_order'])) {
        update_term_meta($term_id, 'category_sorting_order', sanitize_text_field($_POST['category_sorting_order']));
    }
}
add_action('edited_product_cat', 'save_custom_category_sorting_fields', 10, 1);


// Применяем выбранную сортировку при выводе товаров в категории
function apply_custom_category_sorting($query) {
    if (!is_admin() && $query->is_main_query() && is_product_category()) {
        $term_id = get_queried_object_id();
        $sorting_type = get_term_meta($term_id, 'category_sorting_type', true);
        $sorting_order = get_term_meta($term_id, 'category_sorting_order', true);

        if ($sorting_type && $sorting_order) {
            switch ($sorting_type) {
                case 'name':
                    $query->set('orderby', 'name');
                    break;
                case 'price':
                    $query->set('orderby', 'meta_value_num');
                    $query->set('meta_key', '_price');
                    break;
                // Добавьте дополнительные кейсы для других типов сортировки
                default:
                    // По умолчанию оставляем сортировку WooCommerce
                    break;
            }

            $query->set('order', $sorting_order);
        }
    }
}
add_action('pre_get_posts', 'apply_custom_category_sorting');

Теперь, если перейти к редактированию категории, вы можете увидеть, что там появились дополнительные поля, которые позволяют выбрать тип сортировки и её направление.

Уведомлять о новых комментариях
Уведомлять
guest
0 комментариев
Inline Feedbacks
View all comments