প্রক্রিয়া 2 টি পদক্ষেপ জড়িত:
- সীমানা ফর্ম প্রদর্শন করুন
- জমা দেওয়ার তথ্য সংরক্ষণ করুন
এই সীমানাটি দেখানোর জন্য আমার মনে 3 টি ভিন্ন ভিন্ন দৃষ্টিভঙ্গি উপস্থিত রয়েছে:
- বিল্ট-ইন রেজিস্ট্রেশন ফর্ম, সম্পাদনা শৈলী ইত্যাদি ব্যবহার করুন এটি আরও "সামনের দিকে"
- একটি ওয়ার্ডপ্রেস পৃষ্ঠা / পোস্ট এবং একটি শর্টকোড ব্যবহার করে প্রদর্শন ফর্ম ব্যবহার করুন
- কোনও উত্সাহিত টেম্পলেট ব্যবহার করুন যা কোনও পৃষ্ঠা / পোস্টের সাথে সংযুক্ত নয়, তবে নির্দিষ্ট ইউআরএল দ্বারা কল করা হয়
এই উত্তরের জন্য আমি উত্তরটি ব্যবহার করব। কারণগুলি হ'ল:
- অন্তর্নির্মিত রেজিস্ট্রেশন ফর্ম ব্যবহার করা ভাল ধারণা হতে পারে, অন্তর্নির্মিত ফর্মটি ব্যবহার করে গভীর কাস্টমাইজেশন করা খুব কঠিন হতে পারে এবং কেউ যদি ফর্মের ক্ষেত্রগুলিও কাস্টমাইজ করতে চান তবে ব্যথা বাড়বে
- একটি শর্টকোডের সাথে একত্রে ওয়ার্ডপ্রেস পৃষ্ঠা ব্যবহার করুন, এটি নির্ভরযোগ্য নয় এবং আমিও মনে করি যে শরকডগুলি কেবল বিন্যাসকরণের জন্য এবং কার্যকারিতার জন্য ব্যবহার করা উচিত নয়
1: ইউআরএল তৈরি করুন
আমরা সকলেই জানি যে একটি ওয়ার্ডপ্রেস সাইটের ডিফল্ট রেজিস্ট্রেশন ফর্ম প্রায়শই স্প্যামারদের জন্য লক্ষ্য। একটি কাস্টম ইউআরএল ব্যবহার করা এই সমস্যাটি সমাধানে সহায়তা। তদতিরিক্ত আমি একটি পরিবর্তনশীল ইউআরএলও ব্যবহার করতে চাই , অর্থাত রেজিস্ট্রেশন ফর্ম ইউআরএল সবসময় একই হওয়া উচিত নয়, এটি স্প্যামারদের জীবনকে আরও শক্ত করে তোলে। কৌতুকটি ইউআরএল-তে একটি ননস ব্যবহার করে করা হয়েছে :
/**
* Generate dynamic registration url
*/
function custom_registration_url() {
$nonce = urlencode( wp_create_nonce( 'registration_url' ) );
return home_url( $nonce );
}
/**
* Generate dynamic registration link
*/
function custom_registration_link() {
$format = '<a href="%s">%s</a>';
printf(
$format,
custom_registration_url(), __( 'Register', 'custom_reg_form' )
);
}
এই ফাংশনগুলি ব্যবহার করে টেমপ্লেটগুলিতে রেজিস্ট্রেশন ফর্মের একটি লিঙ্কটি গতিশীল হলেও প্রদর্শন করা সহজ।
2: Custom_Reg\Custom_Reg
ক্লাসের প্রথম স্টাব ইউআরএল সনাক্ত করুন
এখন আমাদের ইউআরএল চিনতে হবে। Theালাইয়ের জন্য আমি একটি ক্লাস লিখতে শুরু করব, যা উত্তরে পরে শেষ হবে:
<?php
// don't save, just a stub
namespace Custom_Reg;
class Custom_Reg {
function checkUrl() {
$url_part = $this->getUrl();
$nonce = urlencode( wp_create_nonce( 'registration_url' ) );
if ( ( $url_part === $nonce ) ) {
// do nothing if registration is not allowed or user logged
if ( is_user_logged_in() || ! get_option('users_can_register') ) {
wp_safe_redirect( home_url() );
exit();
}
return TRUE;
}
}
protected function getUrl() {
$home_path = trim( parse_url( home_url(), PHP_URL_PATH ), '/' );
$relative = trim(str_replace($home_path, '', esc_url(add_query_arg(array()))), '/');
$parts = explode( '/', $relative );
if ( ! empty( $parts ) && ! isset( $parts[1] ) ) {
return $parts[0];
}
}
}
ফাংশনটির পরে ইউআরএলটির প্রথম অংশটি দেখুন home_url()
এবং এটি যদি আমাদের ননসের সাথে মেলে তবে এটি সত্য হয়। এই ফাংশনটি আমাদের অনুরোধ পরীক্ষা করতে এবং আমাদের ফর্মটি প্রদর্শনের জন্য প্রয়োজনীয় ক্রিয়া সম্পাদন করতে ব্যবহৃত হবে।
3: Custom_Reg\Form
ক্লাস
আমি এখন একটি ক্লাস লিখব, এটি ফর্ম মার্কআপ উত্পন্ন করার জন্য দায়বদ্ধ হবে। ফর্মটি প্রদর্শনের জন্য টেমপ্লেট ফাইলের পাথ যে কোনও টেমপ্লেট ফাইলের পাথে সংরক্ষণ করতে আমি এটি ব্যবহার করব।
<?php
// file: Form.php
namespace Custom_Reg;
class Form {
protected $fields;
protected $verb = 'POST';
protected $template;
protected $form;
public function __construct() {
$this->fields = new \ArrayIterator();
}
public function create() {
do_action( 'custom_reg_form_create', $this );
$form = $this->open();
$it = $this->getFields();
$it->rewind();
while( $it->valid() ) {
$field = $it->current();
if ( ! $field instanceof FieldInterface ) {
throw new \DomainException( "Invalid field" );
}
$form .= $field->create() . PHP_EOL;
$it->next();
}
do_action( 'custom_reg_form_after_fields', $this );
$form .= $this->close();
$this->form = $form;
add_action( 'custom_registration_form', array( $this, 'output' ), 0 );
}
public function output() {
unset( $GLOBALS['wp_filters']['custom_registration_form'] );
if ( ! empty( $this->form ) ) {
echo $this->form;
}
}
public function getTemplate() {
return $this->template;
}
public function setTemplate( $template ) {
if ( ! is_string( $template ) ) {
throw new \InvalidArgumentException( "Invalid template" );
}
$this->template = $template;
}
public function addField( FieldInterface $field ) {
$hook = 'custom_reg_form_create';
if ( did_action( $hook ) && current_filter() !== $hook ) {
throw new \BadMethodCallException( "Add fields before {$hook} is fired" );
}
$this->getFields()->append( $field );
}
public function getFields() {
return $this->fields;
}
public function getVerb() {
return $this->verb;
}
public function setVerb( $verb ) {
if ( ! is_string( $verb) ) {
throw new \InvalidArgumentException( "Invalid verb" );
}
$verb = strtoupper($verb);
if ( in_array($verb, array( 'GET', 'POST' ) ) ) $this->verb = $verb;
}
protected function open() {
$out = sprintf( '<form id="custom_reg_form" method="%s">', $this->verb ) . PHP_EOL;
$nonce = '<input type="hidden" name="_n" value="%s" />';
$out .= sprintf( $nonce, wp_create_nonce( 'custom_reg_form_nonce' ) ) . PHP_EOL;
$identity = '<input type="hidden" name="custom_reg_form" value="%s" />';
$out .= sprintf( $identity, __CLASS__ ) . PHP_EOL;
return $out;
}
protected function close() {
$submit = __('Register', 'custom_reg_form');
$out = sprintf( '<input type="submit" value="%s" />', $submit );
$out .= '</form>';
return $out;
}
}
ক্লাসটি সমস্ত ক্ষেত্রের ফর্ম মার্কআপ লুপিং উত্পন্ন করে create
তাদের প্রতিটিটিতে কল করার পদ্ধতি যুক্ত করে। প্রতিটি ক্ষেত্রের উদাহরণ হতে হবে Custom_Reg\FieldInterface
। ননস যাচাইয়ের জন্য একটি অতিরিক্ত লুকানো ক্ষেত্র যুক্ত করা হয়েছে। ফর্ম পদ্ধতিটি ডিফল্টরূপে 'পোস্ট' হয় তবে setVerb
পদ্ধতিটি ব্যবহার করে এটি 'জিইটি' তে সেট করা যায় । একবার তৈরি হয়ে গেলে মার্কআপটি $form
অবজেক্ট প্রোপার্টিটির ভিতরে সংরক্ষণ করা হয় যা output()
পদ্ধতি অনুসারে প্রতিধ্বনিত হয় , 'custom_registration_form'
হুকের মধ্যে আবদ্ধ হয়: ফর্ম টেম্পলেটে, কলটি কেবল do_action( 'custom_registration_form' )
ফর্মটিকে আউটপুট দেয়।
4: ডিফল্ট টেম্পলেট
যেমনটি আমি বলেছিলাম যে ফর্মের জন্য টেমপ্লেটটি সহজেই ওভাররাইড করা যায়, তবে ফ্যালব্যাক হিসাবে আমাদের একটি প্রাথমিক টেম্পলেট প্রয়োজন। আমি এখানে একটি খুব রুক্ষ টেম্পলেট লিখেছি, একটি বাস্তব টেমপ্লেটের চেয়ে ধারণার প্রমাণ।
<?php
// file: default_form_template.php
get_header();
global $custom_reg_form_done, $custom_reg_form_error;
if ( isset( $custom_reg_form_done ) && $custom_reg_form_done ) {
echo '<p class="success">';
_e(
'Thank you, your registration was submitted, check your email.',
'custom_reg_form'
);
echo '</p>';
} else {
if ( $custom_reg_form_error ) {
echo '<p class="error">' . $custom_reg_form_error . '</p>';
}
do_action( 'custom_registration_form' );
}
get_footer();
5: Custom_Reg\FieldInterface
ইন্টারফেস
প্রতিটি ক্ষেত্রের এমন একটি বস্তু হওয়া উচিত যা নিম্নলিখিত ইন্টারফেসটি প্রয়োগ করে
<?php
// file: FieldInterface.php
namespace Custom_Reg;
interface FieldInterface {
/**
* Return the field id, used to name the request value and for the 'name' param of
* html input field
*/
public function getId();
/**
* Return the filter constant that must be used with
* filter_input so get the value from request
*/
public function getFilter();
/**
* Return true if the used value passed as argument should be accepted, false if not
*/
public function isValid( $value = NULL );
/**
* Return true if field is required, false if not
*/
public function isRequired();
/**
* Return the field input markup. The 'name' param must be output
* according to getId()
*/
public function create( $value = '');
}
আমি মনে করি যে মন্তব্যগুলি এই ইন্টারফেসটি বাস্তবায়নকারী শ্রেণীর কী করা উচিত তা ব্যাখ্যা করে।
6: কিছু ক্ষেত্র যুক্ত করা
এখন আমাদের কিছু ক্ষেত্র দরকার। আমরা ফিল্ডস.এফপি নামে একটি ফাইল তৈরি করতে পারি যেখানে আমরা ক্ষেত্রের ক্লাসগুলি সংজ্ঞায়িত করি:
<?php
// file: fields.php
namespace Custom_Reg;
abstract class BaseField implements FieldInterface {
protected function getType() {
return isset( $this->type ) ? $this->type : 'text';
}
protected function getClass() {
$type = $this->getType();
if ( ! empty($type) ) return "{$type}-field";
}
public function getFilter() {
return FILTER_SANITIZE_STRING;
}
public function isRequired() {
return isset( $this->required ) ? $this->required : FALSE;
}
public function isValid( $value = NULL ) {
if ( $this->isRequired() ) {
return $value != '';
}
return TRUE;
}
public function create( $value = '' ) {
$label = '<p><label>' . $this->getLabel() . '</label>';
$format = '<input type="%s" name="%s" value="%s" class="%s"%s /></p>';
$required = $this->isRequired() ? ' required' : '';
return $label . sprintf(
$format,
$this->getType(), $this->getId(), $value, $this->getClass(), $required
);
}
abstract function getLabel();
}
class FullName extends BaseField {
protected $required = TRUE;
public function getID() {
return 'fullname';
}
public function getLabel() {
return __( 'Full Name', 'custom_reg_form' );
}
}
class Login extends BaseField {
protected $required = TRUE;
public function getID() {
return 'login';
}
public function getLabel() {
return __( 'Username', 'custom_reg_form' );
}
}
class Email extends BaseField {
protected $type = 'email';
public function getID() {
return 'email';
}
public function getLabel() {
return __( 'Email', 'custom_reg_form' );
}
public function isValid( $value = NULL ) {
return ! empty( $value ) && filter_var( $value, FILTER_VALIDATE_EMAIL );
}
}
class Country extends BaseField {
protected $required = FALSE;
public function getID() {
return 'country';
}
public function getLabel() {
return __( 'Country', 'custom_reg_form' );
}
}
আমি ডিফল্ট ইন্টারফেস বাস্তবায়ন সংজ্ঞায়িত করতে একটি বেস শ্রেণি ব্যবহার করেছি, তবে যে কেউ খুব ইন্টারফেস ক্ষেত্র যুক্ত করতে পারে সরাসরি ইন্টারফেস প্রয়োগ করে বা বেস শ্রেণি প্রসারিত করে এবং কিছু পদ্ধতি ওভাররাইড করে।
এই মুহুর্তে আমাদের কাছে ফর্মটি প্রদর্শন করার জন্য সমস্ত কিছু রয়েছে, এখন ক্ষেত্রগুলি বৈধকরণ এবং সংরক্ষণ করার জন্য আমাদের কিছু দরকার।
7: Custom_Reg\Saver
ক্লাস
<?php
// file: Saver.php
namespace Custom_Reg;
class Saver {
protected $fields;
protected $user = array( 'user_login' => NULL, 'user_email' => NULL );
protected $meta = array();
protected $error;
public function setFields( \ArrayIterator $fields ) {
$this->fields = $fields;
}
/**
* validate all the fields
*/
public function validate() {
// if registration is not allowed return false
if ( ! get_option('users_can_register') ) return FALSE;
// if no fields are setted return FALSE
if ( ! $this->getFields() instanceof \ArrayIterator ) return FALSE;
// first check nonce
$nonce = $this->getValue( '_n' );
if ( $nonce !== wp_create_nonce( 'custom_reg_form_nonce' ) ) return FALSE;
// then check all fields
$it = $this->getFields();
while( $it->valid() ) {
$field = $it->current();
$key = $field->getID();
if ( ! $field instanceof FieldInterface ) {
throw new \DomainException( "Invalid field" );
}
$value = $this->getValue( $key, $field->getFilter() );
if ( $field->isRequired() && empty($value) ) {
$this->error = sprintf( __('%s is required', 'custom_reg_form' ), $key );
return FALSE;
}
if ( ! $field->isValid( $value ) ) {
$this->error = sprintf( __('%s is not valid', 'custom_reg_form' ), $key );
return FALSE;
}
if ( in_array( "user_{$key}", array_keys($this->user) ) ) {
$this->user["user_{$key}"] = $value;
} else {
$this->meta[$key] = $value;
}
$it->next();
}
return TRUE;
}
/**
* Save the user using core register_new_user that handle username and email check
* and also sending email to new user
* in addition save all other custom data in user meta
*
* @see register_new_user()
*/
public function save() {
// if registration is not allowed return false
if ( ! get_option('users_can_register') ) return FALSE;
// check mandatory fields
if ( ! isset($this->user['user_login']) || ! isset($this->user['user_email']) ) {
return false;
}
$user = register_new_user( $this->user['user_login'], $this->user['user_email'] );
if ( is_numeric($user) ) {
if ( ! update_user_meta( $user, 'custom_data', $this->meta ) ) {
wp_delete_user($user);
return FALSE;
}
return TRUE;
} elseif ( is_wp_error( $user ) ) {
$this->error = $user->get_error_message();
}
return FALSE;
}
public function getValue( $var, $filter = FILTER_SANITIZE_STRING ) {
if ( ! is_string($var) ) {
throw new \InvalidArgumentException( "Invalid value" );
}
$method = strtoupper( filter_input( INPUT_SERVER, 'REQUEST_METHOD' ) );
$type = $method === 'GET' ? INPUT_GET : INPUT_POST;
$val = filter_input( $type, $var, $filter );
return $val;
}
public function getFields() {
return $this->fields;
}
public function getErrorMessage() {
return $this->error;
}
}
এই শ্রেণীর ২ টি প্রধান পদ্ধতি রয়েছে, একটি ( validate
) যা ক্ষেত্রগুলি লুপ করে, তাদের বৈধ করে দেয় এবং একটি ভাল অ্যারে ভাল ডেটা সংরক্ষণ করে, দ্বিতীয় ( save
) ডাটাবেসে সমস্ত ডেটা সংরক্ষণ করে এবং নতুন ব্যবহারকারীর কাছে ইমেলের মাধ্যমে পাসওয়ার্ড প্রেরণ করে।
8: সংজ্ঞায়িত শ্রেণীর ব্যবহার হচ্ছে: শেষ হচ্ছে Custom_Reg
বর্গ
এখন আমরা Custom_Reg
ক্লাসে আবার কাজ করতে পারি , সেই পদ্ধতিগুলি যুক্ত করে যা বস্তুর সংজ্ঞা দেয় এবং তাদেরকে কাজ করে তোলে make
<?php
// file Custom_Reg.php
namespace Custom_Reg;
class Custom_Reg {
protected $form;
protected $saver;
function __construct( Form $form, Saver $saver ) {
$this->form = $form;
$this->saver = $saver;
}
/**
* Check if the url to recognize is the one for the registration form page
*/
function checkUrl() {
$url_part = $this->getUrl();
$nonce = urlencode( wp_create_nonce( 'registration_url' ) );
if ( ( $url_part === $nonce ) ) {
// do nothing if registration is not allowed or user logged
if ( is_user_logged_in() || ! get_option('users_can_register') ) {
wp_safe_redirect( home_url() );
exit();
}
return TRUE;
}
}
/**
* Init the form, if submitted validate and save, if not just display it
*/
function init() {
if ( $this->checkUrl() !== TRUE ) return;
do_action( 'custom_reg_form_init', $this->form );
if ( $this->isSubmitted() ) {
$this->save();
}
// don't need to create form if already saved
if ( ! isset( $custom_reg_form_done ) || ! $custom_reg_form_done ) {
$this->form->create();
}
load_template( $this->getTemplate() );
exit();
}
protected function save() {
global $custom_reg_form_error;
$this->saver->setFields( $this->form->getFields() );
if ( $this->saver->validate() === TRUE ) { // validate?
if ( $this->saver->save() ) { // saved?
global $custom_reg_form_done;
$custom_reg_form_done = TRUE;
} else { // saving error
$err = $this->saver->getErrorMessage();
$custom_reg_form_error = $err ? : __( 'Error on save.', 'custom_reg_form' );
}
} else { // validation error
$custom_reg_form_error = $this->saver->getErrorMessage();
}
}
protected function isSubmitted() {
$type = $this->form->getVerb() === 'GET' ? INPUT_GET : INPUT_POST;
$sub = filter_input( $type, 'custom_reg_form', FILTER_SANITIZE_STRING );
return ( ! empty( $sub ) && $sub === get_class( $this->form ) );
}
protected function getTemplate() {
$base = $this->form->getTemplate() ? : FALSE;
$template = FALSE;
$default = dirname( __FILE__ ) . '/default_form_template.php';
if ( ! empty( $base ) ) {
$template = locate_template( $base );
}
return $template ? : $default;
}
protected function getUrl() {
$home_path = trim( parse_url( home_url(), PHP_URL_PATH ), '/' );
$relative = trim( str_replace( $home_path, '', add_query_arg( array() ) ), '/' );
$parts = explode( '/', $relative );
if ( ! empty( $parts ) && ! isset( $parts[1] ) ) {
return $parts[0];
}
}
}
শ্রেণীর নির্মাতা একটি উদাহরণ Form
এবং একটি গ্রহণ করে Saver
।
init()
পদ্ধতিটি (ব্যবহার করে checkUrl()
) এর পরে ইউআরএলটির প্রথম অংশটি দেখুন home_url()
, এবং যদি এটি সঠিক ননসটির সাথে মিলে যায় তবে এটি ফর্মটি ইতিমধ্যে জমা দেওয়া হয়েছে কিনা তা পরীক্ষা করে, যদি Saver
বস্তুর ব্যবহার করে এটি ব্যবহারযোগ্যতা যাচাই করে সংরক্ষণ করে, অন্যথায় কেবল ফর্মটি মুদ্রণ করে ।
init()
পদ্ধতিটি 'custom_reg_form_init'
ফর্ম উদাহরণটিকে আর্গুমেন্ট হিসাবে পাস করে অ্যাকশন হুককেও অগ্নিসংযোগ করে : এই হুকটি ক্ষেত্রগুলি যুক্ত করতে, কাস্টম টেমপ্লেট সেটআপ করতে এবং ফর্ম পদ্ধতিটি কাস্টমাইজ করার জন্য ব্যবহার করা উচিত।
9: জিনিস একসাথে রাখা
এখন আমাদের মূল প্লাগইন ফাইলটি লিখতে হবে, যেখানে আমরা পারি
- সমস্ত ফাইলের প্রয়োজন
- টেক্সটডোমেন লোড করুন
- যুক্তিসঙ্গত প্রথম দিকের হুক ব্যবহার করে তাত্ক্ষণিক
Custom_Reg
ক্লাস এবং কল init()
পদ্ধতিটি ব্যবহার করে সম্পূর্ণ প্রক্রিয়া শুরু করুন
- ক্ষেত্রগুলি ক্লাসে যুক্ত করতে 'কাস্টম_রেগ_ফর্ম_আইনিট' ব্যবহার করুন
তাই:
<?php
/**
* Plugin Name: Custom Registration Form
* Description: Just a rough plugin example to answer a WPSE question
* Plugin URI: https://wordpress.stackexchange.com/questions/10309/
* Author: G. M.
* Author URI: https://wordpress.stackexchange.com/users/35541/g-m
*
*/
if ( is_admin() ) return; // this plugin is all about frontend
load_plugin_textdomain(
'custom_reg_form',
FALSE,
plugin_dir_path( __FILE__ ) . 'langs'
);
require_once plugin_dir_path( __FILE__ ) . 'FieldInterface.php';
require_once plugin_dir_path( __FILE__ ) . 'fields.php';
require_once plugin_dir_path( __FILE__ ) . 'Form.php';
require_once plugin_dir_path( __FILE__ ) . 'Saver.php';
require_once plugin_dir_path( __FILE__ ) . 'CustomReg.php';
/**
* Generate dynamic registration url
*/
function custom_registration_url() {
$nonce = urlencode( wp_create_nonce( 'registration_url' ) );
return home_url( $nonce );
}
/**
* Generate dynamic registration link
*/
function custom_registration_link() {
$format = '<a href="%s">%s</a>';
printf(
$format,
custom_registration_url(), __( 'Register', 'custom_reg_form' )
);
}
/**
* Setup, show and save the form
*/
add_action( 'wp_loaded', function() {
try {
$form = new Custom_Reg\Form;
$saver = new Custom_Reg\Saver;
$custom_reg = new Custom_Reg\Custom_Reg( $form, $saver );
$custom_reg->init();
} catch ( Exception $e ) {
if ( defined('WP_DEBUG') && WP_DEBUG ) {
$msg = 'Exception on ' . __FUNCTION__;
$msg .= ', Type: ' . get_class( $e ) . ', Message: ';
$msg .= $e->getMessage() ? : 'Unknown error';
error_log( $msg );
}
wp_safe_redirect( home_url() );
}
}, 0 );
/**
* Add fields to form
*/
add_action( 'custom_reg_form_init', function( $form ) {
$classes = array(
'Custom_Reg\FullName',
'Custom_Reg\Login',
'Custom_Reg\Email',
'Custom_Reg\Country'
);
foreach ( $classes as $class ) {
$form->addField( new $class );
}
}, 1 );
10: কর্মগুলি হারিয়েছে
এখন চিরকালীন কাজটি বেশ সুন্দর। আমাদের কেবলমাত্র টেমপ্লেটটি কাস্টমাইজ করতে হবে, সম্ভবত আমাদের থিমটিতে একটি কাস্টম টেম্পলেট ফাইল যুক্ত করুন।
আমরা কেবলমাত্র কাস্টম নিবন্ধকরণ পৃষ্ঠায় নির্দিষ্ট স্টাইল এবং স্ক্রিপ্টগুলি যুক্ত করতে পারি
add_action( 'wp_enqueue_scripts', function() {
// if not on custom registration form do nothing
if ( did_action('custom_reg_form_init') ) {
wp_enqueue_style( ... );
wp_enqueue_script( ... );
}
});
এই পদ্ধতিটি ব্যবহার করে আমরা ক্লায়েন্ট সাইডের বৈধতা হ্যান্ডেল করতে কিছু জেএস স্ক্রিপ্টগুলি সজ্জিত করতে পারি, যেমন এটি একটি । স্ক্রিপ্টের কাজটি করার জন্য প্রয়োজনীয় মার্কআপটি Custom_Reg\BaseField
ক্লাস সম্পাদনা করে সহজেই পরিচালনা করা যায় ।
আমরা যদি নিবন্ধকরণ ইমেলটি কাস্টমাইজ করতে চাই, আমরা স্ট্যান্ডার্ড পদ্ধতিটি ব্যবহার করতে পারি এবং মেটাতে কাস্টম ডেটা সংরক্ষণ করে রাখতে পারি, আমরা সেগুলি ইমেলটিতে ব্যবহার করতে পারি।
আমরা সম্ভবত প্রয়োগ করতে চাই শেষ কাজটি হ'ল ডিফল্ট রেজিস্ট্রেশন ফর্মের অনুরোধ রোধ করা সহজ,
add_action( 'login_form_register', function() { exit(); } );
সমস্ত ফাইলগুলি এখানে একটি সংক্ষেপে পাওয়া যাবে ।