2015-02-06 16 views
6

Więc zrobiłem kilka rozglądając się po internecie i nie mógł znaleźć rozwiązanie dla tego ...woocommerce Pokaż Zakupione przedmioty Tylko

Zasadniczo co próbuję zrobić, to wyświetla pętlę produktowej wszystkich produkty, które użytkownik kupił w sklepie, podobnie jak wyświetlanie normalnych produktów.

Jeśli nadal nie rozumiesz może to pomoże Ci co mam na myśli ..

Oto przykład pętla produkt w dokumentacji 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--> 

Więc co jeśli chciałem wyświetlać w zasadzie dokładnie tę samą pętlę produktu, ale odfiltrować ją tak, aby wyświetlała tylko produkty, które użytkownik już kupił.

Szczerze mówiąc nie wiem, gdzie się udać z tym i jestem pewien, że są inni, którzy zrobili badania na ten temat w przeszłości, więc może to pomoże grupce ludzi!

Z góry dziękuję!

Odpowiedz

9

Istnieją co najmniej dwa różne podejścia, które można podjąć, aby rozwiązać ten problem.

Pierwszym z nich jest pobranie produktu z każdego posta, a następnie pobranie identyfikatora produktu z każdego produktu, a następnie użycie instrukcji if do filtrowania przy użyciu polecenia toaletowego_bustom_bought_product lub woocommerce_customer_bought_product (jeśli używasz starego WooCommerece).

Drugim krokiem jest przekazanie prawidłowych argumentów do filtrowania WP_Query w celu uwzględnienia tylko zamówień kupionych przez użytkownika, a następnie filtrowania produktów tylko w tych zamówieniach. Więcej informacji na temat drugiego podejścia można znaleźć pod adresem Get All User Orders and Products bought by user in WooCommerce based shop (archive.org).

Przykładem pierwszego podejścia jest coś

<!-- 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

Co zrobić, jeśli chcę wyświetlać tylko produkty w określonej kategorii? – kevingilbert100

+0

Okay Sam wymyśliłem kategorię, ale inne pytanie, co jeśli chciałbym, żeby to sprawdziło zmienną meta. Na przykład, jeśli użytkownik ma trwającą subskrypcję, ta trwająca subskrypcja byłaby zdefiniowana w każdej meta produktów pod "payment_plan_subscription_id_text_field", a wtyczka im używa czeków z następującą funkcją "woocommerce_members_only (array())", więc co jeśli chciałbym powiedzieć, czy klient kupił ten produkt LUB || jeśli klient znajduje się w tej grupie członkowskiej w meta produktu. – kevingilbert100

+0

@ kmgilbert100 można to osiągnąć za pomocą kodu z podanego linku. Przeczytaj proszę;) – Reigel

-2

Nie jestem pewien, czy to w ogóle pomaga, ale istnieje też wersja plugin opracowana przez WooThemes w celu obsługi historii zakupów.

+0

Myślę, że oryginalny plakat domaga się strona, aby pokazać do użytkownik wszystkie produkty zakupione przez tego użytkownika, a wtyczka Historia klienta WooCommerce zapewnia analitykę backendu dla właścicieli sklepów. – Kirby

8

Uznanie Appleman1234 za dostarczanie dwie odpowiedzi, z których oba będą działać.

Pierwsza odpowiedź ApppleMan1234, który dostarczył przykładu, to przeglądanie wszystkich produktów, a następnie filtrowanie ich przez wywołanie wc_customer_bought_product(). To na pewno zadziała. Jeśli masz produkty o numerze n, to zamierzamy wykonać zapytania bazy danych n+1.

Jego drugą sugestią jest link do postu napisanego przez Brajesh Singha, który 2 czerwca 2013 r. Opublikował rozwiązanie na stronie fusedpress.com. Oryginalny wpis nie jest już dostępny. Znalazłem cached copy w Google.

Rozwiązanie Brajesh Singh analizuje zamówienia użytkownika, następnie sprawdza szczegóły zamówienia, a ostatnie zapytania identyfikuje produkt w metadanych elementu zamówienia. To rozwiązanie jest zawsze tylko 3 zapytaniami. O ile twój sklep ma tylko 1 lub 2 produkty, to rozwiązanie jest o wiele lepsze.

Oto nieco zmieniona wersja kodu Brajesh Singha.

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

Łącząc to z pętlą produktu z pytaniem, a także zakaz przestarzałe wc_get_template_part() i dodanie posts_per_page=-1 daje nam

<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

Obawiam się, że twój link w pamięci podręcznej jest również zbyt pusty :(Dziękuję za wyjaśnienia. Spróbuję z drugim rozwiązaniem AppleMan1234 (bardzo ci też dziękuję). –