2016-08-10 2 views

ответ

5

Update: New updated improved, light and faster version HERE


Да, это возможно создание условной функции, которые возвращают 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.


ИСПОЛЬЗОВАНИЕ (как условие):

  • Вы можете использовать его в какой-то WooCommerce templates, что вы ранее скопировали на тему активного ребенка или темы.
  • В вашей теме php-файлы.
  • В файлах плагинов php.
  • Любая функция php или WordPress/WooCommerce.

Список литературы

+0

большое спасибо. это очень полезно –

+0

Любой способ показать/вернуть дату самой последней покупки в одно и то же время? –

+0

@RodrigoM Возвратите true если клиент купил успешно сразу один раз – LoicTheAztec

0

Упрощенная версия:

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; 
} 
1

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.

+0

Мысли о том, как превратить это в короткий код, чтобы я мог обернуть его контентом? – Garconis

+0

Да, это можно сделать легко в коротком коде ... Какие характеристики вам нужны? * (если вам нравится/хотите, вы можете повысить этот полезный ответ) * ... – LoicTheAztec

0

Если гость Проверка, включена эта функция может помочь

Просто отправьте $ 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; 
} 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^