Авг
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 сортировка по наличию товаров («нет в наличии» в конце списка)”

  • Газиз Исмаил   24.08.2016

    Привет,

    Спасибо за полезную статью по плагину WooCommerce. Очень мало материалов в интернете по этой теме.

    Как думаете, если ли на данный момент более или менее серьезные альтернативы WooCommerce?

    Еще раз спасибо, обязательно сделаю ретвит статьи.

  • Tod   24.08.2016

    Газиз, таких же функциональных и бесплатных альтернатив я лично не встречал.

  • Газиз Исмаил   24.08.2016

    Tod, понял, спасибо.

  • Александр   04.09.2016

    Газиз, при наличии определенного опыта, даже на WooCommerce можно сделать отличный интернет-магазин.

  • Александр   30.10.2016

    Очень помогло, долго искал решение этой проблемы, дай Вам божечка здоровья!

  • Tod   31.10.2016

    Александр, понимаю, сам искал решение не один день)) Сначала пытался решить задачу самостоятельно за счет совмещения разных методов вывода товаров, но в итоге получалось немного не то.

  • Алексей   13.11.2016

    Подскажи куда именно вставлять первый код? я вставил его в functions.php своей темы и сайт лег!
    в Woocomerce файлов functions.php очень много в разных местах. Куда именно данный код надо вставить, подскажите пожалуйста

  • Tod   14.11.2016

    Алексей, добавлял код в базовый файл функций шаблона (не Woocomerce). Недавно обновил статью кстати как правильно вставлять код в functions.php — найдете там парочку советов/примеров.

  • Алекс   25.01.2017

    Добавил код, где товары «нет в наличии» будут располагаться в конце списка. Работает! Супер. Полезный материал. Автору Респект и Уважуха!

  • Денис   27.03.2017

    А как в этот код добавить учёт атрибутов? Если сортировать по атрибутам, то товары не уходят в конец списка((

  • Tod   27.03.2017

    Денис, по атрибутам, увы, не подскажу. В моей практике сортировки с ними не было.

  • Даша   17.09.2017

    Большое спасибо за помощь! Уже не надеялась найти рабочий способ :)

  • Владимир   28.09.2017

    Здравствуйте.
    После добавления первого кода, на странице с товарами перестало показывать ленту новостей из записей (((
    Как только его убрать — появляется

  • Tod   29.09.2017

    Владимир, к сожалению, не знаю почему так случается. Вообще код тестировался на WooCommerce 2.6.x, а после апдейта на 3тью версию отказывался корректно работать. Возможно на сайте-источнике появился или в будущем будет апдейт.

  • Владимир   29.09.2017

    Спасибо за оперативный и полный ответ. Будем искать/думать )

  • Дмитрий   06.12.2017

    Здравствуйте. Помогите разобраться. Я урезал woocommerce под витрину, т.е. убрал корзину и вместо кнопки «в корзину» теперь кнопка «смотреть». Для того, чтобы добиться этого, при заполнении карточки товара я ставлю «нет в наличии», а для отображения на карточке товара позиции «в наличие» я просто в теме переводчиком заменил «out of stock» на «в наличие», НО в сниппете отображается «нет в наличие». Что делать? divan82.ru

  • Tod   06.12.2017

    Дмитрий, ваш метод не выглядит «правильным решением», в том плане, что по логике магазина это не совсем правильно, и вполне вероятно, что дальше будут вылезать глюки. Я погуглил что-то типа woocommerce without cart, и нашел парочку вариантов как можно все организовать — есть через коды или с плагином YITH WooCommerce Catalog Mode. Я бы на вашем месте попробовал именно их.

  • Александр   23.08.2018

    Плагин WooCommerce and 1C:Enterprise/1С:Предприятие Data Exchange
    Приветствую, нужна помощь, при синхронизации через данный плагин, товары вариативные падают в кабинет как

    В невыполненном заказе,

    после чего предзаказы стоят — не разрешать, потом ставлю — разрешать, потом ставлю обратно —- не разрешать и значение становится нет в наличии, хотя в 1С они в наличии,

    И еще те товары которых нет в наличии заливаются как —-в наличии

    1С версия Управление торговлей для Украины 3.1

    Подскажите , что можно сделать????

  • Tod   24.08.2018

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

  • Александр   29.09.2018

    Всем привет! Вопрос следующий: может кто сталкивался уже с плагином который будет сортировать позиции товара в магазине WooCommerce? Те что сотрируют по остатку вивед. Интересует плагин который отсортирует по значению instock / outofstock. Так как не очень удобно когда товары в наличии и нету в наличии смешаны в одном списке. В кодах и редактировании не силен.. Ищу плагин, даже если он платный ( за разумную цену ), тоже устроит. Помогите, кто что знает!

  • Tod   29.09.2018

    Александр, если вы имеете ввиду сортировку, когда товары «нет в наличии» (outofstock) отображаются в конце всего списка каталога, то первый код в статье как раз эту фишку и реализует. Достаточно добавить хак в конец файла functions.php активного шаблона сайта.

  • Руслан   31.10.2018

    Подскажите, как такое же сделать для страниц с товарами определенного бренда, если стоит плагин Perfect WooCommerce Brands? На остальных страницах все работает без вопросов.

  • Tod   31.10.2018

    Руслан, в теории нужно править SQL запрос posts_clauses[], добавляя туда переменные/данные из таблицы модуля. Без навыков программирования и разбора плагина, к сожалению, не обойтись. Точный код подсказать не смогу.

  • Руслан   01.11.2018

    Запрос в самом плагине?
    Навыки есть. Будет время — поковыряюсь…

  • Tod   01.11.2018

    Руслан, запрос в хаке, который в данной статье — там есть функция, которая и формирует сортировку — order_by_stock_status. Вот ее, как я понимаю, нужно будет подправить. Если присмотреться там используются SQL параметры — join, where, orderby.
    Хотя.. если список постов выводит сам плагин. То возможно придется править именно его. Я если честно с ним не работал. Может придется сделать аналогичную функцию к той, что указана в статье и в ней подправить вывод данных из таблицы базы данных, используемой данным модулем.

  • Руслан   01.11.2018

    Нужно придумать что то универсальное, так как вывод возможен и с других плагинов, например Layer Slayder и аналогичных

  • Татьяна   12.11.2018

    Спасибо, классное решение! Работает!

  • Victor   17.11.2018

    Вы не посдкажите как изменить текст «нет в наличии» на свой, например «ожидается поставка»
    и как сделать что бы при статусе товара нет в наличии не пропадала возможность добавления в корзину?
    Спасибо

  • Tod   19.11.2018

    Victor, по изменению текста было тут либо, если не сработает, всегда есть фишка с переводом через gettext. По второй задаче не знаю — нужно искать плагин, т.к. это слегка противоречит логике Woocommerce — смотрите что-то по модулям предзаказов (Pre-Order).

  • Богдан   28.11.2018

    Tod,вставил код ,указанный вначале статьи-получилась сортировка наоборот-сначала «нет в наличии» потом » в наличии».Тема oceanwp.

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


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

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

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

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

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

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

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