Авг
24
8

WooCommerce сортировка товаров «нет в наличии»

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

Но сначала немного теории. Во-первых, в админке для каждого товара под описанием есть блок настроек с разделом «Запасы». Там вы можете указывать статус товара «нет в наличии», если он у вас закончился.

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

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

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

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

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

Да, в настройках 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;
 
?>

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

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

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

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

<?php
 
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 — позволяет создавать весьма интересные вещи.

«Нет в наличии» и похожие товары

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

//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 сортировке товаров с учетом наличия их на складе. Надеюсь, коды вам пригодятся. Если есть что добавить по теме, пишите в комментариях.

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

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

комментариев 8 к статье “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 — найдете там парочку советов/примеров.

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


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

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

Последние посты
Полезные заметки
Лучшее в категории
Облако тегов
Скажи свое мнение!

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

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

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