วิธีการแสดงแบบฟอร์มการลงทะเบียนผู้ใช้ WordPress ที่ส่วนหน้าของเว็บไซต์?


30

วิธีแสดงแบบฟอร์มลงทะเบียนผู้ใช้ WordPress (แบบฟอร์มที่ปรากฏในหน้า "www.mywebsite.com/wp-register.php") ที่ส่วนหน้าของบล็อกของฉัน

ฉันได้ปรับแต่งแบบฟอร์มลงทะเบียน แต่ไม่ทราบวิธีเรียกฟอร์มนั้นในหน้าส่วนท้าย การสนับสนุนใด ๆ จะเป็นความช่วยเหลือที่ดีจริงๆ

ขอบคุณล่วงหน้า. :)


ทางออกที่ดีที่สุดที่ฉันพบคือธีมปลั๊กอินของฉันเข้าสู่ระบบ
wyrfel

บทความนี้ให้คำแนะนำที่ดีเกี่ยวกับวิธีการสร้างคุณเป็นเจ้าของ frontend register / login / restore form หรือหากคุณกำลังมองหาปลั๊กอินอยู่ฉันเคยใช้มันมาก่อนแล้วและสามารถแนะนำพวกเขาอีกครั้ง: - Ajax เข้าสู่ระบบ / ลงทะเบียน - เข้าสู่ระบบด้วย Ajax
Bainternet

Cristian จาก Cosmolabs ได้โพสต์บทช่วยสอนที่ยอดเยี่ยมพร้อมไฟล์ต้นฉบับที่ให้ความสามารถในการสร้างโปรไฟล์ผู้ใช้ส่วนหน้า, เข้าสู่ระบบและแม่แบบลงทะเบียน
ฟิลิป

คำตอบ:


33

กระบวนการเกี่ยวข้องกับ 2 ขั้นตอน:

  1. แสดงแบบฟอร์มส่วนหน้า
  2. บันทึกข้อมูลในการส่ง

มี 3 วิธีที่ต่างกันที่อยู่ในใจของฉันเพื่อแสดงส่วนหน้า:

  • ใช้แบบฟอร์มการลงทะเบียนในตัวสไตล์การแก้ไข ฯลฯ เพื่อเพิ่ม "frontend like" ให้มากขึ้น
  • ใช้หน้า / โพสต์ WordPress และแสดงแบบฟอร์มโดยใช้รหัสย่อ
  • ใช้เทมเพลตอุทิศที่ไม่ได้เชื่อมต่อกับหน้า / โพสต์ใด ๆ แต่เรียกโดย url ที่ระบุ

สำหรับคำตอบนี้ฉันจะใช้อันหลัง เหตุผลคือ:

  • การใช้แบบฟอร์มการลงทะเบียนในตัวอาจเป็นความคิดที่ดีการปรับแต่งแบบลึกอาจเป็นเรื่องยากมากโดยใช้แบบฟอร์มที่มีอยู่แล้วและถ้าหากใครต้องการปรับแต่งฟิลด์แบบฟอร์มด้วย
  • ใช้หน้า WordPress ร่วมกับรหัสย่อ, ไม่น่าเชื่อถือ, และฉันคิดว่า shorcodes ไม่ควรใช้สำหรับการทำงาน, เพียงแค่สำหรับการจัดรูปแบบและเช่น

1: สร้าง URL

เราทุกคนรู้ว่ารูปแบบการลงทะเบียนเริ่มต้นของเว็บไซต์ WordPress มักจะเป็นเป้าหมายของผู้ส่งอีเมลขยะ การใช้ URL ที่กำหนดเองเป็นตัวช่วยในการแก้ปัญหานี้ นอกจากนี้ฉันต้องการใช้ตัวแปร URL เช่น URL แบบฟอร์มลงทะเบียนไม่ควรเหมือนกันเสมอสิ่งนี้ทำให้ผู้ส่งอีเมลขยะมีชีวิตที่ยากขึ้น เคล็ดลับจะทำโดยใช้nonceใน url:

/**
* 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: รู้จัก url, stub แรกของCustom_Reg\Custom_Regคลาส

ตอนนี้เราต้องรู้จัก URL สำหรับเทเลเท็กซ์ฉันจะเริ่มเขียนชั้นเรียนซึ่งจะเสร็จในภายหลังในคำตอบ:

<?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];
    }
  }

}

ฟังก์ชั่นดูที่ส่วนแรกของ url after home_url()และถ้ามันตรงกับ nonce ของเรามันจะคืนค่า TRUE ฟังก์ชั่นนี้จะถูกใช้เพื่อตรวจสอบคำขอของเราและดำเนินการที่จำเป็นเพื่อแสดงแบบฟอร์มของเรา

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แต่ละเขตจะต้องเป็นตัวอย่างของ มีการเพิ่มฟิลด์ที่ซ่อนอยู่เพิ่มเติมสำหรับการตรวจสอบที่ไม่ใช่ วิธีการแบบฟอร์มคือ 'POST' โดยค่าเริ่มต้น แต่สามารถกำหนดเป็น 'GET' โดยใช้setVerbวิธีการ เมื่อสร้างมาร์กอัปแล้วจะถูกบันทึกไว้ภายใน$formคุณสมบัติของวัตถุที่ถูกสะท้อนด้วยoutput()วิธีการ'custom_registration_form'เชื่อมต่อลงในhook: ในเทมเพลตของฟอร์มเพียงโทร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: การเพิ่มบางฟิลด์

ตอนนี้เราต้องการบางสาขา เราสามารถสร้างไฟล์ชื่อ 'fields.php' โดยที่เรากำหนดคลาสของฟิลด์:

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

}

คลาสนั้นมี 2 วิธีหลักหนึ่งวิธี ( validate) ที่วนรอบฟิลด์ตรวจสอบและบันทึกข้อมูลที่ดีลงในอาร์เรย์ส่วนที่สอง ( save) บันทึกข้อมูลทั้งหมดในฐานข้อมูลและส่งรหัสผ่านทางอีเมลไปยังผู้ใช้ใหม่

8: การใช้คลาสที่กำหนด: สิ้นสุดCustom_Regคลาส

ตอนนี้เราสามารถทำงานอีกครั้งในCustom_Regชั้นเรียนเพิ่มวิธีการที่ "ติดกาว" วัตถุที่กำหนดและทำให้พวกเขาทำงาน

<?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()method (using checkUrl()) ดูที่ส่วนแรกของ url after home_url()และถ้าตรงกับ nonce ที่ถูกต้องมันจะตรวจสอบว่าฟอร์มถูกส่งไปแล้วหรือไม่ถ้าใช้Saverobject มันจะทำการตรวจสอบและบันทึก userdata มิฉะนั้นเพียงพิมพ์ฟอร์ม .

init()วิธีการยังยิงตะขอการกระทำที่'custom_reg_form_init'ผ่านอินสแตนซ์ของรูปแบบเป็นอาร์กิวเมนต์: เบ็ดนี้ควรใช้ในการเพิ่มเขตข้อมูลเพื่อติดตั้งแม่แบบที่กำหนดเองและเพื่อปรับแต่งวิธีการแบบฟอร์ม

9: รวบรวมทุกอย่างเข้าด้วยกัน

ตอนนี้เราต้องเขียนไฟล์ปลั๊กอินหลักซึ่งเราสามารถทำได้

  • ต้องการไฟล์ทั้งหมด
  • โหลดโดเมนข้อความ
  • กระบวนการทั้งหมดเริ่มต้นโดยใช้Custom_Regคลาสinstantiating และinit()วิธีการโทรกับมันโดยใช้เบ็ดแรกพอสมควร
  • ใช้ 'custom_reg_form_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( ... );
  }
});

โดยใช้วิธีการที่เราสามารถ enqueue js บางสคริปต์เพื่อตรวจสอบด้านการจัดการลูกค้าเช่นนี้ มาร์กอัปที่จำเป็นในการทำให้งานสคริปต์นั้นสามารถจัดการได้อย่างง่ายดายแก้ไขCustom_Reg\BaseFieldชั้นเรียน

หากเราต้องการปรับแต่งอีเมลการลงทะเบียนเราสามารถใช้วิธีมาตรฐานและบันทึกข้อมูลที่กำหนดเองในเมตาเราสามารถใช้ประโยชน์จากอีเมลเหล่านั้นได้

งานสุดท้ายที่เราอาจต้องการนำมาใช้คือป้องกันการร้องขอไปยังแบบฟอร์มการลงทะเบียนเริ่มต้นง่ายเหมือน:

add_action( 'login_form_register', function() { exit(); } );

ไฟล์ทั้งหมดที่สามารถพบได้ในกระทู้ที่นี่


1
ว้าวนี่คือการออกแบบฟังก์ชั่นการลงทะเบียนที่สมบูรณ์อีกครั้ง! นั่นอาจเป็นทางออกที่ดีหากคุณต้องการแทนที่กระบวนการลงทะเบียนภายใน ฉันคิดว่าการไม่ใช้แบบฟอร์มลงทะเบียนในตัวไม่ใช่ความคิดที่ดีเพราะคุณจะสูญเสียคุณสมบัติหลักอื่น ๆ เช่นแบบฟอร์มรหัสผ่านที่หายไป จากนั้นผู้ใช้ที่ลงทะเบียนใหม่จะต้องแสดงแบบฟอร์มการเข้าสู่ระบบแบ็คเอนด์แบบดั้งเดิมเพื่อลงชื่อเข้าใช้
Fabien Quatravaux

1
@FabienQuatravaux รหัสผ่านที่สูญหายและแบบฟอร์มเข้าสู่ระบบสามารถใช้งานได้ตามปกติ (แบ็กเอนด์) ใช่รหัสไม่สมบูรณ์เนื่องจากรหัสผ่านที่หายไปและแบบฟอร์มการเข้าสู่ระบบไม่ได้รับการจัดการ แต่คำถาม OP นั้นเกี่ยวกับแบบฟอร์มการลงทะเบียนเท่านั้นและคำตอบนั้นยาวเกินไปที่จะเพิ่มฟังก์ชั่นอื่น ๆ ...
gmazzap

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>

ผมพบว่าบทความ Tutsplus ยอดเยี่ยมในการลงทะเบียนแบบฟอร์มแฟนซี Wordpress จากรอยขีดข่วน สิ่งนี้ใช้เวลาค่อนข้างมากในการออกแบบรูปแบบ แต่มีส่วนที่ค่อนข้างง่ายต่อไปนี้ในรหัสเวิร์ดเพรสที่ต้องการ:

ขั้นตอนที่ 4 WordPress

ไม่มีอะไรแฟนซีที่นี่; เราต้องการตัวอย่างเวิร์ดเพรสสองตัวเท่านั้นซ่อนอยู่ในไฟล์ wp-login.php

ตัวอย่างแรก:

<?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แอตทริบิวต์ในการป้อนข้อความของคุณ; เช่นเดียวกับการป้อนอีเมล มิฉะนั้นจะใช้ไม่ได้

และด้วยสิ่งนั้นเราก็เสร็จแล้ว!


สุดยอดทางออก! ง่ายและมีประสิทธิภาพ แต่คุณวางตัวอย่างไว้ที่ไหน ในแถบด้านข้างหรือไม่? เคล็ดลับนี้จะใช้ได้กับแบบฟอร์มการลงทะเบียน ajax เท่านั้น
Fabien Quatravaux

1
ขอบคุณ @FabienQuatravaux ฉันได้อัปเดตคำตอบเพื่อรวมหัวข้อสุดท้ายของบทความแล้ว ไม่จำเป็นต้องมีแบบฟอร์ม AJAX - เป็นเพียงแบบฟอร์ม POST ที่ส่งไปยังwp-login.php?action=registerหน้า
icc97

6

บทความนี้ให้คำแนะนำที่ดีเกี่ยวกับวิธีการสร้างคุณเป็นเจ้าของ frontend register / login / restore form

หรือหากคุณกำลังมองหาปลั๊กอินอยู่ฉันเคยใช้มันมาก่อนแล้วและสามารถแนะนำพวกมันอีกครั้ง:


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';
}

4)หากคุณต้องการแบบฟอร์มการลงทะเบียน Front-End คุณอาจไม่ต้องการให้ผู้ใช้ที่ลงทะเบียนเห็นแบ็กเอนด์เมื่อพวกเขาเข้าสู่ระบบ

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

วิธีที่ง่ายกว่า: ใช้ฟังก์ชั่น WordPress ที่เรียกว่าwp_login_form()( หน้า Codex ที่นี่ )

คุณสามารถสร้างปลั๊กอินของคุณเองเพื่อให้คุณสามารถใช้รหัสย่อในหน้าของคุณ:

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

หากคุณเปิดให้ใช้งานปลั๊กอินฉันเคยใช้ Add-on การลงทะเบียนผู้ใช้สำหรับแบบฟอร์ม Gravity มาก่อนมันใช้งานได้ดีมาก:

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

แก้ไข: ฉันรู้ว่านี่ไม่ใช่คำตอบที่ละเอียดมาก แต่มันทำสิ่งที่คุณต้องการอย่างแท้จริงและเป็นวิธีแก้ปัญหาที่ดี

แก้ไข: หากต้องการขยายคำตอบของฉันเพิ่มเติมส่วนเสริมการลงทะเบียนผู้ใช้สำหรับฟอร์มแรงโน้มถ่วงช่วยให้คุณแมปฟิลด์ใด ๆ ในรูปแบบที่สร้างขึ้นโดยใช้ Gravity Forms ไปยังฟิลด์เฉพาะของผู้ใช้ ตัวอย่างเช่นคุณสามารถสร้างฟอร์มด้วยชื่อนามสกุลอีเมลเว็บไซต์รหัสผ่าน เมื่อส่งแล้วโปรแกรมเสริมจะจับคู่อินพุตเหล่านั้นกับฟิลด์ผู้ใช้ที่เกี่ยวข้อง

อีกสิ่งที่ดีเกี่ยวกับมันคือคุณสามารถเพิ่มผู้ใช้ที่ลงทะเบียนในคิวการอนุมัติ บัญชีผู้ใช้ของพวกเขาจะถูกสร้างขึ้นเมื่อได้รับอนุมัติในส่วนหลังโดยผู้ดูแลระบบเท่านั้น

หากลิงค์ด้านบนผิดเพี้ยนเพียง Google "เพิ่มการลงทะเบียนผู้ใช้สำหรับแบบฟอร์มแรงโน้มถ่วง"


2
คุณได้อ่านหมายเหตุ @kaiser ที่เพิ่มลงในคำถาม (ตัวหนาของฉัน): "เรากำลังมองหาคำตอบยาว ๆ ที่ให้คำอธิบายและบริบทไม่เพียงแค่ให้คำตอบเดียวแล้วอธิบายว่าทำไมคำตอบของคุณจึงเหมาะสม การอ้างอิงคำตอบที่ไม่รวมคำอธิบายอาจถูกลบ "
gmazzap

ฉันมี แต่ฉันรู้สึกว่าแอดออนยังคงมีมูลค่าการกล่าวขวัญเนื่องจาก OP ไม่ได้กล่าวถึงความจำเป็นในการกำหนดรหัสเอง มีความสุขที่จะย้ายไปที่ความคิดเห็นหากคุณรู้สึกว่าจำเป็น
James Kemp

ฉันไม่ได้เป็น mod ดังนั้นฉันไม่สามารถย้ายไปแสดงความคิดเห็นคำตอบของคุณ ฉันทำได้เพียงลงคะแนนเท่านั้น แต่ฉันไม่ได้ทำเช่นนั้นเพราะฉันคิดว่าลิงก์ของคุณมีข้อมูลที่มีประโยชน์อย่างไรก็ตามคำตอบสำหรับลิงก์เท่านั้นไม่มีประโยชน์แม้ว่าลิงก์นั้นสามารถเปลี่ยนแปลงได้ง่ายและคำตอบของคุณก็นำไปสู่ ​​404 ลองรายงานรหัสที่เกี่ยวข้องที่นี่และอธิบายว่ารหัสนั้นเป็นอย่างไรจากนั้นคำตอบของคุณก็ใช้ได้ฉันเดา
gmazzap

เจมส์ฉันได้รับรางวัลเงินรางวัลเป็นคำตอบที่แท้จริงที่มีรหัส หากคุณต้องการความช่วยเหลือเพิ่มเติมกรุณาแยกปลั๊กอินออกจากกันและแสดงให้เราเห็นว่ามันทำอะไรอยู่ ขอบคุณ
ไกเซอร์

สวัสดี Kaiser ฉันไม่ได้อยู่หลังเงินรางวัลแค่อยากจะแบ่งปันความรู้เกี่ยวกับปลั๊กอิน!
James Kemp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.