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-->
따라서 기본적으로 동일한 제품 루프를 표시하지만 사용자가 이미 구매한 제품만 표시되도록 필터링할 수 있습니다.
솔직히 이건 어떻게 해야 할지 모르겠고 과거에 이것에 대해 연구한 사람들이 있을 거라고 확신해요. 그래서 아마 이것은 많은 사람들에게 도움이 될 거예요!
잘 부탁드립니다!
이 문제를 해결하기 위해 최소한 두 가지 다른 방법을 사용할 수 있습니다.
첫 번째 방법은 각 게시물에서 제품을 가져와 각 제품에서 제품 ID를 얻은 후 if 문을 사용하여 wc_customer_booted_product 또는 woocommce_customer_booted_product(구 WooCommereceee를 사용하는 경우)를 사용하여 필터링하는 것입니다.
두 번째는 사용자가 구매한 주문만 포함하도록 WP_Query를 필터링하는 올바른 인수를 전달하고 그 주문에만 제품을 필터링하는 것입니다.두 번째 접근법에 대한 자세한 내용은 WooCommerce 기반 상점에서 사용자가 구매한 모든 사용자 주문 및 제품 가져오기에서 확인할 수 있습니다.
첫 번째 접근법의 예는 다음과 같습니다.
<!-- 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-->
Appleman1234에 2개의 답변을 준 것에 대해 칭찬합니다.이것들은 모두 유효합니다.
예를 들어 AppplMan1234의 첫 번째 답변은 모든 제품을 루프한 후 호출을 통해 필터링하는 것입니다.wc_customer_bought_product()
이건 분명 효과가 있을 거야가지고 계신 경우n
그 다음에 당신이 만들 제품들n+1
데이터베이스 쿼리
그의 두 번째 제안은 2013년 6월 2일 해결책을 fusedpress.com에 게시한 Brajesh Singh가 작성한 게시물에 대한 링크이다.원래의 투고는 사용할 수 없게 되었습니다.구글에서 캐시된 복사본을 찾았어요.
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');
}
하고, 된 제품 루프도 조합합니다.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-->
이것이 당신에게 도움이 될지는 모르겠지만, 구매 내역을 지원하기 위해 WooThemes가 개발한 플러그인이 있습니다.
언급URL : https://stackoverflow.com/questions/28362162/woocommerce-display-purchased-items-only
'source' 카테고리의 다른 글
리액트 라우터를 사용하여 페이지를 리디렉션하는 가장 좋은 방법은 무엇입니까? (0) | 2023.04.02 |
---|---|
스프링 부트 응용 프로그램을 재시작하지 않고 런타임에서 로그 수준을 변경하는 방법 (0) | 2023.04.02 |
정의되지 않은 'protocol' 속성을 읽을 수 없습니다. (0) | 2023.04.02 |
사용 불가능한 필드 집합 내에서 버튼 하나를 사용 가능으로 설정하는 방법 (0) | 2023.04.02 |
AngularJs에서 ng-repeat을 X회만 반복합니다. (0) | 2023.04.02 |