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.
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.
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( '× %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:
- Crear una nueva pestaña en la página de «Mi cuenta» en la que mostraremos los productos ya comprados.
- Crearemos una variable (
endpoint
) nuevo para esa pestaña, porque sino simplemente no hace nada, no funciona. - 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.
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 😉
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 :/
0 Commentaires