Шорткод недавно просмотренных товаров WooCommerce
Несколько дней назад команда WooThemes анонсировала вторую версию очень популярного плагина WooCommerce, который позволяет каждому веб-сайту WordPress очень легко продавать любые виды продуктов. Даже если я больше привык работать с потрясающим плагином Easy Digital Downloads от очень талантливого Пиппина Уильямсона, мне хотелось немного глубже изучить WooCommerce и показать вам, как можно использовать существующие функции для создания новых функций. И сегодня я хотел бы объяснить вам, как создать шорткод, отображающий недавно просмотренные товары. Недавно просмотренные товары — невероятно мощная функция просто потому, что для меня это своего рода очень простой искусственный интеллект. Это позволяет пользователям легко вернуться к уже просмотренным продуктам всего за несколько секунд. И тот факт, что вы можете использовать шорткод для отображения недавно просмотренных продуктов, хорош, потому что вы можете разместить его повсюду на своем веб-сайте.
Обычно, когда я создаю руководство по WPexplorer, я объясняю метод шаг за шагом, но, поскольку сегодняшнее занятие немного длиннее, я предпочитаю объяснить весь процесс, а затем предоставить вам полный код с комментариями непосредственно в коде.
Делаем это в шорткоде
Итак, мы собираемся создать плагин, который будет регистрировать короткий код [woocommerce_recently_viewed_products per_page="5″]. Зачем создавать плагин? Потому что это самый простой способ сохранить функцию, которую можно использовать с любой темой. Если вы решите зарегистрировать шорткод в теме, он будет доступен только в том случае, если тема активирована. С плагином, независимо от того, какую тему вы используете, эта функция все равно будет доступна. Еще одна очень важная вещь: никогда не изменяйте файлы WooCommerce.
Вам нравится печенье? Я действительно так делаю!
По умолчанию WooCommerce создает файл cookie, в котором хранятся важные данные о том, что посетитель делает и видит в магазине. И это именно тот тип данных, который нам нужен для создания нашего плагина. Самые важные данные, которые нам нужны, хранятся в файлах cookie под названием $_COOKIE['woocommerce_recently_viewed']. По сути, этот файл cookie хранит идентификатор последних просмотренных продуктов. Поскольку WooCommerce уже сохраняет эти идентификаторы, наша задача, наконец, состоит в том, чтобы создать правильный запрос с использованием атрибута запроса «post__in» и убедиться, что продукты, которые нам нужно отобразить, все еще есть на складе. Для этого нам нужно использовать метод $woocommerce->query->stock_status_meta_query() в атрибуте запроса «meta_query».
Полный код плагина
Поскольку код довольно прост, я добавил комментарии непосредственно в код и не делал пошагового руководства, но если что-то неясно, напишите комментарий, и я буду более чем рад объяснить вам каждый из них. часть кода!
<?php
/*
Plugin Name: WooCommerce - Recently Viewed Products
Plugin URL: http://remicorson.com/
Description: Adds a "recently viewed products" shortcode
Version: 1.0
Author: Remi Corson
Author URI: http://remicorson.com
Contributors: corsonr
Text Domain: rc_wc_rvp
Domain Path: languages
*/
/**
* Register the [woocommerce_recently_viewed_products per_page="5"] shortcode
*
* This shortcode displays recently viewed products using WooCommerce default cookie
* It only has one parameter "per_page" to choose number of items to show
*
* @access public
* @since 1.0
* @return $content
*/
function rc_woocommerce_recently_viewed_products( $atts, $content = null ) {
// Get shortcode parameters
extract(shortcode_atts(array(
"per_page" => '5'
), $atts));
// Get WooCommerce Global
global $woocommerce;
// Get recently viewed product cookies data
$viewed_products = ! empty( $_COOKIE['woocommerce_recently_viewed'] ) ? (array) explode( '|', $_COOKIE['woocommerce_recently_viewed'] ) : array();
$viewed_products = array_filter( array_map( 'absint', $viewed_products ) );
// If no data, quit
if ( empty( $viewed_products ) )
return __( 'You have not viewed any product yet!', 'rc_wc_rvp' );
// Create the object
ob_start();
// Get products per page
if( !isset( $per_page ) ? $number = 5 : $number = $per_page )
// Create query arguments array
$query_args = array(
'posts_per_page' => $number,
'no_found_rows' => 1,
'post_status' => 'publish',
'post_type' => 'product',
'post__in' => $viewed_products,
'orderby' => 'rand'
);
// Add meta_query to query args
$query_args['meta_query'] = array();
// Check products stock status
$query_args['meta_query'][] = $woocommerce->query->stock_status_meta_query();
// Create a new query
$r = new WP_Query($query_args);
// If query return results
if ( $r->have_posts() ) {
$content = '<ul class="rc_wc_rvp_product_list_widget">';
// Start the loop
while ( $r->have_posts()) {
$r->the_post();
global $product;
$content .= '<li>
<a href="' . get_permalink() . '">
' . ( has_post_thumbnail() ? get_the_post_thumbnail( $r->post->ID, 'shop_thumbnail' ) : woocommerce_placeholder_img( 'shop_thumbnail' ) ) . ' ' . get_the_title() . '
</a> ' . $product->get_price_html() . '
</li>';
}
$content .= '</ul>';
}
// Get clean object
$content .= ob_get_clean();
// Return whole content
return $content;
}
// Register the shortcode
add_shortcode("woocommerce_recently_viewed_products", "rc_woocommerce_recently_viewed_products");
