wordpres tag page name is_page first all php wordpress woocommerce products orders

php - tag - Verificando si el cliente ya ha comprado algo en WooCommerce



is_page wordpres (4)

Versión simplificada:

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

Me gustaría crear un complemento de WooCommerce para agregar algunas ofertas para clientes (que tienen un Historial de compras).

¿Cómo puedo verificar que un usuario haya comprado algo antes?

Gracias.


Sí, es posible crear una función condicional que devuelva true cuando un cliente ya haya completado al menos un pedido con estado.

Aquí está el código para esta función condicional:

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

Este código está probado y funciona.

Este código va en el archivo function.php de su tema o tema hijo activo, o en un archivo plugin php.

USO (como condición) :

  • Puede usarlo en algunas plantillas de WooCommerce que habrá copiado previamente a su tema o tema infantil activo .
  • En tu tema, archivos php.
  • En los archivos plugin php .
  • Cualquier función de php o WordPress / WooCommerce.

Referencias


Aquí hay una función condicional mucho más ligera y más rápida que volverá a ser verdadera si un cliente ya ha realizado una compra.

Existe un argumento opcional $user_id , que le permitirá especificar un ID de usuario definido:

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

El código va en el archivo function.php de su tema hijo activo (o tema) o también en cualquier archivo de complemento.

Este código se prueba en Woocommerce 3+ y funciona (también debería funcionar en versiones anteriores).

Para productos múltiples: compruebe si un cliente ha comprado productos específicos en WooCommerce

Ejemplo de uso 1 (cliente registrado)

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

Ejemplo de uso 2 (configuración de $ 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>'';

Si $user_id no está definido y el usuario actual no está conectado, esta función devolverá false .

El código de esta función se basa parcialmente en el código fuente incorporado de wc_customer_bought_product función WooCommerce.


Si la verificación de invitado está habilitada, esta función podría ayudar

Simplemente envíe $ customer_email como argumento y la función verificará en todos los pedidos de ese correo electrónico y devolverá verdadero o falso.

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