programing

WooCommerce 계정 등록 메일에서 사용자 이름에 액세스합니다(독일어로 WooCommerce를 통한 DOI).

sourcejob 2023. 4. 4. 21:15
반응형

WooCommerce 계정 등록 메일에서 사용자 이름에 액세스합니다(독일어로 WooCommerce를 통한 DOI).

비즈니스 블루머 쇼트 코드를 기반으로 사용자 이름 입력 필드를 추가한 WooCommerce 사이트의 커스텀 등록 페이지가 있습니다.우리의 기능 안에 있는 코드입니다.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'); ?>&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']) );
    }

}

저희 사이트는 독일에 거점을 두고 있기 때문에 DOI(Double opt-in) 기능을 갖춘 WooCommerce 독일어판 플러그인을 사용하고 있습니다.따라서 사용자는 계정을 활성화하기 위해 클릭해야 하는 활성화 메일을 수신합니다.액티베이션 메일에는, 보다 개인적인 감정을 가지고, 유저의 이름을 포함시키고 싶다고 생각하고 있습니다.거기서, WooCommerce의 오리지날 E-메일 템플릿을, 독일어화한 아이 테마에 추가했습니다.

문제는 자동으로 생성된 사용자 이름을 반환하는 $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의 woocommerce_created_customer hook에서 사용자 메타데이터 가져오기)도 Customer 개체를 통해 이름에 액세스하려고 시도했습니다.그러면 코드는 다음과 같습니다.나도 일 안 했어.

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

어떤 도움이라도 주시면 대단히 감사하겠습니다!

먼저 사용자를 찾아야 합니다.사용자 ID에 액세스할 수 없는 경우 첫 번째 줄을 건너뛰고 적절한 지점에 user_id를 삽입할 수 있습니다.

그러면 메타 데이터에서 이름을 얻어야 합니다.코드에 따라 메타데이터 필드에 저장합니다.'billing_first_name'그리고 이메일에 삽입하는 것이 중요합니다.

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

사실 WooCommerce에는 사용자 이름, 이메일, myaccount url 등이 포함된 기본 템플릿이 있습니다.언어 이외에는 woc eng과 grmn의 차이는 없다고 생각합니다.

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

다음은 https://github.com/woocommerce/woocommerce/blob/master/templates/emails/customer-new-account.php 템플릿입니다.

로그인하여 사용자 정보를 취득하다

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

사용자 ID를 사용하여 이름을 가져옵니다.

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

사용자가 등록되지 않은 경우 이 기능을 사용할 수 있습니다.

esc_html( $firstName ) );

대신

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

언급URL : https://stackoverflow.com/questions/60062120/access-first-name-of-user-in-woocommerce-account-acitivation-mail-doi-via-wooco

반응형