Created
March 12, 2021 10:37
-
-
Save FrancoStino/405a1f851379bef1bc5bc261ea43f97b to your computer and use it in GitHub Desktop.
WooCommerce – Display purchased products in My Account
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
add_filter ( 'woocommerce_account_menu_items', 'misha_purchased_products_link', 40 ); | |
add_action( 'init', 'misha_add_products_endpoint' ); | |
add_action( 'woocommerce_account_purchased-products_endpoint', 'misha_populate_products_page' ); | |
// here we hook the My Account menu links and add our custom one | |
function misha_purchased_products_link( $menu_links ){ | |
// we use array_slice() because we want our link to be on the 3rd position | |
return array_slice( $menu_links, 0, 2, true ) | |
+ array( 'purchased-products' => 'Purchased Products' ) | |
+ array_slice( $menu_links, 2, NULL, true ); | |
} | |
// here we register our rewrite rule | |
function misha_add_products_endpoint() { | |
add_rewrite_endpoint( 'purchased-products', EP_PAGES ); | |
} | |
// here we populate the new page with the content | |
function misha_populate_products_page() { | |
global $wpdb; | |
// this SQL query allows to get all the products purchased by the current user | |
// in this example we sort products by date but you can reorder them another way | |
$purchased_products_ids = $wpdb->get_col( $wpdb->prepare( | |
" | |
SELECT itemmeta.meta_value | |
FROM " . $wpdb->prefix . "woocommerce_order_itemmeta itemmeta | |
INNER JOIN " . $wpdb->prefix . "woocommerce_order_items items | |
ON itemmeta.order_item_id = items.order_item_id | |
INNER JOIN $wpdb->posts orders | |
ON orders.ID = items.order_id | |
INNER JOIN $wpdb->postmeta ordermeta | |
ON orders.ID = ordermeta.post_id | |
WHERE itemmeta.meta_key = '_product_id' | |
AND ordermeta.meta_key = '_customer_user' | |
AND ordermeta.meta_value = %s | |
ORDER BY orders.post_date DESC | |
", | |
get_current_user_id() | |
) ); | |
// some orders may contain the same product, but we do not need it twice | |
$purchased_products_ids = array_unique( $purchased_products_ids ); | |
// if the customer purchased something | |
if( !empty( $purchased_products_ids ) ) : | |
// it is time for a regular WP_Query | |
$purchased_products = new WP_Query( array( | |
'post_type' => 'product', | |
'post_status' => 'publish', | |
'post__in' => $purchased_products_ids, | |
'orderby' => 'post__in' | |
) ); | |
echo '<div class="woocommerce columns-3">'; | |
woocommerce_product_loop_start(); | |
while ( $purchased_products->have_posts() ) : $purchased_products->the_post(); | |
wc_get_template_part( 'content', 'product' ); | |
endwhile; | |
woocommerce_product_loop_end(); | |
woocommerce_reset_loop(); | |
wp_reset_postdata(); | |
echo '</div>'; | |
else: | |
echo 'Nothing purchased yet.'; | |
endif; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment