Авг
24
53

WooCommerce сортировка по наличию товаров («нет в наличии» в конце списка)

WooCommerce нет в наличииПродолжаем разбирать разные вопросы по плагину WooCommerce — от рекомендуемых товаров до корзины интернет-магазина на WordPress. Сегодня поговорим о реализации корректной сортировки по наличию товаров с учетом их количества на складе — требуется чтобы отсутствующая продукция выводились в конце списка. Мне казалось, найти нужный код будет проще, но как-то слишком мало внимания англоязычные источники уделяют этому вопросу. Ниже в статье поделюсь несколькими примерами кода для реализации задач, что могут возникнуть в ходе работы. 

Новичкам советую глянуть обзор плагина WHWS Display In Stock Products First который легко и быстро решает задачу сортировки по наличию. Если хотите начать с теории, то можете ознакомиться со статьей про наличие товара в Woocommerce, где я уже писал о некоторых полезных фишках по теме: вывод надписи, бейджиков и т.п.

Если говорить вкратце, то в настройке «Запасы», располагающейся под описанием каждой из позиций, вы можете указывать статус «нет в наличии», если потребуется.

WooCommerce - настройка наличия товаров

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

WooCommerce - отображение наличия товаров

Определение наличия/отсутствия WooCommerce товаров вручную — самый простой метод работы со складом, хотя, насколько я знаю, там есть и более серьезный функционал, связанный с артикулами, синхронизацией и т.п.

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

Да, в настройках WooCommerce есть возможность скрывать все товары не в наличии:

видимость товаров не в наличии

Однако я бы лично этого делать не стал — данные страницы могут давать дополнительный трафик на сайт. К тому же, если через некоторое время вы пополните запасы склада, не придется заново ждать пока та или иная страница проиндексируется. Лучшим выходом из ситуации является создание правильной WooCommerce сортировки по наличию товаров, где отсутствующие позиции будут располагаться в конце списка (на последних страницах).

Вот рабочий код для решения задачи (добавляется в functions.php):

<?php /**
 * Order product collections by stock status, instock products first.
 */
class iWC_Orderby_Stock_Status
{
 
	public function __construct()
	{
		// Check if WooCommerce is active
		if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {
			add_filter('posts_clauses', array($this, 'order_by_stock_status'), 2000);
		}
	}
 
	public function order_by_stock_status($posts_clauses)
	{
		global $wpdb;
		// only change query on WooCommerce loops
		if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag())) {
			$posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";
			$posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby'];
			$posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where'];
		}
		return $posts_clauses;
	}
}
 
new iWC_Orderby_Stock_Status;
 
?>

Дополнительные фишки для товаров «нет в наличии»

Как уже сказал выше, в процессе поиска нужных мне решений, я «перелопатил» достаточно много разного кода. Некоторые примеры могут пригодиться вам в работе.

Внимание! Пост достаточно старый, поэтому не все коды ниже работают. Сейчас есть новая статья как как скрыть товары не в наличии из шорткодов и похожих товаров — переходите по ссылке и смотрите актуальные примеры кода (на момент 2023 года).

Хак для похожих товаров

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

//Related products limit
function tm_related_products_limit() {
	global $product;
	$orderby = 'rand';
	$columns = 4;
	$related = $product->get_related( 7 );
	$args = array(
		'post_type' => 'product',
		'no_found_rows' => 1,
		'posts_per_page' => 3,
		'ignore_sticky_posts' => 1,
		'orderby' => $orderby,
		'post__in' => $related,
		'post__not_in' => array($product->id),
		'meta_key'             => '_stock_status',
		'meta_value'           => 'instock',
		'compare'              => '!='
	);
	return $args;
}
add_filter( 'woocommerce_related_products_args', 'tm_related_products_limit' );

Если правильно понял, здесь сначала считывается 7 позиций, потом отсекаются отсутствующие и из оставшихся случайным образом выбираются 3 для отображения.

Сортировка в шорткодах WooCommerce

В комментариях подсказали решение для еще одной задачи — если вам нужно отсортировать продукцию магазина, которая выводится через шорткоды (в частности product_category), попробуйте следующую конструкцию:

add_filter( 'woocommerce_shortcode_products_query', function( $args, $atts, $loop_name ){
    if( $loop_name == 'product_category'){
        $args['meta_key'] = '_stock_status';
        $args['orderby']  = array('meta_value' => 'ASC', 'menu_order' => 'ASC');
    }
    return $args;
}, 10, 3);

Здесь в фильтре задается вывод по заданному порядку (menu_order) и по наличию. Теоретически, можете попробовать поменять в коде определенные значения, на нужные вам, например: сам шорткод — product_category; ключ сортировки meta_key = stock_status и выводить результаты по убыванию/возрастанию orderby = DESC/ASC.

Добавление собственного варианта сортировки

В данном случае рассматриватеся рандомная сортировка товаров в WooCommerce. Однако можно развивать этот код, например, для создания отдельного списка всех товаров «нет в наличии», скрыв их из обычных сортировок (по дате, цене).

add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_woocommerce_get_catalog_ordering_args' );
 
function custom_woocommerce_get_catalog_ordering_args( $args ) {
  $orderby_value = isset( $_GET['orderby'] ) ? woocommerce_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
 
	if ( 'random_list' == $orderby_value ) {
		$args['orderby'] = 'rand';
		$args['order'] = '';
		$args['meta_key'] = '';
	}
 
	return $args;
}
 
add_filter( 'woocommerce_default_catalog_orderby_options', 'custom_woocommerce_catalog_orderby' );
add_filter( 'woocommerce_catalog_orderby', 'custom_woocommerce_catalog_orderby' );
 
function custom_woocommerce_catalog_orderby( $sortby ) {
	$sortby['random_list'] = 'Random';
	return $sortby;
}

Создание сортировки с двумя условиями

В сети нашел ветку обсуждения по поводу добавления дополнительного параметра запроса query — чтобы выборка работала и по дате, и по наличию. В конце страницы, вроде бы, вполне рабочий код.

/* Show latest products first on the category page */
add_action( 'pre_get_posts', 'mik_exclude_category' );
function mik_exclude_category( $query ) {
    if ( $query->is_main_query() ) {
 
    	$query->set( 'meta_key', '_stock_status' );
        $query->set( 'orderby', array('meta_value' => 'ASC', 'date' => 'DESC') );
 
    }
}

На практике он показывал кое-какие результаты, но только для одного вида сортировки. При этом остальные нужно было реализовывать дополнительно. Кстати, можете погуглить хук pre_get_posts — позволяет создавать весьма интересные вещи.

Вот, в принципе, и все, что удалось найти о WooCommerce сортировке по наличию товаров на складе. Надеюсь, коды вам пригодятся. Если есть что добавить по теме, пишите в комментариях.

рейтинг Оцените статью:
Ужасная статьяНичего интересногоТак себеНормальноХорошоКлассный постВ закладки!
(голосов - 5, средний балл: 7,00 из 7)
Загрузка...

категория Категории: WooCommerce;
теги Теги: , , , , , .

комментария 53 к статье “WooCommerce сортировка по наличию товаров («нет в наличии» в конце списка)”

  • Tod   28.11.2018

    Богдан, теоретически в коде указывается сортировка ASC, которую можно поменять на DESC, но что-то мне подсказывает, что проблема в другом. Возможно какая-то настройка или другой модуль задают определенную сортировку товаров. У меня лично в настройках установлена «по популярности (продажи)».

  • Богдан   29.11.2018

    Tod,спасибо за ответ.Я сразу же после написания предыдущего поста попробовал заменить ASC на DESC.Сработало.Извините за беспокойство и благодарю за код)

  • Антон   30.11.2018

    Статья очень помогла, спасибо!
    У меня была проблема — нужно было отсортировать товары в шорткодах по двум условиям — по заданному порядку (menu_order) и по наличию. Долго искал решение, и оказалось это делается так:

    add_filter( ‘woocommerce_shortcode_products_query’, function( $args, $atts, $loop_name ){
    if( $loop_name == ‘product_category’){
    $args[‘meta_key’] = ‘_stock_status’;
    $args[‘orderby’] = array(‘meta_value’ => ‘ASC’, ‘menu_order’ => ‘ASC’);
    }
    return $args;
    }, 10, 3);

    (В данном случае сортировка применяется только для шорткода product_category.)
    Вдруг кому-то пригодится.

  • Tod   30.11.2018

    Антон, спасибо за дополнение заметки! полезный хак.

  • Иван   19.01.2019

    Спасибо, очень полезный трюк с сортировкой.

  • Ирина   23.07.2019

    Здравствуйте. Где еще может прятаться функция functions.php? Так как у себя в админке я не могу найти

  • Tod   24.07.2019

    Ирина, это не функция, а отдельный файл шаблона, который находится на хостинге/FTP. В принципе, если зайти в раздел «Внешний вид» — «Редактор», выбрать текущий шаблон, то можно найти этот файл. Альтернативный подход — установить плагин Code Snippets, позволяющий вставлять найденные примеры кода без редактирования файла functions.php.

  • Виталий   07.11.2019

    Спасибо!Очень помогло!

  • Мира   06.02.2020

    Добрый день. А на данный момент эти сниппеты актуальные?

  • Tod   10.02.2020

    Мира, прям на данный момент не могу сказать, но месяц назад где-то ставил на сайт магазина, и все там работало.

  • Владимир   19.02.2020

    Спасибо! Все работало, но вот недавно перестало. Не понятно, почему? Вроде бы ничего не менял в коде.

  • Tod   19.02.2020

    Владимир, вомзожно, обновили Woocommerce плагин или сам Вордпресс? Тут только один вариант — загуглить не обновилось ли что-то в сниппетах с момента их последней публикации.

  • Владимир   21.02.2020

    Tod, я не устанавливал плагин Code Snippets, я просто вставил кусок кода с конец файла functions.php
    Ранее код работал, сейчас нет. Он сейчас так же висит в конце файла и не работает.
    Давайте я еще раз скопирую, вставлю и пересохраню файл.
    Святые угодники! Сработало! Ох уж эта уличная магия!

  • Tod   21.02.2020

    Владимир, отлично! Вероятно какой-то глюк был при сохранении/копировании файла… у самого бывали такие ситуациюю, когда все должно работать, но почему-то не хочет))

  • Valerii   27.07.2020

    Очень полезный пост. Иначе про колупался бы несколько часов, а так сразу рабочий ответ. Автору благодарность.

  • Эд   28.10.2020

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

  • Tod   31.10.2020

    Эд, возможно, код морально устарел, т.к. статье уже 4 года.

  • Дмитрий   29.12.2020

    Привет! Спасибо за статью У меня вариант сортировки через шоткоды, и второй вариант сработал замечательно, сразу и без изменений

  • Игорь   29.03.2021

    Здравствуйте помогите пожалуйста исправить! После добавления кода который делает нет в наличии в конце списка у меня пропадает блок в футоре с постами блога почему то как исправить это кто знает?

  • Tod   30.03.2021

    Игорь, скорее всего при вставке кода у вас получился либо лишний, либо отсутствующий тег открывающий <?php или закрывающий ?>

  • Олена   13.07.2021

    Величезне дякую)) З плагіном, працює!

  • Виталий   22.11.2021

    Крик о помощи. При установке кода сортировки с двумя условиями главная страница выдает 404. Как пофиксить?

  • Tod   23.11.2021

    Виталий, удалить добавленный код и вернуть все, как было раньше. Плюс можно почистить кэш и в Настройках админки в «Постоянных ссылках» заново сохранить все настройки.

Оставить комментарий


Блог Wordpress Inside поможет вам научиться работать в вордпресс, закрепить и расширить имеющиеся знания. Плагины и шаблоны, разные хаки и функции wp, оптимизация и безопасность системы – все это и намного больше вы сможете найти на страницах нашего проекта!

Если хотите быстро и оперативно получать последние новости и статьи, то рекомендуем подписаться на обновления блога:

Поиск:
Последние посты
Лучшее в категории

Облако тегов
Скажи свое мнение!

В чем основные плюсы Wordpress?

Посмотреть результаты

Загрузка ... Загрузка ...
Друзья проекта
Последние новости