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-->
E se volessi mostrare solo i prodotti all'interno di una determinata categoria? – kevingilbert100
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
@ kmgilbert100 puoi ottenerlo usando il codice dal link indicato .. per favore leggi quello;) – Reigel