php - tag - Lista de Woocommerce Todos los productos pedidos previamente
tags wordpress codex (2)
Su código funciona (WP 4.8, WooCommerce 3.1.0, Insert PHP PHP 1.3).
Quiero aclarar un momento:
Si su cliente compra un producto más de una vez , de todos modos tiene un producto en la lista.
Gran posibilidad de que ese problema sea con los datos de prueba. Puede verificar nuevamente, por favor.
Estoy intentando configurar una página en la que un usuario pueda continuar y puedan ver todos los productos que han comprado en el formato estándar de Woocommerce para que puedan agregar algunos de ellos al carrito.
Lo intenté, pero solo 1 aparece cada vez de forma molesta:
<ul class="products">
[insert_php]
$user_id = get_current_user_id();
$current_user = wp_get_current_user();
$customer_email = $current_user->email;
$args = array(
''post_type'' => ''product'',
''posts_per_page'' => 12
);
$loop = new WP_Query( $args );
if ( $loop->have_posts() ) {
while ( $loop->have_posts() ) :
$loop->the_post();
$_product = get_product( $loop->post->ID );
if (wc_customer_bought_product($customer_email, $user_id,$_product->id)){
woocommerce_get_template_part( ''content'', ''product'' );
}
endwhile;
} else {
echo __( ''No products found'' );
}
wp_reset_postdata();
[/insert_php]
</ul><!--/.products-->
Lo que está mal en su código es que obtendrá 12 productos por página, pero solo mostrará los que compra un usuario. Entonces, si por casualidad en esa página, solo hay un producto comprado, entonces eso se mostraría y no otros productos. Y si por casualidad en esa página, no se compraron productos, entonces no se muestra nada. Prueba esto:
<ul class="products">
[insert_php]
global $wpdb;
$current_user = wp_get_current_user();
$customer_email = $current_user->user_email;
$customer_data = array( $customer_email );
$statuses = array_map( ''esc_sql'', wc_get_is_paid_statuses() );
$result = $wpdb->get_col( "
SELECT im.meta_value FROM {$wpdb->posts} AS p
INNER JOIN {$wpdb->postmeta} AS pm ON p.ID = pm.post_id
INNER JOIN {$wpdb->prefix}woocommerce_order_items AS i ON p.ID = i.order_id
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS im ON i.order_item_id = im.order_item_id
WHERE p.post_status IN ( ''wc-" . implode( "'',''wc-", $statuses ) . "'' )
AND pm.meta_key IN ( ''_billing_email'', ''_customer_user'' )
AND im.meta_key IN ( ''_product_id'', ''_variation_id'' )
AND im.meta_value != 0
AND pm.meta_value IN ( ''" . implode( "'',''", $customer_data ) . "'' )
" );
$product_ids = array_map( ''absint'', $result );
if ( !empty( $product_ids ) ) {
$args = array(
''post_type'' => ''product'',
''post__in'' => $product_ids,
''posts_per_page'' => 12
);
$loop = new WP_Query( $args );
if ( $loop->have_posts() ) {
while ( $loop->have_posts() ) :
$loop->the_post();
woocommerce_get_template_part( ''content'', ''product'' );
endwhile;
} else {
echo __( ''No products found'' );
}
wp_reset_postdata();
} else {
echo __( ''No products found'' );
}
[/insert_php]
</ul><!--/.products-->
La parte del código sql está tomada de la función wc_customer_bought_product
WooCommerce. Lo que hace esta función es obtener todos los productos comprados por una dirección de correo electrónico determinada, los datos resultantes como una matriz de identificadores de productos. Después de obtener todos los productos, se probará su identificación de producto si está en esos productos. Entonces sí, menos la parte de prueba, eso es todo lo que necesitamos.