Показ продукта зарегистрированным пользователям, которые еще не приобрели его в WooCommerce

Я хотел показать товар только тогда, когда пользователь зарегистрировался и не купил этот товар (новый пользовательский товар).

После того, как он купит этот продукт один раз, он больше не будет доступен для этого пользователя (потому что это одноразовая сделка).

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

Если бы я был новым пользователем и не купил его, конечно, он должен появляться везде.

У меня есть пользовательское свойство (метаданные) для пользователя, которое указывает, покупают ли они его или нет. После того как они купят его, я установлю для этого флага пользователя значение true, указывающее, что он больше не может отображаться.

У меня было два вопроса:

  1. Есть ли способ подключиться к фактической успешной покупке предмета и установить для этого флага пользователя значение true?
  2. Как я могу дать указание Woo не показывать этот продукт определенному пользователю, если у него установлен флаг true?

Спасибо!

1

Решение

Да, это возможно через 3 функции:

1) условная функция это проверит, что клиент купил ваш конкретный продукт:

function has_bought_items( $user_id = 0, $product_id = 0 ) {
// The customer ID
$customer_id = $user_id == 0 || $user_id == '' ? get_current_user_id() : $user_id;

// Retrieve your customer flag '_has_bought_flag' (or replace it by your slug)
if ( get_user_meta( $customer_id, '_has_bought_flag', true ) )
return true;
else
return false;
}

Код помещается в файл function.php вашей активной дочерней темы (или темы) или также в любой файл плагина.

2) Пользовательская функция подключен pre_get_posts это изменит WP_Query на страницах магазинов и архивов, проверяя, вошел ли пользователь в систему и купил ли он этот конкретный продукт:

// Changing the WP_Query loop conditionally
add_action( 'pre_get_posts', 'conditional_product_query', 10, 1 );
function conditional_product_query( $q ) {

// HERE set your product ID
$product_id = 37;

if( ! is_user_logged_in() || has_bought_items( '', $product_id ) )
$q->set( 'post__not_in', array($product_id) );
}

Это полностью удалит этот продукт везде, когда условие соответствует.

Код помещается в файл function.php вашей активной дочерней темы (или темы) или также в любой файл плагина.

3) Пользовательская функция подключен woocommerce_order_status_completed это установит флаг клиента, когда статус заказа будет «завершен», когда продукт находится в этом заказе, и когда флаг клиента еще не существует:

// When Order get the "completed" status (paid) we check and we set the user flag (if necessary)
add_action( 'woocommerce_order_status_completed', 'set_customer_specific_product_flag', 10, 2 );
function set_customer_specific_product_flag( $order_id, $order ) {

// HERE set your product ID
$product_id = 37;

// If customer has already bought the product we exit
if( has_bought_items( $order->get_user_id(), $product_id ) ) return;

// Checking order items (if it match we update user meta data
foreach( $order->get_items() as $product_item ){
if ( $product_item->get_product_id() == $product_id ){
update_user_meta( $order->get_user_id(), '_has_bought_flag', '1' );
break;
}
}
}

Код помещается в файл function.php вашей активной дочерней темы (или темы) или также в любой файл плагина.

Этот код протестирован на Woocommerce 3+ и работает (он должен работать и в предыдущих версиях).


Соответствующий ответ: Проверка того, что клиент уже что-то купил в WooCommerce

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector