Как скрыть кнопку добавления в корзину для пользователей, если они уже покупали товар

Иногда бывает нужно ограничить продажу товара для тех пользователей, которые уже купили его однажды. Это например может быть товар с какой-то мега-скидкой или подписка на сайт.

А в моём видеокурсе по WooCommerce мы детально останавливаемся на том, как закодить кнопки добавления в корзину для любых типов товаров, простых, вариативных и т.д.

Итак, наша задача будет состоять из трёх подзадач:

  • Нам нужно превратить кнопку добавления в корзину на страницах каталога и категориях в ссылку перехода на страницу товара.
  • Нам нужно полностью убрать кнопку добавления в корзину непосредственно со страниц товара.
  • Также нужно учесть, что если по каким-то причинам у нас есть пользователи, которые уже купили товар и он повторно находится у них в корзине – предотвратить для них возможность повторной покупки.

Может показаться, что сейчас мы для этого создадим целых три сниппета кода, но по факту всё решается одним единственным фильтр-хуком woocommerce_is_purchasable и функцией wc_customer_bought_product(), готовый код:

/**
 * @snippet       Разрешаем пользователям покупать товар только 1 раз
 * @author        Миша Рудрастых
 * @url           https://misha.agency/woocommerce/skryt-knopku-dobavleniya-v-korzinu-esli-tovar-uzhe-kuplen.html
 */
add_filter( 'woocommerce_is_purchasable', 'true_hide_add_to_cart_if_purchased', 25, 2 );
 
function true_hide_add_to_cart_if_purchased( $is_purchasable, $product ) {
 
	// если текущий пользователь уже покупал этот товар
	if ( wc_customer_bought_product( '', get_current_user_id(), $product->get_id() ) ) {
		$is_purchasable = false;
	}
 
	return $is_purchasable;
 
}

Не знаете, куда вставлять код?

Также я бы хотел обратить ваше внимание на два момента:

  • Мы использовали функцию get_current_user_id() для получения ID текущего пользователя.
  • Если пользователь не авторизован, то этот код не блокирует покупку товара.
  • Также код работает для всех товаров на сайте, если хотите исключить только определённые товары, то вам нужно допилить в код кусочек ниже:
if (
    5 === $product->get_id() // если товар с ID=5
    || wc_customer_bought_product( '', get_current_user_id(), $product->get_id() )
) {

Для нескольких товаров:

if (
    in_array( $product->get_id(), array( 5, 10 ) ) // если товар с ID=5 или 10
    || wc_customer_bought_product( '', get_current_user_id(), $product->get_id() )
) {

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Комментарии — 1

Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.

Миша Рудрастых и WordPress

Полезности из мира WordPress и жизни студии.

Мой телеграм-канал