Il y a quelques jours, l’équipe WooThemes annoncé version 2 du très populaire plugin WooCommerce qui permet à chaque WordPress site web pour vendre tout type de produits très facilement. Même si je suis plus habitué à travailler avec le génial plugin Easy Digital Downloads, par le très talentueux Pippin Williamson, je voulais approfondir un peu WooCommerce et vous montrer comment utiliser les fonctionnalités existantes pour créer de nouvelles fonctions. Et aujourd’hui, j’aimerais vous expliquer comment créer un shortcode qui affiche les produits récemment consultés. Les produits récemment consultés sont une fonctionnalité incroyablement puissante simplement parce qu’il s’agit, pour moi, d’une sorte d’intelligence artificielle très basique. Il permet aux utilisateurs de revenir facilement aux produits qu’ils ont déjà consultés en quelques secondes seulement. Et le fait d’utiliser un shortcode pour afficher les produits récemment consultés est génial car vous pouvez le placer partout sur votre site Web.
Normalement quand 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 tout le processus puis vous fournir le code complet avec des commentaires directement dans le code.
Le faire dans un shortcode
Donc, nous allons 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” attribut de requête et pour nous assurer que les produits que nous devons afficher sont toujours en stock. Pour ce faire, nous devons utiliser le $woocommerce->query->stock_status_meta_query() méthode dans le « méta_requête” 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, veuillez écrire un commentaire et je serai plus qu’heureux de vous expliquer chacun 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");