Ticker

6/recent/ticker-posts

Ad Code

Responsive Advertisement

Cómo mostrar los productos previamente comprados en WooCommerce

Nunca entenderé por qué en WooCommerce, en la página de cuenta, no se muestran en ninguna parte los productos comprados por el cliente, pudiendo únicamente ver los pedidos, el recibo, incluso la factura, pero no la lista de productos para, de este modo, facilitar que los vuelvan a comprar.

Ya vimos cómo ofrecer al cliente un modo de repetir un pedido o volver a hacer una compra previa, lo que ya es un avance, pero hasta ahora no había caído en que no hay una manera por defecto de que WooCommerce te muestre una lista de los productos comprados por los clientes, como tienes, por ejemplo, en Amazon.

detalles pedido amazon

La única manera de volver a pedir productos de un pedido anterior es ver el pedido e ir haciendo clic en cada uno de los productos y, desde su página, añadirlos al carrito, pero no es lo deseable, que sería algo más inmediato, algo tan simple como un listado de los productos que ha comprado, y que el cliente pueda añadirlos rápidamente al carrito.

detalle de pedido woocommerce

Queremos algo mejor ¿no?

Cómo mostrar los productos comprados por el cliente como nueva columna en la lista de pedidos

Una mejora considerable sería que los productos de cada pedido se mostrasen directamente en una nueva columna del listado de pedidos ¿no?

Pues solo tienes que añadir este código a tu plugin de personalizaciones o archivo functions.php:

/* Columna de productos en la lista de pedidos */
function ayudawp_columna_productos_lista_pedidos_cliente( $columns ) {
$new_columns = array();
foreach ( $columns as $key => $name ) {
$new_columns[ $key ] = $name;
if ( 'order-total' === $key ) {
$new_columns['order-products'] = __( 'Productos', 'textdomain' );
}
}
return $new_columns;
}
add_filter( 'woocommerce_my_account_my_orders_columns', 'ayudawp_columna_productos_lista_pedidos_cliente' );

function ayudawp_datos_productos_columna_pedido( $order ) {
foreach( $order->get_items() as $item_id => $item ) {
$product = apply_filters( 'woocommerce_order_item_product', $order->get_product_from_item( $item ), $item );
$is_visible = $product && $product->is_visible();
$product_permalink = apply_filters( 'woocommerce_order_item_permalink', $is_visible ? $product->get_permalink( $item ) : '', $item, $order );
echo apply_filters( 'woocommerce_order_item_name', $product_permalink ? sprintf( '<p><a href="%s">%s</a>', $product_permalink, $item['name'] ) : $item['name'], $item, $is_visible );
echo apply_filters( 'woocommerce_order_item_quantity_html', ' <strong class="product-quantity">' . sprintf( '&times; %s', $item['qty'] ) . '</strong></p>', $item );
}
}
add_action( 'woocommerce_my_account_my_orders_column_order-products', 'ayudawp_datos_productos_columna_pedido' );

¡Y este es el resultado! Ahí tienes el (poco útil) antes y el (mucho mejor) después…

lista pedidos cuenta woocommerce columna productos pedido woocommerce

Pero queremos más ¿verdad?

Cómo mostrar los productos comprados por el cliente en la página de su cuenta

Para mostrar los productos comprados previamente por los clientes vamos a aprovechar todo lo aprendido hasta ahora, con especial detalle en la guía de cómo personalizar la página de mi cuenta de WooCommerce, donde aprendimos entre otras cosas a crear nuevas pestañas con contenido, algo que nos servirá en esta ocasión, porque vamos a hacer lo siguiente:

  1. Crear una nueva pestaña en la página de «Mi cuenta» en la que mostraremos los productos ya comprados.
  2. Crearemos una variable (endpoint) nuevo para esa pestaña, porque sino simplemente no hace nada, no funciona.
  3. En esta nueva variable haremos una consulta en la base de datos para mostrar los productos que ya haya comprado el cliente actual, con un par de detalles:
    • Si un producto existe en varios pedidos no se repite, porque no hace falta.
    • Ordenamos los productos por fecha descendente, para que primero se muestren los comprados más recientemente.

Pues bien, el código que debemos añadir a nuestra web es este, o una modificación del mismo a tu gusto:

/* Mostrar productos ya comprados por el usuario */

// primero hay que añadir un nuevo enlace a los de la página de mi cuenta
add_filter( 'woocommerce_account_menu_items', 'ayudawp_enlace_productos_comprados', 40 );
function ayudawp_enlace_productos_comprados( $menu_links ){

// usamos array_slice() para que el enlace sea el tercero
return array_slice( $menu_links, 0, 2, true )
+ array( 'purchased-products' => 'Productos comprados' )
+ array_slice( $menu_links, 2, NULL, true );
}

// registramos la regla de rewrite . OJO, tras agregar el codigo recuerda guardar los ajustes de enlaces permanentes o no funciona el codigo
add_action( 'init', 'ayudawp_variable_productos_comprados' );
function ayudawp_variable_productos_comprados() {
add_rewrite_endpoint( 'purchased-products', EP_PAGES );
}

// llenamos la nueva pagina con el contenido
add_action( 'woocommerce_account_purchased-products_endpoint', 'ayudawp_mostrar_productos_comprados' );
function ayudawp_mostrar_productos_comprados() {

global $wpdb;

// esta query SQL permite mostrar todos los productos comprados por el usuario actual
// en este ejemplo ordenamos los productos por fecha pero puedes ordenarlos como quieras
$purchased_products_ids = $wpdb->get_col( 
$wpdb->prepare(
"
SELECT itemmeta.meta_value
FROM " . $wpdb->prefix . "woocommerce_order_itemmeta itemmeta
INNER JOIN " . $wpdb->prefix . "woocommerce_order_items items
ON itemmeta.order_item_id = items.order_item_id
INNER JOIN $wpdb->posts orders
ON orders.ID = items.order_id
INNER JOIN $wpdb->postmeta ordermeta
ON orders.ID = ordermeta.post_id
WHERE itemmeta.meta_key = '_product_id'
AND ordermeta.meta_key = '_customer_user'
AND ordermeta.meta_value = %s
ORDER BY orders.post_date DESC
",
get_current_user_id()
)
);

// si algun pedido tiene el mismo producto evitamos que se muestren repetidos
$purchased_products_ids = array_unique( $purchased_products_ids );

// si el cliente ha comprado algo
if( ! empty( $purchased_products_ids ) ) {

// hacemos la WP_Query
$purchased_products = new WP_Query( array(
'post_type' => 'product',
'post_status' => 'publish',
'post__in' => $purchased_products_ids,
'orderby' => 'post__in',
'posts_per_page' => -1,
) );

woocommerce_product_loop_start();
while ( $purchased_products->have_posts() ) : $purchased_products->the_post();
wc_get_template_part( 'content', 'product' );
endwhile;
woocommerce_product_loop_end();
woocommerce_reset_loop();
wp_reset_postdata();
} else {
echo 'Todavía no has comprado nada.';
}
}

Nota importante: Después de haber guardado el código anterior en tu archivo functions.php, plugin o como sea, es fundamental ir a los ajustes de enlaces permanentes de tu WordPress y guardar cambios (sin modificar nada) para que se registre la nueva variable (endpoint).

Cuando hayas pegado el código de arriba, guardado los cambios y los ajustes de enlaces permanentes, tendrás una nueva pestaña en la página de «Mi cuenta» de tu tienda online WooCommerce que, ahora sí, mostrará los productos ya comprados por el cliente actual, facilitándole realizar nuevas compras de productos que ya adquirió en otra ocasión.

lista productos ya comprados cliente woocommerce

Cómo mostrar los productos comprados por el cliente en cualquier parte

Ahora vamos a imaginar que, o no queremos mostrar los productos comprados en la página de cuenta del cliente, o que vale, también, pero que además queremos mostrar esa lista de productos comprados en otras partes, en entradas de blog, en páginas, donde sea.

¡Pues aquí están los shortcodes al rescate!

La cosa es tan sencilla como crear una función en que asignemos a un shortcode de nuestra elección la capacidad de mostrar los productos comprados por el usuario actual, así:

/* Mostrar los productos comprados por el usuario actual con sl shortcode [mis_productos_comprados].*/

add_shortcode( 'mis_productos_comprados', 'products_bought_by_curr_user' );
function products_bought_by_curr_user() {
$current_user = wp_get_current_user();
if ( 0 == $current_user->ID ) return;
$customer_orders = get_posts( array(
'numberposts' => -1,
'meta_key' => '_customer_user',
'meta_value' => $current_user->ID,
'post_type' => wc_get_order_types(),
'post_status' => array_keys( wc_get_is_paid_statuses() ),
) );
if ( ! $customer_orders ) return;
$product_ids = array();
foreach ( $customer_orders as $customer_order ) {
$order = wc_get_order( $customer_order->ID );
$items = $order->get_items();
foreach ( $items as $item ) {
$product_id = $item->get_product_id();
$product_ids[] = $product_id;
}
}
$product_ids = array_unique( $product_ids );
$product_ids_str = implode( ",", $product_ids );
return do_shortcode("[products ids='$product_ids_str']");
}

Añade el código anterior usando tu método favorito y, a continuación, añade el shortcode [mis_productos_comprados] donde quieras, incluso en un widget.

productos comprados woocommerce shortcode productos comprados woocommerce shortcode widget

¿No hay plugins para hacer lo mismo?

Pues haberlos los hay, pero todos los que he encontrado son de pago, y como ni los desarrolladores me los han facilitado para probarlos, ni me sobra el dinero como para comprar varios plugins que hacen lo mismo, pues lo siento, pero esta vez no te puedo ofrecer opciones.

Si sabes de algún plugin gratuito que sirva para esto cuéntanoslo en los comentarios y así aprendemos entre todos 😉

El artículo Cómo mostrar los productos previamente comprados en WooCommerce lo publicó Fernando Tellado previamente en Ayuda WordPress. Lo que ves aquí es una copia de dicho contenido :/

Enregistrer un commentaire

0 Commentaires