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

    Este snippet crea una nueva pestaña en Mi Cuenta (junto con un nuevo endpoint), y muestra los productos comprados en pedidos anteriores. Tras añadirlo, guarda tus enlaces permantentes para activar el endpoint.

    /* 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.';
        }
    }

    Herramientas relacionadas

    • WooCommerce

      El plugin para crear tiendas online por excelencia. Tanto de productos físicos como digitales. Es la base para prácticamente cualquier proyecto web que acepte pagos online.