Zugriff auf den Vornamen des Benutzers in der Aktivierungsmail des WooCommerce-Kontos (DOI über WooCommerce eingedeutscht)

Lesezeit: 9 Minuten

Wir haben eine benutzerdefinierte Registrierungsseite für unsere WooCommerce-Site, die auf einem Business Bloomer-Shortcode basiert und ein Eingabefeld für den Vornamen des Benutzers hinzugefügt hat. Der Code in unserer functions.php sieht so aus:

/**
 * @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']) );
    }

}

Da unsere Seite in Deutschland ansässig ist, verwenden wir das WooCommerce Germanized Plugin mit der DOI (Double Opt-In) Funktionalität. Ein Benutzer erhält also eine Aktivierungsmail, die er anklicken muss, um das Konto zu aktivieren. Innerhalb der Aktivierungsmail möchten wir ein persönlicheres Gefühl haben, also den Vornamen des Benutzers enthalten. Dort haben wir das originale E-Mail-Template von WooCommerce Germanized zu unserem Child-Theme hinzugefügt.

Das Problem ist, dass der einzige Wert, auf den ich zugreifen kann (wird in der tatsächlich zugestellten E-Mail angezeigt), $user_login ist die den automatisch erstellten Benutzernamen zurückgibt. Wie kann ich auf den Vornamen des Benutzers zugreifen, der als Vorname und Abrechnungsvorname gespeichert ist? Das Template innerhalb unseres Child-Themes sieht so aus:

<?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 ); ?>

Ich habe bereits versucht, den Vornamen wie hier beschrieben zu füllen (https://wordpress.org/support/topic/new-account-email-insert-first-name/) und über $user->display_name darauf zuzugreifen, aber das hat nicht funktioniert.

Ich habe auch die hier bereitgestellte Lösung ausprobiert (Get user meta data from woocommerce_created_customer hook in Woocommerce), um über das Kundenobjekt auf den Vornamen zuzugreifen. Der Code würde dann wie folgt aussehen. Ich habe auch nicht gearbeitet.

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

Jede Hilfe wäre sehr willkommen!

Zuerst müssen Sie den Benutzer finden. Ich nehme an, Sie haben keinen Zugriff auf die Benutzer-ID. Wenn Sie dies tun, können Sie die erste Zeile überspringen und die Benutzer-ID an der entsprechenden Stelle einfügen.

Dann müssen Sie den Vornamen erhalten aus den Metadaten. Entsprechend Ihrem Code hinterlegen Sie ihn im Metadatenfeld 'billing_first_name'. Und dann müssen Sie es in Ihre E-Mail einfügen.

<?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>

Tatsächlich hat WooCommerce diese Vorlage standardmäßig, die Benutzername, E-Mail, Myaccount-URL und vieles mehr enthält. Ich glaube nicht, dass es einen Unterschied zwischen woc eng oder grmn geben wird, außer der Sprache.

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);
?>

Hier ist die Vorlage https://github.com/woocommerce/woocommerce/blob/master/templates/emails/customer-new-account.php

  • Wenn ich benutze <p><?php printf( __( 'Hi %s,', 'woocommerce' ), esc_html( $first_name ) ); ?></p> es zeigt nichts nach „Hi“ in der Mail an

    – Niklas Buschner

    11. Februar 2020 um 15:50 Uhr

  • würdest du das bitte ändern $first_name = get_user_meta($user,'first_name',true); dazu $first_name = get_user_meta($user,'billing_first_name',true); Ihr Anruf ist billing_first_name

    Benutzer1805543

    11. Februar 2020 um 15:56 Uhr


  • Es funktioniert mit der von Tschallacka vorgeschlagenen Lösung, also denke ich, dass es auch mit Ihrer vorgeschlagenen Änderung funktionieren wird. Vielen Dank!

    – Niklas Buschner

    11. Februar 2020 um 16:02 Uhr

erhalten Sie die Benutzerinformationen, indem Sie sich anmelden

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

und erhalten Sie den Namen mit der Benutzer-ID

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

Wenn der Benutzer nicht registriert ist, können Sie dies verwenden

esc_html( $firstName ) );

anstelle von

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

1390760cookie-checkZugriff auf den Vornamen des Benutzers in der Aktivierungsmail des WooCommerce-Kontos (DOI über WooCommerce eingedeutscht)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy