В этом уроке хочу показать вам, как создать шорткод для вывода недавно просмотренных пользователем товаров. Он у нас будет работать на основе стандартного шорткода WooCommerce, [products]
.
Прежде, чем я покажу вам готовый код шорткода, хочу порекомендовать свой видеокурс по WooCommerce, в котором мы создаём тему для интернет-магазина с нуля на основе только готовой HTML-вёрстки, вот ссылка.
Вообще в WooCommerce существуют свои собственные куки, которые хранят ID недавно просмотренных товаров $_COOKIE[ 'woocommerce_recently_viewed' ]
в виде строки, разделённых палкой |
, однако, они будут пустыми, если вы в то же время не используете виджет «Недавно просмотренные товары».
Поэтому нам придётся установить собственные.
Я решил использовать $_COOKIE[ 'woocommerce_recently_viewed_2' ]
, но опять напоминаю, что если вы используете виджет, то этот код вам и вовсе не понадобится.
add_action( 'template_redirect', 'truemisha_recently_viewed_product_cookie', 20 ); function truemisha_recently_viewed_product_cookie() { // если находимся не на странице товара, ничего не делаем if ( ! is_product() ) { return; } if ( empty( $_COOKIE[ 'woocommerce_recently_viewed_2' ] ) ) { $viewed_products = array(); } else { $viewed_products = (array) explode( '|', $_COOKIE[ 'woocommerce_recently_viewed_2' ] ); } // добавляем в массив текущий товар if ( ! in_array( get_the_ID(), $viewed_products ) ) { $viewed_products[] = get_the_ID(); } // нет смысла хранить там бесконечное количество товаров if ( sizeof( $viewed_products ) > 15 ) { array_shift( $viewed_products ); // выкидываем первый элемент } // устанавливаем в куки wc_setcookie( 'woocommerce_recently_viewed_2', join( '|', $viewed_products ) ); }
function_exists( 'is_product' )
, чтобы избежать ошибок 500, когда вдруг будет отключен плагин WooCommerce.|
, вообще вы можете выбрать любой другой символ, но сам WooCommerce разделяет их так и я решил сделать то же самое.functions.php
вашей текущей темы, либо создайте для него отдельный плагин.Я решил создать шорткод [recently_viewed_products]
, но вы можете назвать его как угодно по-другому. Кроме того, у меня есть отдельный подробный урок про шорткоды и ещё один про шорткоды WooCommerce.
add_shortcode( 'recently_viewed_products', 'truemisha_recently_viewed_products' ); function truemisha_recently_viewed_products() { if( empty( $_COOKIE[ 'woocommerce_recently_viewed_2' ] ) ) { $viewed_products = array(); } else { $viewed_products = (array) explode( '|', $_COOKIE[ 'woocommerce_recently_viewed_2' ] ); } if ( empty( $viewed_products ) ) { return; } // надо ведь сначала отображать последние просмотренные $viewed_products = array_reverse( array_map( 'absint', $viewed_products ) ); $title = '<h3>Вы уже смотрели</h3>'; $product_ids = join( ",", $viewed_products ); return $title . do_shortcode( "[products ids='$product_ids']" ); }
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Синтаксическая ошибка в шорткоде 8 строка, отсутствует точка с запятой.
Спасибо, исправил!
Шаг 2 на 6-й строке: объясни мне что происходит? и если отработала 6-я строка - зачем 12-я строка и ниже?
Чет не очень обрабатывать пустой массив
Согласен полностью! Спасибо за внимательность – поменял две строчки местами.
почему бы просто на 6-й строке не завершить работу?
Можно и завершить 🤷♂️ Но это уже мелочи
Можно и так переписать:
В любом случае спасибо большое за комментарий, я правда это ценю, я пока ещё не решился открыть комменты ко всем абсолютно постам, но открыл ровно на год назад. Так что всегда вэлкам.
Спасибо.
Жаль ответы на комментарии я не получаю на почту. Случайно вспомнить и зайти "вдруг ответили" - это случай один из ста.
Подробно все написано, спасибо!
Но как сделать так, чтобы выводить не продукты, а сами категории?
На просторах интернета не нашел этой информации, хотя она очень нужна. Например посетитель посмотреть категорию "Кроссовки" - ему показывать эту категорию.
Пробовал из предложенного варианта добавить вместо product - product_category, но толку нет. Не работает.
Пожалуйста!
Так, ну тут не всё так быстро, давайте попробуем разобрать по шагам.
В первом шаге мы с вами должны установить куки, что нам нужно изменить в коде, чтобы когда посетитель просмотрел категорию, поставить ID этой категории в куки?
Мы во-первых должны поменять это условие:
По сути просто заменили условный тег is_product() на is_product_category().
Дальше нам нужно заменить функцию get_the_ID() на get_queried_object_id().
Переходим ко второму шагу!
Тут легче – всего лишь меняем шорткод на [product_categories]
Можно ли как то указать, к-во товаров, которые будут показываться на странице?
Например тут
Имеется введу, к-во товаров в ряду. Так как я понял, значение берется из общего каталога.
Для примера, на странице товара есть блок "возможно вам понравятся" и там 4 товара в ряд.
А "просмотренные" - 3 товара в ряд (это чутка ломает вид). Можно как то указать откуда брать значение нужное?
А, ну эти значения в кастомайзере есть, на вкладке WooCommerce.
Что такое "кастомайзер"?
Это вот оно.
Как можно сделать чтобы отображало последний просмотренный товар первым в списке на данный момент, выводит товары хаотично. Спасибо
Как в данном случае вывести свою верстку товаров?
Чтобы можно было либо каруселью вывести на всех страницах и в тоже время сделать отдельную страницу с просмотренными товарами?
Прочекайте этот урок, я там вроде как раз об этом упоминал.
Не могу прочекать, может Вы б могли подсказать или это слишком сложно в данном примере сделать?