2015-02-06 14 views
6

Così mi hanno fatto un sacco di ricerca in tutto il web e non riusciva a trovare una soluzione per questo ...WooCommerce Mostra Articoli acquistati solo

Fondamentalmente quello che sto cercando di fare è di visualizzare un ciclo di prodotto di tutti i prodotti che l'utente ha acquistato nello store proprio come visualizzare prodotti normali.

Se ancora non si capisce forse questo vi aiuterà a ottenere quello che voglio dire ..

Ecco il loop esempio di prodotto sulla documentazione WooCommerce ...

<ul class="products"> 
    <?php 
     $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(); 
       woocommerce_get_template_part('content', 'product'); 
      endwhile; 
     } else { 
      echo __('No products found'); 
     } 
     wp_reset_postdata(); 
    ?> 
</ul><!--/.products--> 

Che importa se ho volevo visualizzare fondamentalmente questo stesso ciclo di prodotto esatto, ma filtrarlo in modo che mostri solo i prodotti che l'utente ha già acquistato.

Onestamente non so dove andare con questo e sono sicuro che ci sono altri che hanno fatto ricerche su questo in passato, quindi forse questo aiuterà un sacco di persone!

Grazie in anticipo!

risposta

9

Ci sono almeno due diversi approcci che è possibile adottare per risolvere questo problema.

Il primo è ottenere il prodotto da ogni post, quindi ottenere l'ID prodotto da ciascun prodotto e quindi utilizzare un'istruzione if per filtrare utilizzando wc_customer_bought_product o woocommerce_customer_bought_product (se si utilizza il vecchio WooCommerece).

Il secondo è passare gli argomenti corretti per filtrare WP_Query per includere solo gli ordini acquistati da un utente e quindi filtrare i prodotti solo in tali ordini. Ulteriori informazioni sul secondo approccio sono disponibili allo Get All User Orders and Products bought by user in WooCommerce based shop (archive.org).

Un esempio del primo approccio è qualcosa di simile

<!-- code started --> 

<ul class="products"> 
    <?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(); 
    ?> 
</ul><!--/.products--> 
+0

E se volessi mostrare solo i prodotti all'interno di una determinata categoria? – kevingilbert100

+0

Ok, ho capito io stesso la categoria, ma un'altra domanda e se volessi farlo controllare per una meta variabile. Ad esempio se l'utente ha una sottoscrizione in corso questa sottoscrizione in corso verrà definita in ogni meta di prodotti in "payment_plan_subscription_id_text_field" e il plug-in im utilizza i controlli con la seguente funzione "woocommerce_members_only (array())", quindi cosa fare se volessi dire se il il cliente ha acquistato quel prodotto OPPURE || se il cliente è all'interno di quel gruppo di appartenenza all'interno del meta del prodotto. – kevingilbert100

+0

@ kmgilbert100 puoi ottenerlo usando il codice dal link indicato .. per favore leggi quello;) – Reigel

-2

Non so se questo ti aiuta affatto, ma c'è un plugin sviluppato da WooThemes per supportare la cronologia degli acquisti.

+0

Penso che il manifesto originale sta chiedendo una pagina da mostrare al utente tutti i prodotti acquistati da quell'utente, mentre il plug-in WooCommerce Customer History fornisce analisi di back-end per i proprietari dei negozi – Kirby

8

Complimenti a Appleman1234 per la fornitura di due risposte, entrambi i quali funzioneranno.

La prima risposta di ApppleMan1234 a cui ha fornito un esempio è di eseguire il ciclo di tutti i prodotti e quindi filtrarli chiamando lo wc_customer_bought_product(). Questo sicuramente funzionerà. Se si dispone di prodotti n, si effettueranno le query del database n+1.

Il suo secondo suggerimento è un collegamento a un post scritto da Brajesh Singh che, il 2 giugno 2013, ha pubblicato una soluzione su fusedpress.com. Il post originale non è più disponibile. Ho trovato uno cached copy su Google.

La soluzione Brajesh Singh interroga gli ordini dell'utente, quindi esegue una query sui dettagli dell'ordine e l'ultima query l'ID prodotto nei metadati dell'articolo dell'ordine. Questa soluzione quindi è sempre solo 3 query. A meno che il tuo negozio abbia solo 1 o 2 prodotti, questa soluzione è di gran lunga migliore.

Ecco una versione leggermente modificata del codice di Brajesh Singh.

/** 
* Get all Products Successfully Ordered by the user 
* @return bool|array false if no products otherwise array of product ids 
*/ 
function so28362162_get_all_products_ordered_by_user() { 
    $orders = so28362162_get_all_user_orders(get_current_user_id(), 'completed'); 
    if(empty($orders)) { 
     return false; 
    } 
    $order_list = '(' . join(',', $orders) . ')';//let us make a list for query 
    //so, we have all the orders made by this user that were completed. 
    //we need to find the products in these orders and make sure they are downloadable. 
    global $wpdb; 
    $query_select_order_items = "SELECT order_item_id as id FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id IN {$order_list}"; 
    $query_select_product_ids = "SELECT meta_value as product_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key=%s AND order_item_id IN ($query_select_order_items)"; 
    $products = $wpdb->get_col($wpdb->prepare($query_select_product_ids, '_product_id')); 
    return $products; 
} 

/** 
* Returns all the orders made by the user 
* @param int $user_id 
* @param string $status (completed|processing|canceled|on-hold etc) 
* @return array of order ids 
*/ 
function so28362162_get_all_user_orders($user_id, $status = 'completed') { 
    if(!$user_id) { 
     return false; 
    } 
    $args = array(
     'numberposts' => -1, 
     'meta_key' => '_customer_user', 
     'meta_value' => $user_id, 
     'post_type' => 'shop_order', 
     'post_status' => 'publish', 
     'tax_query' => array(
      array(
       'taxonomy' => 'shop_order_status', 
       'field' => 'slug', 
       'terms' => $status 
      ) 
     ) 
    ); 
    $posts = get_posts($args); 
    //get the post ids as order ids 
    return wp_list_pluck($posts, 'ID'); 
} 

Unendo che con un ciclo di prodotto dalla questione, più un non-deprecato wc_get_template_part() e un'aggiunta di posts_per_page=-1 ci dà

<ul class="products"> 
     <?php 
     $args = array(
      'post_type' => 'product', 
      'post__in' => so28362162_get_all_products_ordered_by_user(), 
      'posts_per_page' => -1 
     ); 
     $loop = new WP_Query($args); 
     if($loop->have_posts()) { 
      while($loop->have_posts()) : $loop->the_post(); 
       wc_get_template_part('content', 'product'); 
      endwhile; 
     } 
     else { 
      echo __('No products found'); 
     } 
     wp_reset_postdata(); 
     ?> 
    </ul><!--/.products--> 
+0

Ho paura che anche il tuo link memorizzato nella cache sia inattivo :(Grazie per la spiegazione. Proverò con la seconda soluzione di AppleMan1234 (grazie mille anche a te). –