es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo mostrar un mensaje personalizado durante el proceso de pago de WooCommerce a los clientes que previamente compraron productos con estado de pedido ‘en proceso’.

Me gustaría mostrar un mensaje en la página de pago que notifique a los clientes que han comprado este producto en el pasado (el producto que están a punto de comprar), pero este mensaje solo se debe ejecutar si se cumplen estas condiciones.

  1. El cliente debe estar registrado.
  2. El rol de usuario debe ser administrador o cliente.
  3. El producto previamente comprado debe tener un estado de pedido de ‘en proceso’.

Hasta ahora, he podido hacer que las primeras 2 condiciones funcionen correctamente:

function user_logged_in_product_already_bought() {

    global $woocommerce;

    if ( ! is_user_logged_in() ) return;


    $items = $woocommerce->cart->get_cart();

    $has_bought = false;

    foreach($items as $item => $values) { 
        if ( wc_customer_bought_product( '', get_current_user_id(), $values['data']->get_id() ) ) {
            $has_bought = true;
            break;
        }
    } 



    $user = wp_get_current_user();
    $allowed_roles = array( 'administrator', 'customer' );
    if ( array_intersect( $allowed_roles, $user->roles ) ) {

        if( $has_bought ){
            wc_print_notice( "Has comprado esto en el pasado. ¿Quieres comprarlo de nuevo?", 'success' );
        }
    }

}
add_action( 'woocommerce_before_checkout_form', 'user_logged_in_product_already_bought' );

Nota: la razón por la que estoy utilizando foreach es que los usuarios solo compran un producto a la vez (no se pueden tener más de un producto de cita en el carrito).

Pero no sé cómo abordar la tercera condición. ¿Algún consejo?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para verificar si los productos previamente comprados tienen un estado de pedido ‘procesando’, puede utilizar la función wc_get_orders para recuperar los pedidos del usuario actual y el ID del producto. Luego, verifique el estado del pedido para cada pedido y determine si alguno tiene un estado de ‘procesando’.

    Aquí hay una versión actualizada del código:

    function user_logged_in_product_already_bought() {
    
        global $woocommerce;
    
        if ( ! is_user_logged_in() ) return;
    
        $items = $woocommerce->cart->get_cart();
    
        $has_bought = false;
    
        foreach($items as $item => $values) { 
            if ( wc_customer_bought_product( '', get_current_user_id(), $values['data']->get_id() ) ) {
                $has_bought = true;
                break;
            }
        } 
    
        if ( $has_bought ) {
            $orders = wc_get_orders( array(
                'customer' => get_current_user_id(),
                'status' => 'processing',
                'type' => 'shop_order',
                'limit' => -1
            ) );
    
            if ( ! empty( $orders ) ) {
                wc_print_notice( "Ya has comprado esto en el pasado. ¿Comprar de nuevo?", 'success' );
            }
        }
    }
    
    add_action( 'woocommerce_before_checkout_form', 'user_logged_in_product_already_bought' );
    

    Este código recupera todos los pedidos en ‘procesamiento’ para el usuario actual y verifica si alguno de ellos contiene el producto que se está comprando. Si existen dichos pedidos, se muestra la notificación al usuario.

Comments are closed.