2017-06-08 15 views
4

ユーザーが行くことができるページを設定しようとしており、購入したすべての商品を標準のWoocommerce形式で見ることができるので、 。Woocコマースすべて以前に注文された商品

が、私はこれを試してみたが、唯一の1がうるさくたびにアップ示している:

<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--> 
+0

申し訳ありませんが、私はWordpressのページにPHPを入れることができるプラグインを使用しています。 <?phpと[/ insert_php]を?> – user3181828

+1

に置き換えてください。このコードで間違っているのは、ページごとに12個の製品が表示されますが、ユーザーが購入した製品のみを表示するということです。したがって、そのページで偶然に購入した商品が1つしかない場合は、それが表示され、他の商品はありません。そしてそのページの中に偶然、購入した商品がない場合、何も表示されません。 – Reigel

+0

PHPをページコンテンツに入れることができるプラグインを使用することは、本当に悪い考えです。これらのプラグインは大きなセキュリティリスクです。代わりにショートコードを使用してください。あなたのサイトがハッキングされた場合、評判を修正するよりも簡単ですが、簡単に取り組むのは難しいです。 –

答えて

0

あなたのコードが動作している(WP 4.8、WooCommerce 3.1.0、挿入PHP 1.3)。

私は明確な一瞬たい:あなたのクライアントの場合は、時間よりも一つの製品を購入

は、とにかくあなたは、リスト内の1つの製品を得ました。

テストデータに問題がある可能性があります。もう一度確認できますか?

1

あなたのコードで間違っているのは、ページごとに12個の製品が表示されますが、ユーザーが購入した製品のみが表示されることです。したがって、そのページで偶然に購入した商品が1つしかない場合は、それが表示され、他の商品はありません。そしてそのページの中に偶然、購入した商品がない場合、何も表示されません。これを試してみてください:

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

SQLコードの一部がWooCommerce wc_customer_bought_product機能から取得されます。この機能は、特定の電子メールアドレスで購入されたすべての製品を取得し、結果として得られるデータを製品IDの配列として取得します。すべての製品を入手した後、指定された製品IDは、それらの製品に含まれているかどうかテストされます。だから、テスト部分を除いて、それだけで十分です。

関連する問題