ওয়েবসাইটের সামনের প্রান্তে ওয়ার্ডপ্রেস ব্যবহারকারী নিবন্ধকরণ ফর্মটি কীভাবে প্রদর্শিত করবেন?


30

আমার ব্লগের সামনের প্রান্তে ওয়ার্ডপ্রেস ব্যবহারকারীর নিবন্ধকরণ ফর্মটি ("www.mywebsite.com/wp-register.php" পৃষ্ঠায় প্রদর্শিত ফর্মটি) কীভাবে প্রদর্শিত করবেন?

আমি নিবন্ধকরণ ফর্মটি কাস্টমাইজ করেছি। তবে কীভাবে ফর্মটিকে প্রথম প্রান্তে কল করবেন তা জানেন না। কোন সমর্থন সত্যিই দুর্দান্ত সাহায্য হবে।

আগাম ধন্যবাদ. :)



এই নিবন্ধটি কীভাবে আপনার নিজের ফ্রন্টএন্ড রেজিস্টার / লগইন / পাসওয়ার্ড ফর্মগুলি পুনরুদ্ধার করবেন তার একটি গ্রেট টিউটোরিয়াল সরবরাহ করে। -: বা আপনি খুঁজছেন তাহলে একটি প্লাগইন জন্য আমি আগে এই ব্যবহার করেছি এবং তাদের recomend করতে আয়াক্স প্রবেশ করুন / নিবন্ধন - লগইন Ajax সঙ্গে
Bainternet

কসমোলাবের ক্রিশ্চিয়ানের উত্স ফাইলগুলির সাথে একটি দুর্দান্ত টিউটোরিয়াল পোস্ট রয়েছে যা আপনাকে ফ্রন্ট-এন্ড ব্যবহারকারী প্রোফাইল, লগইন এবং রেজিস্টার টেমপ্লেট তৈরি করার ক্ষমতা দেয়।
ফিলিপ

উত্তর:


33

প্রক্রিয়া 2 টি পদক্ষেপ জড়িত:

  1. সীমানা ফর্ম প্রদর্শন করুন
  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(); } );

সমস্ত ফাইলগুলি এখানে একটি সংক্ষেপে পাওয়া যাবে


1
বাহ, এটি নিবন্ধকরণ কার্যকারিতার সম্পূর্ণ পুনরায় নকশা! যদি আপনি অন্তর্নির্মিত নিবন্ধকরণ প্রক্রিয়া সম্পূর্ণরূপে ওভাররাইড করতে চান তবে এটি সম্ভবত একটি ভাল সমাধান। আমি মনে করি অন্তর্নির্মিত রেজিস্ট্রেশন ফর্মটি ব্যবহার করা ভাল ধারণা নয় কারণ আপনি হারিয়ে যাওয়া পাসওয়ার্ড ফর্মের মতো অন্যান্য মূল বৈশিষ্ট্যগুলি আলগা করবেন। এবং তারপরে সদ্য সাইন ইন করার জন্য একজন সদ্য নিবন্ধিত ব্যবহারকারীর theতিহ্যবাহী ব্যাক-এন্ড লগইন ফর্মটি প্রদর্শন করতে হবে।
ফ্যাবিয়েন কোয়াটারভাক্স

1
@ ফ্যাবিইনক্যাট্রাভাক্স হারিয়ে যাওয়া পাসওয়ার্ড এবং লগইন ফর্মটি কেবল যথারীতি (ব্যাকএন্ড) ব্যবহার করা যেতে পারে। হ্যাঁ, কোড অসম্পূর্ণ কারণ হারিয়ে যাওয়া পাসওয়ার্ড এবং লগইন ফর্মটি পরিচালনা করা হয় না, তবে ওপি প্রশ্নটি কেবল নিবন্ধকরণ ফর্ম সম্পর্কে ছিল এবং উত্তর ইতিমধ্যে অন্যান্য কার্যকারিতা যুক্ত করার জন্য খুব দীর্ঘ ছিল ...
গাজাজাজেপ

13

TLDR; আপনার থিমের মধ্যে নিম্নলিখিত ফর্মটি রাখুন, nameএবং idবৈশিষ্ট্যগুলি গুরুত্বপূর্ণ:

<form action="<?php echo site_url('wp-login.php?action=register', 'login_post') ?>" method="post">
    <input type="text" name="user_login" value="Username" id="user_login" class="input" />
    <input type="text" name="user_email" value="E-Mail" id="user_email" class="input"  />
    <?php do_action('register_form'); ?>
    <input type="submit" value="Register" id="register" />
</form>

আমি স্ক্র্যাচ থেকে অভিনব ওয়ার্ডপ্রেস রেজিস্টার ফর্ম তৈরির উপর একটি দুর্দান্ত টুটস্প্লাস নিবন্ধ পেয়েছি । এটি ফর্মটি স্টাইল করার ক্ষেত্রে তার বেশিরভাগ সময় ব্যয় করে তবে প্রয়োজনীয় ওয়ার্ডপ্রেস কোডে নিম্নলিখিত মোটামুটি সহজ বিভাগ রয়েছে:

পদক্ষেপ 4. ওয়ার্ডপ্রেস

এখানে অভিনব কিছু নেই; আমাদের কেবল দুটি ওয়ার্ডপ্রেস স্নিপেটের দরকার, ডাব্লুপি-লগইন.এফপি ফাইলের মধ্যে লুকানো।

প্রথম স্নিপেট:

<?php echo site_url('wp-login.php?action=register', 'login_post') ?>  

এবং:

<?php do_action('register_form'); ?>

সম্পাদনা করুন: উপরের কোড স্নিপেটগুলি কোথায় রাখবেন তা বোঝাতে আমি নিবন্ধ থেকে অতিরিক্ত চূড়ান্ত বিট যুক্ত করেছি - এটি কেবল একটি ফর্ম যাতে এটি কোনও পৃষ্ঠার টেমপ্লেট বা সাইডবারে যেতে পারে বা এটির বাইরে একটি শর্টকোড তৈরি করতে পারে। গুরুত্বপূর্ণ বিভাগটি হ'ল formউপরের স্নিপেটস এবং গুরুত্বপূর্ণ প্রয়োজনীয় ক্ষেত্রগুলি।

চূড়ান্ত কোডটি এর মতো দেখতে হবে:

<div style="display:none"> <!-- Registration -->
        <div id="register-form">
        <div class="title">
            <h1>Register your Account</h1>
            <span>Sign Up with us and Enjoy!</span>
        </div>
            <form action="<?php echo site_url('wp-login.php?action=register', 'login_post') ?>" method="post">
            <input type="text" name="user_login" value="Username" id="user_login" class="input" />
            <input type="text" name="user_email" value="E-Mail" id="user_email" class="input"  />
                <?php do_action('register_form'); ?>
                <input type="submit" value="Register" id="register" />
            <hr />
            <p class="statement">A password will be e-mailed to you.</p>


            </form>
        </div>
</div><!-- /Registration -->

দয়া করে মনে রাখবেন এটা সত্যিই গুরুত্বপূর্ণ , আছে এবং প্রয়োজনীয়, user_loginহিসেবে nameএবং একটি হিসাবে idআপনার লেখা ইনপুটে অ্যাট্রিবিউট; ইমেল ইনপুট জন্য একই। অন্যথায়, এটি কাজ করবে না।

এবং এটি দিয়ে, আমরা শেষ করেছি!


দুর্দান্ত সমাধান! সহজ এবং দক্ষ। কিন্তু আপনি কোথায় এই স্নিপেট রাখেন? সাইডবারে? এই টিপ টিমগুলি কেবলমাত্র একটি এজ্যাক্স রেজিস্ট্রেশন ফর্মের সাথে কাজ করে।
ফ্যাবিয়েন কোয়াটারভাক্স

1
ধন্যবাদ @ ফ্যাবিইনক্যাট্রাভাক্স, আমি নিবন্ধের শেষ অংশটি অন্তর্ভুক্ত করার জন্য উত্তরটি আপডেট করেছি। এজ্যাক্স ফর্মের কোনও প্রয়োজন নেই - এটি কেবলমাত্র একটি পোস্ট ফর্ম যা wp-login.php?action=registerপৃষ্ঠায় জমা দেয়
আইসিসি 9

6

এই নিবন্ধটি কীভাবে আপনার নিজের ফ্রন্টএন্ড রেজিস্টার / লগইন / পাসওয়ার্ড ফর্মগুলি পুনরুদ্ধার করবেন তার একটি গ্রেট টিউটোরিয়াল সরবরাহ করে।

অথবা আপনি যদি কোনও প্লাগইন সন্ধান করছেন তবে আমি এগুলি আগে ব্যবহার করেছি এবং সেগুলি পুনরুদ্ধার করতে পারি:


4

আমি কিছুক্ষণ আগে একটি ওয়েবসাইট তৈরি করেছি যা সামনের প্রান্তে কাস্টমাইজড রেজিস্ট্রেশন ফর্মটি প্রদর্শন করছে। এই ওয়েবসাইটটি আর লাইভ নয় তবে এখানে কিছু স্ক্রিনশট রয়েছে। লগইন ফরম নিবন্ধন ফর্ম হারিয়ে যাওয়া পাসওয়ার্ড ফর্ম

আমি যে পদক্ষেপগুলি অনুসরণ করেছি তা এখানে:

1) সমস্ত দর্শনার্থীদের সেটিংস> সাধারণ> সদস্যতার বিকল্পের মাধ্যমে একটি নতুন অ্যাকাউন্টের জন্য অনুরোধ করার সম্ভাবনা সক্রিয় করুন। নিবন্ধকরণ পৃষ্ঠাটি এখন URL /wp-login.php?action=register এ উপস্থিত হয়

2) নিবন্ধন ফর্মটি কাস্টমাইজ করুন যাতে এটি আপনার সাইটের সম্মুখ-প্রান্তের মতো লাগে। এটি আরও জটিল এবং আপনি যে থিমটি ব্যবহার করছেন তার উপর নির্ভর করে।

এখানে বিশ শতকের উদাহরণ রয়েছে:

// include theme scripts and styles on the login/registration page
add_action('login_enqueue_scripts', 'twentythirteen_scripts_styles');

// remove admin style on the login/registration page
add_filter( 'style_loader_tag', 'user16975_remove_admin_css', 10, 2);
function user16975_remove_admin_css($tag, $handle){
    if ( did_action('login_init')
    && ($handle == 'wp-admin' || $handle == 'buttons' || $handle == 'colors-fresh'))
        return "";

    else return $tag;
}

// display front-end header and footer on the login/registration page
add_action('login_footer', 'user16975_integrate_login');
function user16975_integrate_login(){
    ?><div id="page" class="hfeed site">
        <header id="masthead" class="site-header" role="banner">
            <a class="home-link" href="<?php echo esc_url( home_url( '/' ) ); ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home">
                <h1 class="site-title"><?php bloginfo( 'name' ); ?></h1>
                <h2 class="site-description"><?php bloginfo( 'description' ); ?></h2>
            </a>

            <div id="navbar" class="navbar">
                <nav id="site-navigation" class="navigation main-navigation" role="navigation">
                    <h3 class="menu-toggle"><?php _e( 'Menu', 'twentythirteen' ); ?></h3>
                    <a class="screen-reader-text skip-link" href="#content" title="<?php esc_attr_e( 'Skip to content', 'twentythirteen' ); ?>"><?php _e( 'Skip to content', 'twentythirteen' ); ?></a>
                    <?php wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu' ) ); ?>
                    <?php get_search_form(); ?>
                </nav><!-- #site-navigation -->
            </div><!-- #navbar -->
        </header><!-- #masthead -->

        <div id="main" class="site-main">
    <?php get_footer(); ?>
    <script>
        // move the login form into the page main content area
        jQuery('#main').append(jQuery('#login'));
    </script>
    <?php
}

তারপরে থিমের স্টাইলশিটটি পরিবর্তন করুন যাতে ফর্মটি আপনার ইচ্ছে মতো প্রদর্শিত হয়।

3) আপনি প্রদর্শিত বার্তাগুলি টিক দিয়ে আরও ফর্মটি সংশোধন করতে পারেন:

add_filter('login_message', 'user16975_login_message');
function user16975_login_message($message){
    if(strpos($message, 'register') !== false){
        $message = 'custom register message';
    } else {
        $message = 'custom login message';
    }
    return $message;
}

add_action('login_form', 'user16975_login_message2');
function user16975_login_message2(){
    echo 'another custom login message';
}

add_action('register_form', 'user16975_tweak_form');
function user16975_tweak_form(){
    echo 'another custom register message';
}

৪) আপনার যদি ফ্রন্ট-এন্ড রেজিস্ট্রেশন ফর্মের প্রয়োজন হয় তবে আপনি সম্ভবত চাইবেন না যে নিবন্ধিত ব্যবহারকারীরা লগ-ইন করার সময় ব্যাকএন্ডটি দেখতে পাবে।

add_filter('user_has_cap', 'user16975_refine_role', 10, 3);
function user16975_refine_role($allcaps, $cap, $args){
    global $pagenow;

    $user = wp_get_current_user();
    if($user->ID != 0 && $user->roles[0] == 'subscriber' && is_admin()){
        // deny access to WP backend
        $allcaps['read'] = false;
    }

    return $allcaps;
}

add_action('admin_page_access_denied', 'user16975_redirect_dashbord');
function user16975_redirect_dashbord(){
    wp_redirect(home_url());
    die();
}

প্রচুর পদক্ষেপ রয়েছে, তবে ফলাফল এখানেই!


0

সহজ উপায়: একটি ওয়ার্ডপ্রেস ফাংশন wp_login_form()( কোডেক্স পৃষ্ঠা এখানে ) ব্যবহার করুন।

আপনি নিজের প্লাগইন তৈরি করতে পারেন যাতে আপনি নিজের পৃষ্ঠাগুলিতে একটি শর্টকোড ব্যবহার করতে পারেন:

<?php
/*
Plugin Name: WP Login Form Shortcode
Description: Use <code>[wp_login_form]</code> to show WordPress' login form.
Version: 1.0
Author: WP-Buddy
Author URI: http://wp-buddy.com
License: GPLv2 or later
*/

add_action( 'init', 'wplfsc_add_shortcodes' );

function wplfsc_add_shortcodes() {
    add_shortcode( 'wp_login_form', 'wplfsc_shortcode' );
}

function wplfsc_shortcode( $atts, $content, $name ) {

$atts = shortcode_atts( array(
        'redirect'       => site_url( $_SERVER['REQUEST_URI'] ),
        'form_id'        => 'loginform',
        'label_username' => __( 'Username' ),
        'label_password' => __( 'Password' ),
        'label_remember' => __( 'Remember Me' ),
        'label_log_in'   => __( 'Log In' ),
        'id_username'    => 'user_login',
        'id_password'    => 'user_pass',
        'id_remember'    => 'rememberme',
        'id_submit'      => 'wp-submit',
        'remember'       => false,
        'value_username' => NULL,
        'value_remember' => false
), $atts, $name );

// echo is always false
$atts['echo'] = false;

// make real boolean values
$atts['remember']       = filter_var( $atts['remember'], FILTER_VALIDATE_BOOLEAN );
$atts['value_remember'] = filter_var( $atts['value_remember'], FILTER_VALIDATE_BOOLEAN );

return '<div class="cct-login-form">' . wp_login_form( $atts ) . '</div>';

}

আপনাকে যা করতে হবে তা হ'ল আপনার ফর্মটি সম্মুখভাগে স্টাইল করা।


-1

আপনি যদি প্লাগইন ব্যবহারের জন্য উন্মুক্ত হন তবে আমি আগে গ্র্যাভিটি ফর্মগুলির জন্য ব্যবহারকারীর নিবন্ধকরণ অ্যাড-অন ব্যবহার করেছি, এটি খুব ভালভাবে কাজ করেছে:

http://www.gravityforms.com/add-ons/user-registration/

সম্পাদনা: আমি বুঝতে পেরেছি যে এটি খুব বিস্তারিত সমাধান নয়, তবে এটি ঠিক আপনার প্রয়োজন মতো করে এবং এটি একটি ভাল সমাধান।

সম্পাদনা: আমার উত্তরটি আরও প্রসারিত করার জন্য, মাধ্যাকর্ষণ ফর্মগুলির জন্য ব্যবহারকারীর নিবন্ধকরণ অ্যাড-অন আপনাকে গ্র্যাভিটি ফর্মগুলি ব্যবহার করে তৈরি করা ফর্মের যে কোনও ক্ষেত্রটি ব্যবহারকারী-নির্দিষ্ট ক্ষেত্রগুলিতে ম্যাপ করতে দেয়। উদাহরণস্বরূপ, আপনি প্রথম নাম, পদবি, ইমেল, ওয়েবসাইট, পাসওয়ার্ড সহ একটি ফর্ম তৈরি করতে পারেন। জমা দেওয়ার পরে, অ্যাড-অন প্রাসঙ্গিক ব্যবহারকারীর ক্ষেত্রে এই ইনপুটগুলি ম্যাপ করবে।

এটি সম্পর্কে আরও একটি দুর্দান্ত বিষয়, আপনি যে কোনও নিবন্ধিত ব্যবহারকারীকে একটি অনুমোদনের সারিতে যুক্ত করতে পারেন। তাদের ব্যবহারকারী অ্যাকাউন্টগুলি কেবল একবার প্রশাসকের দ্বারা ব্যাকএন্ডে অনুমোদিত হওয়ার পরে তৈরি করা হবে।

উপরের লিঙ্কটি যদি ভেঙে যায়, তবে গুগল "গ্র্যাভিটি ফর্মগুলির জন্য ব্যবহারকারী নিবন্ধকরণ যুক্ত করুন"


2
আপনি কি ক্যাসার প্রশ্নের উত্তরে নোটগুলি পড়েছেন (সাহসী খনি): "আমরা দীর্ঘ উত্তর খুঁজছি যা কিছু ব্যাখ্যা এবং প্রসঙ্গ সরবরাহ করে just কেবল একটি-লাইন উত্তর দেবেন না; কেন আপনার উত্তরটি সঠিক, ব্যাখ্যা করুন কেন উদ্ধৃতি। উত্তরগুলিতে যে ব্যাখ্যাগুলি অন্তর্ভুক্ত নয় সেগুলি মুছে ফেলা হতে পারে "
গাজাজাপ

আমার আছে, তবে আমি অনুভব করেছি যে অ্যাড-অনটি এখনও উল্লেখযোগ্য, কারণ ওপি কাস্টম কোড করার প্রয়োজনীয়তার কথা উল্লেখ করে না। আপনার প্রয়োজন মনে হলে এটি একটি মন্তব্যে স্থানান্তরিত হওয়ায় খুশি
জেমস কেম্প

আমি কোনও মোড নই, সুতরাং আমি আপনার উত্তরের মন্তব্য করতে সরব না। আমি কেবল ভোট দিতে পারি, তবে আমি এটি করিনি কারণ আমি মনে করি যে আপনার লিঙ্কটিতে দরকারী তথ্য রয়েছে তবে লিংক-কেবল উত্তরটি কার্যকর নয়, কারণ সেই লিঙ্কটি সহজেই পরিবর্তন হতে পারে এবং তাই আপনার উত্তর একটি 404 এ নিয়ে আসে। এখানে প্রাসঙ্গিক কোডটি রিপোর্ট করার চেষ্টা করুন এবং সেই কোডটি যেভাবে করলো তা বোঝাতে চেষ্টা করুন, তবে আপনার উত্তরটি ঠিক আছে, আমার ধারণা।
গাজাজ্যাপ

জেমস, আমি কোডটি সহ একটি আসল উত্তরে অনুগ্রহটি প্রদান করেছি । আপনি যদি অতিরিক্ত অনুগ্রহ চান, দয়া করে প্লাগইনটি ছিঁড়ে ফেলুন এবং এটি ঠিক কী করছে তা আমাদের জানান। ধন্যবাদ।
কায়সার

হাই কায়সার, আমি অনুগ্রহের পরে নেই, কেবল আমার প্লাগইন সম্পর্কে জ্ঞান ভাগ করে নিতে চেয়েছি!
জেমস ক্যাম্প
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.