У нас есть пользовательская страница регистрации для нашего сайта WooCommerce, основанная на шорткоде Business Bloomer и добавленная поле ввода для имени пользователя. Код в наших функциях. php выглядит следующим образом:
/**
* @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'); ?> <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'); ?> <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'); ?> <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']) );
}
}
Поскольку наш сайт базируется в Германии, мы используем германизированный плагин WooCommerce с функциональностью DOI (двойная подписка). Таким образом, пользователь получает письмо активации, по которому он должен щелкнуть, чтобы активировать учетную запись. В письме активации мы хотим иметь более личное чувство, таким образом, включив имя пользователя. Там мы добавили оригинальный шаблон электронной почты от WooCommerce Germanized к нашей дочерней теме.
Проблема в том, что единственное значение, к которому я могу получить доступ (отображается в фактически доставленном электронном письме), это $ user_login , который возвращает автоматически созданное имя пользователя. Как я могу получить доступ к имени пользователя, которое сохраняется как имя и имя биллинга. Шаблон в нашей дочерней теме выглядит следующим образом:
<?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="<?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 ); ?>
Я уже пытался заполнить имя, как описано здесь (https://wordpress.org/support/topic/new-account-email-insert-first-name/), и получить к нему доступ через $ user-> display_name, но это не сработало.
Я также попробовал решение, представленное здесь ( Получение метаданных пользователя из хука woocommerce_created_customer в Woocommerce ) для доступа к имени через объект Customer. Код будет выглядеть как показано ниже. Я тоже не работал.
<p><?php $customer = new WC_Customer( $customer_id ); printf( __( 'Hi %s,', 'woocommerce' ), esc_html( $customer->get_first_name() ) ); ?></p>
Любая помощь будет высоко оценена!