Plugin de Shortcode de Produtos Visualizados Recentemente WooCommerce
Alguns dias atrás, a equipe WooThemes anunciou a versão 2 do muito popular plugin WooCommerce que permite que todos os sites WordPress vendam qualquer tipo de produto com muita facilidade. Mesmo que eu esteja mais acostumado a trabalhar com o incrível plugin Easy Digital Downloads , do talentosíssimo Pippin Williamson, eu queria ir um pouco mais fundo no WooCommerce e mostrar como você pode usar os recursos existentes para criar novas funções. E hoje eu gostaria de explicar como criar um shortcode que exibe os produtos visualizados recentemente.
Produtos vistos recentemente são um recurso incrivelmente poderoso simplesmente porque é, para mim, uma espécie de inteligência artificial muito básica. Ele permite que os usuários voltem facilmente aos produtos que já visualizaram em questão de segundos. E o fato de usar um shortcode para exibir produtos visualizados recentemente é ótimo porque você pode colocá-lo em qualquer lugar do seu site.
Normalmente quando crio um tutorial no WPexplorer explico passo a passo o método, mas como o tutorial de hoje é um pouco mais longo, prefiro explicar todo o processo e depois passar o código completo com comentários diretamente no código.
Fazendo isso dentro de um shortcode
Então, vamos criar um plugin que registrará um shortcode [woocommerce_recently_viewed_products per_page=”5″] . Por que criar um plugin? Porque é a maneira mais fácil de armazenar um recurso que você pode usar com qualquer tema. Se você decidir registrar um shortcode em um tema, o shortcode estará disponível somente se o tema estiver ativado. Com um plugin, não importa o tema que você esteja usando, o recurso ainda estará disponível. Outra coisa muito importante é que você nunca deve modificar os arquivos do WooCommerce.
Você gosta de biscoitos? Eu realmente quero!
Por padrão, o WooCommerce cria um cookie que armazena dados importantes sobre o que um visitante faz e vê na loja. E esse é exatamente o tipo de dados que precisamos para criar nosso plugin. Os dados mais importantes que precisamos são armazenados em cookies chamados $_COOKIE[‘woocommerce_recently_viewed’] . Basicamente, este cookie armazena o ID dos últimos produtos visualizados. Como o WooCommerce já está salvando esses IDs, nosso trabalho é finalmente criar a boa consulta usando o atributo de consulta “ post__in ” e garantir que os produtos que precisamos exibir ainda estejam em estoque. Para fazer isso, precisamos usar o método $woocommerce->query->stock_status_meta_query() no atributo de consulta “ meta_query ”.
O código completo do plugin
Como o código é bem simples, adicionei os comentários diretamente no código, e não fiz um tutorial passo a passo, mas se algo não estiver claro, escreva um comentário e terei o maior prazer em explicar cada um parte do código!
<?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_recentl