Три частые правки магазина на WooCommerce: порядок товаров в каталоге, знак валюты и надписи на кнопке «В корзину». Часть делается в настройках, остальное - небольшими фильтрами в коде.

Куда добавлять код

Код из этой статьи вставляйте в functions.php дочерней темы - при обновлении основной темы её functions.php перезаписывается и правки пропадут. Если дочерней темы нет, используйте плагин для пользовательских фрагментов кода или небольшой собственный плагин (файл с заголовком плагина в папке wp-content/plugins/).

После вставки кода проверьте сайт: ошибка в PHP может сделать его недоступным. Удобнее сначала проверить на копии сайта.

Сортировка товаров

Вертикальный список товаров со стрелкой сортировки

Сортировка по умолчанию

Без кода: «Внешний вид» → «Настроить» → «WooCommerce» → «Каталог товаров» → «Сортировка товаров по умолчанию». Доступны:

  • по умолчанию (сортировка вручную + по названию);
  • по популярности (количеству продаж);
  • по рейтингу;
  • по новизне;
  • по цене - по возрастанию и по убыванию.

Порядок «по умолчанию» задаётся вручную: «Товары» → «Все товары» → «Сортировка», затем перетаскивание товаров мышью. Работает и для отдельных категорий: отфильтруйте список по категории, затем сортируйте.

В блочных темах страница каталога собирается из блоков в редакторе сайта, но сортировка по умолчанию по-прежнему берётся из этой настройки.

Сортировку по умолчанию можно задать и кодом, например «по новизне»:

php
add_filter( 'woocommerce_default_catalog_orderby', function () {
    return 'date';
} );

Возможные значения: menu_order, popularity, rating, date, price, price-desc.

Своя сортировка для отдельной категории

Например, в категории «Распродажа» показывать сначала дешёвые товары:

php
add_filter( 'woocommerce_default_catalog_orderby', function ( $orderby ) {
    if ( is_product_category( 'rasprodazha' ) ) {
        return 'price';
    }
    return $orderby;
} );

rasprodazha - ярлык (slug) категории, его видно в «Товары» → «Категории».

Убрать или переименовать варианты в списке сортировки

Список сортировки над товарами формирует фильтр woocommerce_catalog_orderby:

php
add_filter( 'woocommerce_catalog_orderby', function ( $options ) {
    unset( $options['rating'] );                 // убрать «По рейтингу»
    $options['date'] = 'Сначала новые';          // переименовать
    return $options;
} );

Убрать список сортировки целиком:

php
add_action( 'init', function () {
    remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30 );
} );

Новый вариант сортировки

Например, «по алфавиту»:

php
add_filter( 'woocommerce_catalog_orderby', function ( $options ) {
    $options['title'] = 'По названию';
    return $options;
} );

add_filter( 'woocommerce_get_catalog_ordering_args', function ( $args, $orderby ) {
    if ( 'title' === $orderby ) {
        $args['orderby'] = 'title';
        $args['order']   = 'ASC';
    }
    return $args;
}, 10, 2 );

Знак валюты

Через настройки

«WooCommerce» → «Настройки» → «Основные» → «Настройки валюты»:

  • валюта магазина;
  • расположение символа: слева, справа, слева с пробелом, справа с пробелом;
  • разделители тысяч и дробной части, число знаков после запятой.

Для рубля обычно выбирают «Справа с пробелом», разделитель тысяч - пробел, знаков после запятой - 0.

Заменить знак

Если вместо «₽» нужно «руб.», а вместо «$» - «USD»:

php
add_filter( 'woocommerce_currency_symbol', function ( $symbol, $currency ) {
    switch ( $currency ) {
        case 'RUB':
            return 'руб.';
        case 'USD':
            return 'USD';
    }
    return $symbol;
}, 10, 2 );

Убрать знак

php
add_filter( 'woocommerce_currency_symbol', function ( $symbol, $currency ) {
    return '';
}, 10, 2 );

Цены останутся без обозначения валюты. Если знак убран, а пробел от «справа с пробелом» мешает, переключите расположение на «Справа».

Учтите, что фильтр меняет знак во всём магазине, включая письма и счета. Если знак нужно убрать только в каталоге, проще скрыть его стилями: символ в разметке цены обёрнут в элемент с классом woocommerce-Price-currencySymbol.

Текст кнопки «В корзину»

Для кнопки в каталоге (архивы, категории, блоки товаров) и на странице товара используются разные фильтры:

php
// Кнопка в каталоге
add_filter( 'woocommerce_product_add_to_cart_text', function ( $text, $product ) {
    if ( $product->is_type( 'simple' ) && $product->is_purchasable() && $product->is_in_stock() ) {
        return 'Купить';
    }
    return $text;
}, 10, 2 );

// Кнопка на странице товара
add_filter( 'woocommerce_product_single_add_to_cart_text', function ( $text, $product ) {
    return 'Купить';
}, 10, 2 );

Проверка типа в первом фильтре нужна, чтобы не сломать смысл кнопок у вариативных товаров («Выбрать параметры») и товаров не в наличии («Подробнее»).

Свой текст для определённой категории:

php
add_filter( 'woocommerce_product_single_add_to_cart_text', function ( $text, $product ) {
    if ( has_term( 'podarochnye-karty', 'product_cat', $product->get_id() ) ) {
        return 'Оформить подарок';
    }
    return $text;
}, 10, 2 );

Сообщение после добавления в корзину

Фразу «Товар добавлен в вашу корзину» меняет фильтр wc_add_to_cart_message_html:

php
add_filter( 'wc_add_to_cart_message_html', function ( $message, $products ) {
    $count = array_sum( $products );
    $link  = sprintf( '<a href="%s" class="button wc-forward">%s</a>', esc_url( wc_get_cart_url() ), 'Перейти в корзину' );
    return sprintf( 'Добавлено в корзину: %d шт. %s', $count, $link );
}, 10, 2 );

Без кода

Если нужно поменять много надписей сразу, удобнее отредактировать перевод: тексты WooCommerce хранятся в языковых файлах, и плагины для редактирования переводов позволяют заменить любую фразу в админке. Правки при этом сохраняются отдельно и не пропадают при обновлении WooCommerce.

Если изменения не видны

  • Очистите кэш: плагина кэширования, сервера и браузера.
  • Проверьте, что код в дочерней теме, и она активна.
  • Тема или конструктор страниц может выводить свою кнопку или сортировку вместо стандартной - тогда ищите настройку в самой теме.