Cómo crear automáticamente una cuenta si un producto en el pedido pertenece a una determinada categoría en WooCommerce

6 minutos de lectura

Como crear automaticamente una cuenta si un producto en el
Joaquín

Tengo una tienda de WooCommerce donde los clientes pagan como invitados. Ahora quiero vender un par de productos virtuales y, en ese caso, quiero crear una cuenta automáticamente.

Así que tengo dos fragmentos de código de trabajo.

  • Uno para verificar si un producto en el carrito está dentro de una categoría específica (en línea)
  • Uno para crear automáticamente una cuenta desde el pago de invitado.

Pero no puedo encontrar la manera de combinar estos dos para que funcionen juntos. ¿O es una mejor solución para esto? ¿Algunas ideas?

Aquí están los dos fragmentos de código con los que comencé y luego traté de combinarlos en una sola función.

Fuente: verifique la categoría del producto en los artículos del carrito con WooCommerce

add_action('woocommerce_before_cart', 'action_before_cart');
function action_before_cart() {
    $categories   = array('online');
    $has_category = false;

    // Loop through cart items
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        // Check for product categories
        if ( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ) {
            $has_category = true;
            break;
        }
    }

    // Testing output (display a notice)
    if ( $has_category ) { 
        wc_print_notice( sprintf( 'Product category "%s" is in cart!', reset($categories)), 'notice' );
    }
}

Fuente: envíe las notificaciones de correo electrónico de restablecimiento de contraseña mediante programación en Woocommerce

function wc_register_guests( $order_id ) {
  // get all the order data
  $order = new WC_Order($order_id);
  
  //get the user email from the order
  $order_email = $order->billing_email;
    
  // check if there are any users with the billing email as user or email
  $email = email_exists( $order_email );  
  $user = username_exists( $order_email );
  
  // if the UID is null, then it's a guest checkout
  if( $user == false && $email == false ){
    
    // random password with 12 chars
    $random_password = wp_generate_password();
    
    // create new user with email as username & newly created pw
    $user_id = wp_create_user( $order_email, $random_password, $order_email );
    
    //WC guest customer identification
    update_user_meta( $user_id, 'guest', 'yes' );
 
    //user's billing data
    update_user_meta( $user_id, 'billing_address_1', $order->billing_address_1 );
    update_user_meta( $user_id, 'billing_address_2', $order->billing_address_2 );
    update_user_meta( $user_id, 'billing_city', $order->billing_city );
    update_user_meta( $user_id, 'billing_company', $order->billing_company );
    update_user_meta( $user_id, 'billing_country', $order->billing_country );
    update_user_meta( $user_id, 'billing_email', $order->billing_email );
    update_user_meta( $user_id, 'billing_first_name', $order->billing_first_name );
    update_user_meta( $user_id, 'billing_last_name', $order->billing_last_name );
    update_user_meta( $user_id, 'billing_phone', $order->billing_phone );
    update_user_meta( $user_id, 'billing_postcode', $order->billing_postcode );
    update_user_meta( $user_id, 'billing_state', $order->billing_state );
 
    // user's shipping data
    update_user_meta( $user_id, 'shipping_address_1', $order->shipping_address_1 );
    update_user_meta( $user_id, 'shipping_address_2', $order->shipping_address_2 );
    update_user_meta( $user_id, 'shipping_city', $order->shipping_city );
    update_user_meta( $user_id, 'shipping_company', $order->shipping_company );
    update_user_meta( $user_id, 'shipping_country', $order->shipping_country );
    update_user_meta( $user_id, 'shipping_first_name', $order->shipping_first_name );
    update_user_meta( $user_id, 'shipping_last_name', $order->shipping_last_name );
    update_user_meta( $user_id, 'shipping_method', $order->shipping_method );
    update_user_meta( $user_id, 'shipping_postcode', $order->shipping_postcode );
    update_user_meta( $user_id, 'shipping_state', $order->shipping_state );
    
    // link past orders to this newly created customer
    wc_update_new_customer_past_orders( $user_id );
  }
  
}
 
//add this newly created function to the thank you page
add_action( 'woocommerce_thankyou', 'wc_register_guests', 10, 1 ); 

1647536226 805 Como crear automaticamente una cuenta si un producto en el
7uc1f3r

No crearía una cuenta automáticamente. Me aseguraría de que el pedido no se pueda realizar mientras uno no tenga una cuenta. (Si ese producto en particular está presente en el carrito de compras).

La creación de una cuenta y las acciones asociadas, como correos electrónicos, etc., ya están previstas en WooCommerce.

De lo contrario, tendrá que escribir un código adicional y pronto notará que siempre falta alguna opción (como enviar un correo electrónico con la contraseña de usuario) que requiere que escriba un código adicional. En resumen, mantenlo lo más simple posible.


Pero porque su pregunta era sobre cómo crear una cuenta usted mismopuedes hacer esto con el siguiente código

  • Explicación a través de etiquetas de comentarios agregadas en el código
  • wp_insertar_usuario() – Insertar un usuario en la base de datos
function wc_register_guests( $order_id ) {
    // Determines whether the current visitor is a logged in user.
    if( is_user_logged_in() ) return;
    
    // Get $order object
    $order = wc_get_order( $order_id );
    
    // Get the user email from the order
    $order_email = $order->billing_email;

    // Check if there are any users with the billing email as user or email
    $email = email_exists( $order_email );  
    $user = username_exists( $order_email );

    // If the UID is null, then it's a guest checkout (new user)
    if( $user == false && $email == false ) {
        // Check on category ( multiple categories can be entered, separated by a comma )
        $categories = array( 'online', 'categorie-1' );

        // Flag
        $has_category = false;
        
        // Loop through order items
        foreach ( $order->get_items() as $item_key => $item ) {
            if ( has_term( $categories, 'product_cat', $item['product_id'] ) ) {
                $has_category = true;
                break;
            }
        }
        
        // True
        if ( $has_category ) {
            // Random password with 12 chars
            $random_password = wp_generate_password();
            
            // Firstname
            $first_name = $order->get_billing_first_name();
            
            // Lastname
            $last_name = $order->get_billing_last_name();
            
            // Role
            $role="customer";

            // Create new user with email as username, newly created password and userrole          
            $user_id = wp_insert_user(
                array(
                    'user_email' => $order_email,
                    'user_login' => $order_email,
                    'user_pass'  => $random_password,
                    'first_name' => $first_name,
                    'last_name'  => $last_name,
                    'role'       => $role,
                )
            );

            // (Optional) WC guest customer identification
            update_user_meta( $user_id, 'guest', 'yes' );

            // User's billing data
            update_user_meta( $user_id, 'billing_address_1', $order->billing_address_1 );
            update_user_meta( $user_id, 'billing_address_2', $order->billing_address_2 );
            update_user_meta( $user_id, 'billing_city', $order->billing_city );
            update_user_meta( $user_id, 'billing_company', $order->billing_company );
            update_user_meta( $user_id, 'billing_country', $order->billing_country );
            update_user_meta( $user_id, 'billing_email', $order->billing_email );
            update_user_meta( $user_id, 'billing_first_name', $order->billing_first_name );
            update_user_meta( $user_id, 'billing_last_name', $order->billing_last_name );
            update_user_meta( $user_id, 'billing_phone', $order->billing_phone );
            update_user_meta( $user_id, 'billing_postcode', $order->billing_postcode );
            update_user_meta( $user_id, 'billing_state', $order->billing_state );

            // User's shipping data
            update_user_meta( $user_id, 'shipping_address_1', $order->shipping_address_1 );
            update_user_meta( $user_id, 'shipping_address_2', $order->shipping_address_2 );
            update_user_meta( $user_id, 'shipping_city', $order->shipping_city );
            update_user_meta( $user_id, 'shipping_company', $order->shipping_company );
            update_user_meta( $user_id, 'shipping_country', $order->shipping_country );
            update_user_meta( $user_id, 'shipping_first_name', $order->shipping_first_name );
            update_user_meta( $user_id, 'shipping_last_name', $order->shipping_last_name );
            update_user_meta( $user_id, 'shipping_method', $order->shipping_method );
            update_user_meta( $user_id, 'shipping_postcode', $order->shipping_postcode );
            update_user_meta( $user_id, 'shipping_state', $order->shipping_state );

            // Link past orders to this newly created customer
            wc_update_new_customer_past_orders( $user_id );
        }
    }  
}
add_action( 'woocommerce_thankyou', 'wc_register_guests', 10, 1 ); 

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad