Acceda al nombre del usuario en el correo de activación de la cuenta de WooCommerce (DOI a través de WooCommerce germanizado)

9 minutos de lectura

Tenemos una página de registro personalizada para nuestro sitio de WooCommerce que se basa en un código abreviado de Business Bloomer y agregó un campo de entrada para el nombre del usuario. El código dentro de nuestro functions.php se ve así:

/**
 * @snippet       WooCommerce User Registration Shortcode
 * @author        Rodolfo Melogli
 * @compatible    WooCommerce 3.6.5
 * @donate $9     https://businessbloomer.com/bloomer-armada/
 */

// THIS WILL CREATE A NEW SHORTCODE: [wc_reg_form_bbloomer]
add_shortcode('wc_reg_form_bbloomer', 'bbloomer_separate_registration_form');

function bbloomer_separate_registration_form()
{
    if (is_admin()) return;
    if (is_user_logged_in()) return;
    ob_start();

    // NOTE: THE FOLLOWING <FORM></FORM> IS COPIED FROM woocommerce\templates\myaccount\form-login.php
    // IF WOOCOMMERCE RELEASES AN UPDATE TO THAT TEMPLATE, YOU MUST CHANGE THIS ACCORDINGLY

?>

      <form method="post" class="woocommerce-form woocommerce-form-register register" <?php do_action('woocommerce_register_form_tag'); ?> >

            <?php do_action('woocommerce_register_form_start'); ?>

            <?php if ('no' === get_option('woocommerce_registration_generate_username')): ?>

                <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
                    <label for="reg_username"><?php esc_html_e('Username', 'woocommerce'); ?>&nbsp;<span class="required">*</span></label>
                    <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="username" id="reg_username" autocomplete="username" value="<?php echo (!empty($_POST['username'])) ? esc_attr(wp_unslash($_POST['username'])) : ''; ?>" /><?php // @codingStandardsIgnoreLine
         ?>
                </p>

            <?php
    endif; ?>

            <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
                <label for="reg_email"><?php esc_html_e('Email address', 'woocommerce'); ?>&nbsp;<span class="required">*</span></label>
                <input type="email" class="woocommerce-Input woocommerce-Input--text input-text" name="email" id="reg_email" autocomplete="email" value="<?php echo (!empty($_POST['email'])) ? esc_attr(wp_unslash($_POST['email'])) : ''; ?>" /><?php // @codingStandardsIgnoreLine
     ?>
            </p>

            <?php if ('no' === get_option('woocommerce_registration_generate_password')): ?>

                <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
                    <label for="reg_password"><?php esc_html_e('Password', 'woocommerce'); ?>&nbsp;<span class="required">*</span></label>
                    <input type="password" class="woocommerce-Input woocommerce-Input--text input-text" name="password" id="reg_password" autocomplete="new-password" />
                </p>

            <?php
    else: ?>

                <p><?php esc_html_e('A password will be sent to your email address.', 'woocommerce'); ?></p>

            <?php
    endif; ?>

            <?php do_action('woocommerce_register_form'); ?>

            <p class="woocommerce-FormRow form-row">
                <?php wp_nonce_field('woocommerce-register', 'woocommerce-register-nonce'); ?>
                <button type="submit" class="woocommerce-Button woocommerce-button button woocommerce-form-register__submit" name="register" value="<?php esc_attr_e('Register', 'woocommerce'); ?>"><?php esc_html_e('Register', 'woocommerce'); ?></button>
            </p>

            <?php do_action('woocommerce_register_form_end'); ?>

        </form>

   <?php
    return ob_get_clean();
}

/**
 * @snippet       Add First to Register Form - WooCommerce
 * @sourcecode    https://businessbloomer.com/?p=21974
 * @author        Rodolfo Melogli
 * @credits       Claudio SM Web
 * @compatible    WC 3.5.2
 * @donate $9     https://businessbloomer.com/bloomer-armada/
 */

///////////////////////////////
// 1. ADD FIELDS

add_action( 'woocommerce_register_form_start', 'bbloomer_add_name_woo_account_registration' );

function bbloomer_add_name_woo_account_registration() {
    ?>

    <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
    <label for="reg_billing_first_name"><?php _e( 'First name', 'woocommerce' ); ?> <span class="required">*</span></label>
    <input type="text" class="input-text" name="billing_first_name" id="reg_billing_first_name" value="<?php if ( ! empty( $_POST['billing_first_name'] ) ) esc_attr_e( $_POST['billing_first_name'] ); ?>" />
    </p>

    <div class="clear"></div>

    <?php
}

///////////////////////////////
// 2. VALIDATE FIELDS

add_filter( 'woocommerce_registration_errors', 'bbloomer_validate_name_fields', 10, 3 );

function bbloomer_validate_name_fields( $errors, $username, $email ) {
    if ( isset( $_POST['billing_first_name'] ) && empty( $_POST['billing_first_name'] ) ) {
        $errors->add( 'billing_first_name_error', __( '<strong>Achtung</strong>: Vorname ist ein Pflichtfeld!', 'woocommerce' ) );
    }
    return $errors;
}

///////////////////////////////
// 3. SAVE FIELDS

add_action( 'woocommerce_created_customer', 'bbloomer_save_name_fields' );

function bbloomer_save_name_fields( $customer_id ) {
    if ( isset( $_POST['billing_first_name'] ) ) {
        update_user_meta( $customer_id, 'billing_first_name', sanitize_text_field( $_POST['billing_first_name'] ) );
        update_user_meta( $customer_id, 'first_name', sanitize_text_field($_POST['billing_first_name']) );
    }

}

Dado que nuestro sitio tiene su sede en Alemania, utilizamos el complemento germanizado de WooCommerce con la funcionalidad DOI (doble suscripción). Entonces, un usuario recibe un correo de activación en el que debe hacer clic para activar la cuenta. Dentro del correo de activación queremos que tenga un sentimiento más personal, por lo que incluir el nombre de pila del usuario. Allí agregamos la plantilla de correo electrónico original de WooCommerce Germanized a nuestro tema secundario.

El problema es que el único valor al que puedo acceder (se muestra en el correo electrónico realmente entregado) es $user_login que devuelve el nombre de usuario creado automáticamente. ¿Cómo puedo acceder al nombre del usuario que se guarda como nombre y nombre de facturación? La plantilla dentro de nuestro tema hijo se ve así:

<?php
/**
 * Customer new account activation email.
 *
 * @see https://github.com/vendidero/woocommerce-germanized/wiki/Overriding-Germanized-Templates
 * @package Germanized/Templates
 * @version 1.6.4
 */
if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly
}

?>

<?php do_action( 'woocommerce_email_header', $email_heading, $email ); ?>

    <p><?php printf( __( 'Hi %s,', 'woocommerce' ), esc_html( $user_login ) ); ?></p>

    <p><?php printf( __( "Thanks for creating an account on %s. Please follow the activation link to activate your account:", 'woocommerce-germanized' ), esc_html( $blogname ) ); ?></p>

    <p><a class="wc-button button"
          href="https://stackoverflow.com/questions/60062120/<?php echo esc_url( $user_activation_url ); ?>"><?php _e( 'Activate your account', 'woocommerce-germanized' ); ?></a>
    </p>

<?php if ( get_option( 'woocommerce_registration_generate_password' ) == 'yes' && $password_generated ) : ?>

    <p><?php printf( __( "Your password has been automatically generated: <strong>%s</strong>", 'woocommerce-germanized' ), esc_html( $user_pass ) ); ?></p>

<?php endif; ?>

    <p style="font-size:75%;"><?php printf( __( "If you haven't created an account on %s please ignore this email.", "woocommerce-germanized" ), esc_html( $blogname ) ); ?></p>

    <p style="font-size:75%;"><?php printf( __( 'If you cannot follow the link above please copy this url and paste it to your browser bar: %s', 'woocommerce-germanized' ), esc_url( $user_activation_url ) ); ?></p>

<?php
/**
 * Show user-defined additional content - this is set in each email's settings.
 */
if ( $additional_content ) {
    echo wp_kses_post( wpautop( wptexturize( $additional_content ) ) );
}
?>

<?php do_action( 'woocommerce_email_footer', $email ); ?>

Ya traté de completar el primer nombre como se describe aquí (https://wordpress.org/support/topic/new-account-email-insert-first-name/) y para acceder a él a través de $user->display_name pero esto no funcionó.

También probé la solución provista aquí (Obtener metadatos de usuario del gancho woocommerce_created_customer en Woocommerce) para acceder al nombre a través del objeto Cliente. El código se vería así a continuación. Yo tampoco trabajé.

<p><?php $customer = new WC_Customer( $customer_id ); printf( __( 'Hi %s,', 'woocommerce' ), esc_html( $customer->get_first_name() ) ); ?></p>

¡Cualquier ayuda sería muy apreciada!

Primero necesitas encontrar al usuario. Supongo que no tiene acceso a la identificación de usuario, si lo tiene, puede omitir la primera línea e insertar la identificación de usuario en el punto apropiado.

Entonces necesitas obtener el primer nombre. de los metadatos. De acuerdo con su código, lo almacena en el campo de metadatos. 'billing_first_name'. Y luego es cuestión de insertarlo en tu correo electrónico.

<?php 

$the_user = get_user_by('login', $user_login);
$first_name = get_user_meta($the_user->ID, 'billing_first_name', true);

?>
<p><?php printf( __( 'Hi %s,', 'woocommerce' ), esc_html( $first_name ) ); ?></p>

En realidad, WooCommerce tiene esa plantilla por defecto, que incluye nombre de usuario, correo electrónico, URL de mi cuenta y mucho más, no creo que haya diferencia entre woc eng o grmn, excepto el idioma.

defined('ABSPATH') || exit;

do_action('woocommerce_email_header', $email_heading, $email); ?>

//To get user_name on registration you need to call get_user_by('id',$user_login); OR get_user_by('login',$user_login); OR get_user_by('user_name',$user_login);

$user = get_user_by('id',$user_login);
$first_name = get_user_meta($user,'first_name',true);

//and call like this

<p><?php printf(esc_html__('Hi %s,', 'woocommerce'), esc_html($first_name)); ?></p>
//translators: %s: Customer username 
<p><?php printf(esc_html__('Hi %s,', 'woocommerce'), esc_html( $user_login)); ?>
//translators: %1$s: Site title, %2$s: Username, %3$s: My account link

<p><?php printf(esc_html__('Thanks for creating an account on %1$s. Your username is %2$s. You can access your account area to view orders, change your password, and more at: %3$s', 'woocommerce'), esc_html($blogname), '<strong>' . esc_html( $user_login) . '</strong>', make_clickable(esc_url( wc_get_page_permalink('myaccount')))); 
?></p>

// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped 

<?php if ('yes' === get_option('woocommerce_registration_generate_password') && $password_generated) : ?>

//translators: %s: Auto generated password

    <p><?php printf(esc_html__('Your password has been automatically generated: %s', 'woocommerce'), '<strong>' . esc_html($user_pass) .'</strong>'); ?></p>
<?php endif; ?>

<?php
//Show user-defined additional content - this is set in each email's settings 

if ($additional_content) {
    echo wp_kses_post(wpautop( wptexturize( $additional_content)));
}

do_action('woocommerce_email_footer', $email);
?>

Aquí está la plantilla https://github.com/woocommerce/woocommerce/blob/master/templates/emails/customer-new-account.php

  • si uso <p><?php printf( __( 'Hi %s,', 'woocommerce' ), esc_html( $first_name ) ); ?></p> no muestra nada después de “Hola” en el correo

    – Niklas Buschner

    11 de febrero de 2020 a las 15:50

  • ¿Podrías cambiar esto? $first_name = get_user_meta($user,'first_name',true); a esto $first_name = get_user_meta($user,'billing_first_name',true); su llamada es billing_first_name

    usuario1805543

    11 de febrero de 2020 a las 15:56


  • Funciona con la solución sugerida por Tschallacka, así que supongo que también funcionará con el cambio sugerido. ¡Gracias!

    – Niklas Buschner

    11 de febrero de 2020 a las 16:02

obtener la información del usuario al iniciar sesión

$customer = get_user_by('login', $user_login);

y obtenga el nombre usando la identificación de usuario

$firstName = get_user_meta($customer->ID,'billing_first_name',true);

si el usuario no está registrado, entonces, puede usar este

esc_html( $firstName ) );

en vez de

esc_html( $customer->get_first_name() ) );

¿Ha sido útil esta solución?