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