Ricerca nel sito web

Shortcode dei prodotti visualizzati di recente in WooCommerce


Pochi giorni fa, il team di WooThemes ha annunciato la versione 2 del famosissimo plugin WooCommerce che consente a ogni singolo sito WordPress di vendere qualsiasi tipo di prodotto molto facilmente. Anche se sono più abituato a lavorare con il fantastico plugin Easy Digital Downloads, del talentuoso Pippin Williamson, volevo andare un po' più a fondo in WooCommerce e mostrarti come puoi utilizzare le funzionalità esistenti per creare nuove funzioni. E oggi vorrei spiegarti come creare uno shortcode che mostri i prodotti visualizzati di recente. I prodotti visualizzati di recente sono una funzionalità incredibilmente potente semplicemente perché, per me, sono una sorta di intelligenza artificiale di base. Consente agli utenti di tornare facilmente ai prodotti che hanno già visualizzato in pochi secondi. E il fatto di utilizzare uno shortcode per visualizzare i prodotti visualizzati di recente è fantastico perché puoi posizionarlo ovunque nel tuo sito web.

Normalmente quando creo un tutorial su WPexplorer spiego passo dopo passo il metodo, ma poiché il tutorial di oggi è un po' più lungo, preferisco spiegare l'intero processo e poi fornirti il codice completo con i commenti direttamente nel codice.

Farlo all'interno di uno shortcode

Quindi, creeremo un plugin che registrerà uno shortcode [woocommerce_recently_viewed_products per_page="5″]. Perché creare un plugin? Perché è il modo più semplice per memorizzare una funzionalità che puoi utilizzare con qualsiasi tema. Se decidi di registrare uno shortcode in un tema, lo shortcode sarà disponibile solo se il tema è attivato. Con un plugin, indipendentemente dal tema che stai utilizzando, la funzionalità sarà comunque disponibile. Un'altra cosa molto importante è che non dovresti mai e poi mai modificare i file WooCommerce.

Ti piacciono i biscotti? Davvero!

Per impostazione predefinita WooCommerce crea un cookie che memorizza dati importanti su ciò che un visitatore fa e vede nel negozio. E questo è esattamente il tipo di dati di cui abbiamo bisogno per creare il nostro plugin. I dati più importanti di cui abbiamo bisogno vengono archiviati in un cookie chiamato $_COOKIE['woocommerce_recently_viewed']. Fondamentalmente questo cookie memorizza l'ID degli ultimi prodotti visualizzati. Dato che WooCommerce sta già salvando questi ID, il nostro compito è infine creare la query corretta utilizzando l'attributo di query "post__in" e garantire che i prodotti che dobbiamo visualizzare siano ancora disponibili. Per fare ciò, dobbiamo utilizzare il metodo $woocommerce->query->stock_status_meta_query() nell'attributo di query "meta_query".

Il codice completo del plugin

Dato che il codice è piuttosto semplice, ho aggiunto i commenti direttamente nel codice e non ho fatto un tutorial passo passo, ma se qualcosa non è chiaro scrivi un commento e sarò più che felice di spiegarti ciascuno parte del codice!

<?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");