Created
June 1, 2021 19:07
-
-
Save manuelhudec/5757b7ed51522843c7458bb2d47a7846 to your computer and use it in GitHub Desktop.
WooCommerce - Customer account: Show recently purchased products
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