kev*_*100 7 php wordpress woocommerce
所以我做了很多环顾网络,无法找到解决方案......
基本上我要做的就是显示用户在商店购买的所有产品的产品循环,就像显示普通产品一样.
如果你仍然不明白这可能会帮助你明白我的意思..
以下是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-->
Run Code Online (Sandbox Code Playgroud)
那么,如果我想基本上显示相同的产品循环,但过滤掉它,以便它只显示用户已经购买的产品.
老实说,我不知道这个去哪里,我相信还有其他人在过去做过这方面的研究,所以这可能会帮助一群人!
提前致谢!
您可以采取至少两种不同的方法来解决此问题.
第一种是从每个帖子中获取产品,然后从每个产品中获取产品ID,然后使用if语句过滤使用wc_customer_bought_product或woocommerce_customer_bought_product(如果您使用的是旧的WooCommerece).
第二种方法是传递正确的参数来过滤WP_Query,使其仅包含用户购买的订单,然后仅按这些订单过滤产品.有关第二种方法的更多信息,请参阅用户在基于WooCommerce的商店(archive.org)购买的所有用户订单和产品.
第一种方法的一个例子是
<!-- 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-->
Run Code Online (Sandbox Code Playgroud)
        向Appleman1234致敬,提供两个答案,两者都有效.
他提供的一个例子是ApppleMan1234的第一个答案是遍历所有产品,然后通过调用过滤它们wc_customer_bought_product().这当然会奏效.如果您有n产品,那么您将进行n+1数据库查询.
他的第二个建议是与Brajesh Singh撰写的一篇文章的链接,他于2013年6月2日在fusedpress.com上发布了一个解决方案.原帖不再可用.我在Google 找到了一个缓存副本.
Brajesh Singh的解决方案查询用户的订单,然后查询订单详细信息,最后在订单商品的元数据中查询产品ID.这个解决方案总是只有3个查询.除非您的商店只有1或2个产品,否则这个解决方案要好得多.
这是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');
}
Run Code Online (Sandbox Code Playgroud)
将其与问题中的产品循环相结合,再添加一个未弃用wc_get_template_part()和添加的产品posts_per_page=-1给我们
<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-->
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           9139 次  |  
        
|   最近记录:  |