Oferta SiteGround Black Friday

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…

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.

¿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 😉

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en los emoticonos para valorarlo!

Promedio de puntuación 5 / 5. Total de votos: 6

Hasta ahora ¡no hay votos!. Sé el primero en valorar este contenido.

Ya que has encontrado útil este contenido...

¡Sígueme en las redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Ayúdame a mejorar este contenido!

Por favor, dime, ¿cómo puedo mejorarlo?

¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!

Sobre el autor

2 comentarios en “Cómo mostrar los productos previamente comprados en WooCommerce”

  1. Hola:
    Gracias por toda la info. que aportas. He probado a implementar el código y aparece la pestaña y la lista de productos comprados; pero aparecen solo 2 columnas infinitas hacia abajo, por que nuestros clientes hacen pedidos grandes.
    Me gustaría que apareciera como en la imagen, en columnas de 4 o incluso 6 productos, con las imágenes más pequeñas; he intentado modificarlo en personalizar pero claro se modifica en toda la web.

    He modificado el código así:
    // 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,
    ‘columns’ => ‘4’,
    ) );

    Pero no hace nada, se sigue viendo en 2 columnas infinitas.

    Si nos pudieras ayudar con eso.

    Gracias

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información base sobre privacidad:
- Responsable: Fernando Tellado ([email protected])
- Fin del tratamiento: Moderación de comentarios para evitar spam
- Legitimación: Tu consentimiento
- Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal
- Derechos: Acceso, rectificación, portabilidad, olvido

 

Scroll al inicio