Проверка того, что клиент уже купил что-то в 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; } 

Этот код проверен и работает.

Этот код находится в файле function.php вашей активной дочерней темы или темы или в файле php плагина.


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

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

Рекомендации

  • Структура шаблона + Переопределение шаблонов через тему
  • Проверьте, покупал ли клиент конкретный продукт ранее в WooCommerce

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

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

Здесь очень легкая и быстрая условная функция , которая вернет 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+ и работает (он также должен работать и с предыдущими версиями).

Для нескольких продуктов: проверьте, приобрел ли клиент определенные продукты в 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 .

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

Просто отправьте $ customer_email как аргумент, и функция проверит все заказы на это письмо и вернет true или false.

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