Я хотел бы создать плагин WooCommerce, чтобы добавить некоторые предложения для клиентов (имеющих историю покупок).Проверка того, что клиент уже купил что-то в WooCommerce
Как я могу проверить, что пользователь купил что-то раньше?
Спасибо.
Я хотел бы создать плагин WooCommerce, чтобы добавить некоторые предложения для клиентов (имеющих историю покупок).Проверка того, что клиент уже купил что-то в WooCommerce
Как я могу проверить, что пользователь купил что-то раньше?
Спасибо.
Да, это возможно создание условной функции, которые возвращают
true
когда клиент уже имеет по крайней мере один заказ со статусом завершенного.
Вот код для этой условной функции:
function has_bought() {
// Get all customer orders
$customer_orders = get_posts(array(
'numberposts' => -1,
'meta_key' => '_customer_user',
'meta_value' => get_current_user_id(),
'post_type' => 'shop_order', // WC orders post type
'post_status' => 'wc-completed' // Only orders with status "completed"
));
// Count number of orders
$count = count($customer_orders);
// return "true" when customer has already one order
if ($count > 0)
return true;
else
return false;
}
Этот код проверен и работает.
Этот код содержится в файле functions.php вашей активной дочерней темы или темы или в файле плагина php.
ИСПОЛЬЗОВАНИЕ (как условие):
Список литературы
Упрощенная версия:
function has_bought() {
// Get all customer orders
$customer_orders = get_posts(array(
'numberposts' => -1,
'meta_key' => '_customer_user',
'meta_value' => get_current_user_id(),
'post_type' => 'shop_order', // WC orders post type
'post_status' => 'wc-completed' // Only orders with status "completed"
));
// return "true" when customer has already one order
return count($customer_orders) > 0 ? true : false;
}
H ere является очень легкой и быстрой условной функцией, которая вернет true, если клиент уже выполнил покупку.
Существует дополнительный аргумент $user_id
, что позволит вам указать определенный идентификатор пользователя:
function has_bought($user_id = 0) {
global $wpdb;
$customer_id = $user_id == 0 ? get_current_user_id() : $user_id;
$paid_order_statuses = array_map('esc_sql', wc_get_is_paid_statuses());
$results = $wpdb->get_col("
SELECT p.ID FROM {$wpdb->prefix}posts AS p
INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
WHERE p.post_status IN ('wc-" . implode("','wc-", $paid_order_statuses) . "')
AND p.post_type LIKE 'shop_order'
AND pm.meta_key = '_customer_user'
AND pm.meta_value = $customer_id
");
// Count number of orders and return a boolean value depending if higher than 0
return count($results) > 0 ? true : false;
}
код идет в function.php файл вашей активной темы ребенка (или темы), или же в любой файл плагина.
Этот код проверен на Woocommerce 3+ и работает (он также должен работать и с предыдущими версиями).
Для нескольких продуктов:Check if a customer has purchased a specific products in WooCommerce
Пример использования 1(вошли в систему клиента)
if(has_bought())
echo '<p>You have already maid a purchase</p>';
else
echo '<p>Welcome, for your first purchase you will get a discount of 10%</p>';
Пример использования 2(установка $ user_id)
// Define the user ID
$user_id = 85;
if(has_bought($user_id))
echo '<p>customer have already maid a purchase</p>';
else
echo '<p>Customer with 0 purchases</p>';
Если $user_id
не определена и текущий пользователь не авторизован, то эта функция будет возвращать false
.
Код этой функции частично базируется на встроенной функции WooCommerce
wc_customer_bought_product
.
Мысли о том, как превратить это в короткий код, чтобы я мог обернуть его контентом? – Garconis
Да, это можно сделать легко в коротком коде ... Какие характеристики вам нужны? * (если вам нравится/хотите, вы можете повысить этот полезный ответ) * ... – LoicTheAztec
Если гость Проверка, включена эта функция может помочь
Просто отправьте $ customer_email в качестве аргумента и функции будут проверять во всех заказов на этот адрес электронной почты и возвращает истину или ложь.
function has_bought($customer_email){
$orders = get_posts(array(
'numberposts' => -1,
'post_type' => 'shop_order',
'post_status' => array('wc-processing', 'wc-completed'),
));
$email_array = array();
foreach($orders as $order) {
$order_obj = wc_get_order($order->ID);
$order_obj_data = $order_obj->get_data();
array_push($email_array, $order_obj_data['billing']['email']);
}
if (in_array($customer_email, $email_array)) {
return true;
} else {
return false;
}
}
большое спасибо. это очень полезно –
Любой способ показать/вернуть дату самой последней покупки в одно и то же время? –
@RodrigoM Возвратите true если клиент купил успешно сразу один раз – LoicTheAztec