Я хотел бы создать плагин 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 плагина.
ИСПОЛЬЗОВАНИЕ (как условие) :
Рекомендации
Упрощенная версия:
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; } }