Woocommerce ရဲ့ my-account registration form မှာ email မလိုပဲ register လုပ်လို့ရအောင် ဘယ်လိုလုပ်မလဲ?

Woocommerce ရဲ့ my-account registration form မှာ email မလိုပဲ register လုပ်လို့ရအောင် ဘယ်လိုလုပ်မလဲ?

Screenshot from 2021 06 19 17 42 13 e1624101899369

WordPress ရဲ့ user registration က email ကို base လုပ်ပါတယ်။ email နဲ့မှ register လုပ်လို့ရပါတယ်။ ဒါပေမယ့် မြန်မာနိုင်ငံကလူတွေတော်တော်များများက ကိုယ့် email ကိုယ် မသိကြဘူး။ သိရင်လည်း ဘယ်လိုသုံးရမလဲမသိကြဘူး။ password တွေလည်း မသိကြဘူး။ ဒီတော့ register form မှာ email requirement နဲ့ဆိုတော့ တော်တော်များများက registration အဆင့်မှာတင် တိုင်ပတ်ကုန်ကြရော။ အခုပြောမှာကတော့ woocommerce ရဲ့ default register form ဖြစ်တဲ့ my-account page မှာ email မပါဘဲ ဒါမှမဟုတ် email ကို required field အနေနဲ့မဟုတ်ဘဲ register လုပ်လို့ရအောင် ဖန်တီးဖို့ ဖြစ်ပါတယ်။ အခုကျတော်ပြောတာတွေ လိုက်လုပ်နိုင်ဖို့ html နဲ့ php အခြေခံ သိရှိထားဖို့ လိုပါတယ်။ နောက်ပြီး wordpress ရဲ့ action hook အကြောင်း နည်းနည်းပါပါး နားလည်ထားရင် ပိုအဆင်ပြေပါမယ်။

အဆင့် ၁။ form အသစ်ရေးခြင်း။

My-account register form က woocommerce plugin folder ရဲ့ templates\myaccount\form-login.php file ဖြစ်ပါတယ်။ ဒီ file ကို copy ကူးပြီး child-theme folder ရဲ့ woocommerce\myaccount folder မှာ form-login.php မှာ ဖိုင်အသစ်တစ်ခု ပြုလုပ်ပါ။ Hosting Cpanel ကနေသွားလို့ရသလို ftp ကနေ လုပ်ရင်လည်း ရပါတယ်။

Screenshot from 2021 06 19 16 30 08

Source file path ကတော့ /wp-content/plugins/woocommerce/templates/myaccount/form-login.php ဖြစ်ပြီးတော့ သွားကူးထည့်ရမယ့် folder ကတော့ /wp-content/themes/your-child-theme/woocommerce/my-account folder ဖြစ်ပါတယ်။ Main theme folder မှာ ကူးထည့်ရင်လည်း ရပေမယ့် Theme ကို update လုပ်တဲ့အခါ ကိုယ်ရေးထားတာတွေ ပျောက်ကုန်မှာစိုးတဲ့အတွက် Child theme မှာ ရေးရတာပါ။

မှတ်ချက်။ Main theme ကိုယ်တိုင်က form-login.php ကို override လုပ်ထားရင် main theme ရဲ့ form-login ကို copy ကူးပါ။

အသစ်လုပ်တဲ့ ဖိုင်ရဲ့ email input မှာ required attribute ကို ဖြုတ်ပါ။ Email ကိုလုံးဝမပေါ်စေချင်ရင် input field တစ်ခုလုံးကို ဖျက်ပစ်လိုက်လို့ရပါတယ်။တစ်ခု သတိထားရမှာက form-login.php မှာက login form ရော register form ရော ၂ ခုလုံးပါတာမို့ register form အပိုင်းကိုပဲ ပြင်ရမှာ ဖြစ်ပါတယ်။ ဒီနေရာမှာ ကိုယ်က registration လုပ်တဲ့အချိန် ကိုယ်ထည့်စေချင်တဲ့ field ရှိရင်လည်း ကိုယ့်စိတ်ကြိုက်ပြင်လို့ရပါတယ်။ အသစ်ထည့်တဲ့ field တွေအတွက် database မှာ ရေးဖို့ backend form action php ကိုတော့ ပြင်ရေးရမှာပေါ့လေ။

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

Woocommerce form-login.php version 4.1.0 ရဲ့ line နံပါတ် 85 ကနေ 88 အထိကို အထက်မှာ ပြပေးတဲ့ code နဲ့ အစားထိုးရေးပေးပါ။ version 4.1.0 ရဲ့ form မှာ Email field က required attribute ထည့်မထားဘဲ label မှာပဲ * required သင်္ကေတပြထားတဲ့အတွက် မပြင်ချင်လည်း ရပါတယ်။

အဆင့် ၂။ default form submit action ကို ပယ်ဖျက်ခြင်း။

Woocommerce registration form submit လုပ်ရင် run တဲ့ php code က woocommerce folder ရဲ့ includes\class-wc-form-handler.php file ထဲက process_registration ဆိုတဲ့ function ပါ။ ဒီ function ကို hook လုပ်တဲ့ action ကတော့ wordpress ရဲ့ wp_loaded ဆိုတဲ့ action hook မှာ ဖြစ်ပါတယ်။ဒီ function ကို run တဲ့ action မှာ unhook လုပ်ပေးဖို့ functions.php မှာ အောက်က code ကို ရေးပေးရပါမယ်။

function unhook_process_registration() {
	remove_action( 'wp_loaded', arrar( 'WC_Form_Handler', 'process_registration' ), 20 );
}
action( 'init', 'unhook_process_registration' );

ဒါဆိုရင် register form submit လုပ်လိုက်တဲ့ အခါ ဘာ action မှ မ run တော့ဘဲ register form ကြီးပဲ ပြန်ပြနေမှာပါ။ အဲ့တော့ နောက်တစ်ဆင့် custom process_registration ထည့်ပြီး မူလ action hook မှာ ထည့်တာရေးပါမယ်။

အဆင့် ၃။ Custom function ရေးခြင်း

custom process_registration Function ကို wp_loaded action မှာ hook လုပ်ဖို့ functions.php မှာ အောက်ကအတိုင်းရေး ပေးပါ။

add_action( 'wp_loaded', 'custom_process_registration', 20 );
function custom_process_registration() {
	// TODO: custom code to be added
}

ဒါဆိုရင် form submit လုပ်လိုက်ရင် ကိုယ့် function ကိုပဲ run မှာ ဖြစ်ပါတယ်။

အဆင့် ၄။ code copy ယူခြင်း။

ကျွန်တော်တို့ အဓိက replace လုပ်ချင်တာ ဒီ process_registration ဆိုတဲ့ function မဟုတ်ပါဘူး။ဒီ function ထဲမှာ run တဲ့ wc_create_new_customer ဆိုတဲ့ function ဖြစ်ပါတယ်။ ဒါကြောင့် woocommerce folder ထဲက includes\class-wc-form-handler.php ဖိုင်ထဲက process_registration ဆိုတဲ့ function body တစ်ခုလုံးကို အသစ်လုပ်ခဲ့တဲ့ custom_process_registration ဆိုတဲ့ function မှာ copy ကူးထည့်ပါ။တစ်ခုပဲပြင်ရမှာပါ။ အဲ့ထဲက wc_create_new_customer ဆိုတဲ့ နေရာမှာ custom_create_new_customer လို့ ပြင်ရမှာပါ။

function custom_process_registration() {
	$nonce_value = isset( $_POST['_wpnonce'] ) ? wp_unslash( $_POST['_wpnonce'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
	$nonce_value = isset( $_POST['woocommerce-register-nonce'] ) ? wp_unslash( $_POST['woocommerce-register-nonce'] ) : $nonce_value; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized

	if ( isset( $_POST['register'] ) && wp_verify_nonce( $nonce_value, 'woocommerce-register' ) ) {
		$username = 'no' === get_option( 'woocommerce_registration_generate_username' ) && isset( $_POST['username'] ) ? wp_unslash( $_POST['username'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
		$password = 'no' === get_option( 'woocommerce_registration_generate_password' ) && isset( $_POST['password'] ) ? $_POST['password'] : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash
		$email    = '';

		try {
			$validation_error  = new WP_Error();
			$validation_error  = apply_filters( 'woocommerce_process_registration_errors', $validation_error, $username, $password, $email );
			$validation_errors = $validation_error->get_error_messages();

			if ( 1 === count( $validation_errors ) ) {
				throw new Exception( $validation_error->get_error_message() );
			} elseif ( $validation_errors ) {
				foreach ( $validation_errors as $message ) {
					wc_add_notice( '<strong>' . __( 'Error:', 'woocommerce' ) . '</strong> ' . $message, 'error' );
				}
				throw new Exception();
			}

			$new_customer = custom_create_new_customer( wc_clean( $username ), $password );

			if ( is_wp_error( $new_customer ) ) {
				throw new Exception( $new_customer->get_error_message() );
			}

			if ( 'yes' === get_option( 'woocommerce_registration_generate_password' ) ) {
				wc_add_notice( __( 'Your account was created successfully and a password has been sent to your email address.', 'woocommerce' ) );
			} else {
				wc_add_notice( __( 'Your account was created successfully. Your login details have been sent to your email address.', 'woocommerce' ) );
			}

			// Only redirect after a forced login - otherwise output a success notice.
			if ( apply_filters( 'woocommerce_registration_auth_new_customer', true, $new_customer ) ) {
				wc_set_customer_auth_cookie( $new_customer );

				if ( ! empty( $_POST['redirect'] ) ) {
					$redirect = wp_sanitize_redirect( wp_unslash( $_POST['redirect'] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
				} elseif ( wc_get_raw_referer() ) {
					$redirect = wc_get_raw_referer();
				} else {
					$redirect = wc_get_page_permalink( 'myaccount' );
				}

				wp_redirect( wp_validate_redirect( apply_filters( 'woocommerce_registration_redirect', $redirect ), wc_get_page_permalink( 'myaccount' ) ) ); //phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect
				exit;
			}
		} catch ( Exception $e ) {
			if ( $e->getMessage() ) {
				wc_add_notice( '<strong>' . __( 'Error:', 'woocommerce' ) . '</strong> ' . $e->getMessage(), 'error' );
			}
		}
	}
}

အဆင့် ၅။ custom_create_new_customer

wc_create_new_user ဆိုတဲ့ function က woocommerce folder ရဲ့ includes\wc-user-functions.php ထဲမှာ ရှိပါတယ်။ ဒီ function ကို ကိုယ့်ရဲ့ functions.php မှာ copy ကူးထည့်ပြီး function name ကို custom_create_new_customer လို့ နာမည်ပြောင်းပါ။ပြီးရင် function ထဲက email validation လုပ်တဲ့ code တွေဖျက်ပစ်လိုက်ပါ။

function custom_create_new_customer( $username = '', $password = '', $args = array() ) {
	$username = sanitize_user( $username );

	if ( empty( $username ) || ! validate_username( $username ) ) {		return new WP_Error( 'registration-error-invalid-username', __( 'Please enter a valid account username.', 'woocommerce' ) );
	}

	if ( username_exists( $username ) ) {
		return new WP_Error( 'registration-error-username-exists', __( 'An account is already registered with that username. Please choose another.', 'woocommerce' ) );
	}

	// Handle password creation.
	$password_generated = false;
	if ( 'yes' === get_option( 'woocommerce_registration_generate_password' ) && empty( $password ) ) {
		$password           = wp_generate_password();
		$password_generated = true;
	}

	if ( empty( $password ) ) {
		return new WP_Error( 'registration-error-missing-password', __( 'Please enter an account password.', 'woocommerce' ) );
	}

	// Use WP_Error to handle registration errors.
	$errors = new WP_Error();

	do_action( 'woocommerce_register_post', $username, $email, $errors );

	$errors = apply_filters( 'woocommerce_registration_errors', $errors, $username, $email );

	if ( $errors->get_error_code() ) {
		return $errors;
	}

	$new_customer_data = apply_filters(
		'woocommerce_new_customer_data',
		array_merge(
			$args,
			array(
				'user_login' => $username,
				'user_pass'  => $password,
				'user_email' => $email,
				'role'       => 'customer',
			)
		)
	);

	$customer_id = wp_insert_user( $new_customer_data );

	if ( is_wp_error( $customer_id ) ) {
		return $customer_id;
	}

	do_action( 'woocommerce_created_customer', $customer_id, $new_customer_data, $password_generated );

	return $customer_id;
}

ဒါဆိုရင် email မပါပဲ registration လုပ်လို့ရသွားမှာ ဖြစ်ပါတယ်။ email မလိုဘူးဆိုတော့ username ကတော့ ပေးရမှာပေါ့။ ဒါကြောင့်မို့လို့ Woocommerce Account & Privacy setting မှာ automatically generate an account username for the customer ဆိုတာကို off ထားပေးဖို့ လိုပါမယ်။

Screenshot from 2021 06 19 17 34 46

ကျေးဇူးတင်ပါတယ်။

Pyae Sone Htoo

See all author post

Leave a Reply