Normalement, lorsque je crée un tutoriel sur WPexplorer, j’explique pas à pas la méthode, mais comme le tut d’aujourd’hui est un peu plus long, je préfère expliquer l’ensemble du processus et ensuite vous fournir le code complet avec des commentaires directement dans le code.
Le faire dans un shortcode
Nous allons donc créer un plugin qui enregistrera un [woocommerce_recently_viewed_products per_page=”5″] petit code. Pourquoi créer un plugin? Parce que c’est le moyen le plus simple de stocker une fonctionnalité que vous pouvez utiliser avec n’importe quel thème. Si vous décidez d’enregistrer un shortcode dans un thème, le shortcode ne sera disponible que si le thème est activé. Avec un plugin, quel que soit le thème que vous utilisez, la fonctionnalité sera toujours disponible. Une autre chose très importante est que vous ne devriez jamais modifier les fichiers WooCommerce.
Aimez-vous les cookies? Je fais vraiment!
Par défaut, WooCommerce crée un cookie qui stocke des données importantes sur ce qu’un visiteur fait et voit sur la boutique. Et c’est exactement le type de données dont nous avons besoin pour créer notre plugin. Les données les plus importantes dont nous avons besoin sont stockées dans un cookie appelé $ _COOKIE[‘woocommerce_recently_viewed’]. Fondamentalement, ce cookie stocke l’ID des derniers produits consultés. Comme WooCommerce enregistre déjà ces identifiants, notre travail consiste enfin à créer la bonne requête en utilisant le “post__in”Et pour nous assurer que les produits que nous devons afficher sont toujours en stock. Pour ce faire, nous devons utiliser le $ woocommerce-> requête-> stock_status_meta_query () méthode dans le “meta_query”Attribut de requête.
Le code complet du plugin
Comme le code est assez simple, j’ai ajouté les commentaires directement dans le code, et je n’ai pas fait de tutoriel étape par étape, mais si quelque chose n’est pas clair, écrivez un commentaire et je serai plus qu’heureux de vous expliquer chacun une partie du code!
<?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");