Как отобразить все товары, купленные пользователем

Когда-то я уже описывал на англ. блоге то, как вывести все товары, купленные пользователем, тогда я делал это полностью с нуля, создавая запросы к базе данных и запуская цикл.

Но я никогда не рерайчу свои же собственные англ. посты на русский язык, поэтому сегодня я поделюсь с вами совсем другим способом, который будет заключаться в получении ID товаров при помощи стандартных функций WordPress и WooCommerce и передачи их в шорткод WooCommerce [products].

Возможно этот способ будет чуть помедленнее, но зато кода будет намного меньше.

И ребят, напоминаю, что у меня на сайте есть видеокурс по WooCommerce, вот ссылка.

Мы в этом уроке создадим свой шорткод [customer_products], и вы например потом сможете вывести его, создав вкладку и страницу в меню личного кабинета.

Товары, купленные пользователем в личном кабинете WooCommerce
Как вариант, можно создать отдельную ссылку в меню и страницу в личном кабинете и вывести купленные товары там.

А это код, который вы можете вставить например в functions.php вашей текущей темы или в произвольный плагин. После этого можете использовать шорткод [customer_products] где вам нужно.

add_shortcode( 'customer_products', 'truemisha_products_current_user' );
 
function truemisha_products_current_user() {
	// ничего не делаем, если не авторизован
	if ( ! is_user_logged_in() ) {
		return;
	}
 
	// получаем все оплаченные заказы пользователя
	$customer_orders = get_posts( array(
		'posts_per_page' => -1,
		'meta_key'    => '_customer_user',
		'meta_value'  => get_current_user_id(),
		'post_type'   => wc_get_order_types(),
		'post_status' => array_keys( wc_get_is_paid_statuses() ),
	) );
 
	// если заказов не найдено
	if ( ! $customer_orders ) {
		return;
	}
 
	// создаём отдельную переменную для ID товаров и записываем в неё
	$ids = array();
	foreach ( $customer_orders as $customer_order ) {
		$order = wc_get_order( $customer_order->ID );
		$items = $order->get_items();
		foreach ( $items as $item ) {
			$ids[] = $item->get_product_id();
		}
	}
 
	// возвращаем шорткод
	return do_shortcode( '[products ids="' . join( ",", array_unique( $ids ) ) . '"]' );
 
}
  • Функция is_user_logged_in() на строке 5 нужна для того, чтобы проверить, авторизован ли пользователь, если нет, то мы сразу же выходим из функции.
  • Обратите внимание, что когда мы получаем заказы пользователя функцией get_posts(), мы не получаем их как посты автора, а передаём полученное через get_current_user_id() ID текущего пользователя в качестве значения для мета ключа _customer_user.
  • В массиве $ids храним ID товаров, которые мы потом объединяем в строку функцией join() и удаляем повторяющие элементы функцией array_unique().

Миша

Недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Оставить комментарий

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, если же код – меньше одной строчки, то можно и в <code></code>.