user
  • 0
Гуру

Как отобразить форму регистрации пользователя в интерфейсе сайта?

  • 0
    • В этой статье представлено отличное руководство по созданию собственных форм регистрации/логина/восстановления пароля для внешнего интерфейса. или если вы ищете плагин, то я использовал их раньше и могу порекомендовать их: — Ajax Login/RegisterLogin With Ajax

      • 0
    • Кристиан из Cosmolabs опубликовал отличный учебник с исходными файлами, который дает вам возможность создавать внешний профиль пользователя, шаблоны входа и регистрации.

      • 0
    • Вау, это полный редизайн функционала регистрации! Вероятно, это хорошее решение, если вы хотите полностью отменить встроенный процесс регистрации. Я думаю, что не использовать встроенную регистрационную форму — плохая идея, потому что вы потеряете другие основные функции, такие как форма для утерянного пароля. Затем вновь зарегистрированному пользователю потребуется отобразить традиционную внутреннюю форму входа для входа.

      • 0
    • Потерянный пароль @FabienQuatravaux и форму входа можно использовать как обычно (бэкэнд). Да, код неполный, потому что утерянный пароль и форма входа не обрабатываются, но вопрос OP касался только регистрационной формы, и ответ был уже слишком длинным, чтобы добавить другие функции…

      • 0
    • Отличное решение! Просто и эффективно. Но куда вы поместите эти фрагменты? В боковой панели? Этот совет работает только с регистрационной формой ajax.

      • 0
    • Спасибо @FabienQuatravaux, я обновил ответ, включив последний раздел статьи. Не должно быть необходимости в форме AJAX — это просто форма POST, которая отправляется на wp-login.php?action=register страницу

      • 0
    • Вы читали примечания @kaiser, добавленные к вопросу (выделено мной): «Мы ищем длинные ответы, которые дают некоторое объяснение и контекст. Не давайте просто однострочный ответ; объясните, почему ваш ответ правильный, в идеале с цитаты. Ответы, не содержащие объяснений, могут быть удалены»

      • 0
    • У меня есть, но я чувствовал, что дополнение все же стоит упомянуть, поскольку в OP не упоминается о необходимости его индивидуального кода. С удовольствием перенесу его в комментарий, если сочтете это необходимым

      • 0
    • Я не мод, поэтому я не могу прокомментировать ваш ответ. Я могу только проголосовать против, но я этого не сделал, потому что считаю, что ваша ссылка содержит полезную информацию, однако ответ только по ссылке бесполезен, даже потому, что эту ссылку можно легко изменить, и поэтому ваш ответ приводит к 404. Попробуйте сообщить здесь соответствующий код и объяснить, что делает этот код, тогда ваш ответ в порядке, я думаю.

      • 0
    • Джеймс, я присудил награду за реальный ответ, который включает код. Если вам нужна дополнительная награда, пожалуйста, разберите плагин и покажите нам, что именно он делает. Спасибо.

      • 0
    • Привет, Кайзер, мне не нужна награда, я просто хотел поделиться своими знаниями о плагине!

      • 0
  1. Процесс включает 2 шага:

    1. показать форму интерфейса
    2. сохранить данные при отправке

    Есть 3 разных подхода, которые приходят мне на ум, чтобы показать внешний интерфейс:

    • используйте встроенную регистрационную форму, редактирование стилей и т. д., чтобы сделать его более «похожим на интерфейс»
    • использовать страницу/публикацию WordPress и отображать форму с помощью шорткода
    • использовать специальный шаблон, не связанный с какой-либо страницей/публикацией, но вызываемый по определенному URL-адресу

    Для этого ответа я буду использовать последний. Причины:

    • использование встроенной регистрационной формы может быть хорошей идеей, глубокая настройка может быть очень сложной при использовании встроенной формы, и если вы также хотите настроить поля формы, проблема возрастет.
    • использовать страницу WordPress в сочетании с шорткодом, не так надежно, а также я думаю, что шоркоды не должны использоваться для функциональности, только для форматирования и тому подобного

    1: Создайте URL-адрес

    Все мы знаем, что форма регистрации по умолчанию на сайте WordPress часто становится мишенью для спамеров. Использование пользовательского URL-адреса помогает решить эту проблему. Кроме того, я хочу также использовать переменный URL-адрес, т.е. URL-адрес регистрационной формы не должен быть всегда одним и тем же, это усложняет жизнь спамерам. Трюк выполняется с использованием одноразового номера в 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-адрес, первую заглушку 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-адреса после home_url(), и если она совпадает с нашим одноразовым номером, она возвращает 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' хуку: в шаблоне формы простой вызов 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() метод (используя checkUrl() ) посмотрите на первую часть URL-адреса после home_url(), и если он совпадает с правильным одноразовым номером, он проверяет, была ли форма уже отправлена, если это так, используя Saver объект, он проверяет и сохраняет пользовательские данные, в противном случае просто распечатайте форму.

    init() Метод также запускает хук действия, 'custom_reg_form_init' передавая экземпляр формы в качестве аргумента: этот хук следует использовать для добавления полей, настройки пользовательского шаблона, а также для настройки метода формы.

    9: Собираем вещи вместе

    Теперь нам нужно написать основной файл плагина, где мы можем

    • требуют все файлы
    • загрузить текстовый домен
    • запустить весь процесс, используя Custom_Reg класс создания экземпляра и метод вызова 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( ... );
      }
    });
    

    Используя этот метод, мы можем поставить в очередь некоторые js-скрипты для обработки проверки на стороне клиента, например этот. Разметка, необходимая для работы этого скрипта, может быть легко обработана путем редактирования Custom_Reg\BaseField класса.

    Если мы хотим настроить регистрационное электронное письмо, мы можем использовать стандартный метод и, имея пользовательские данные, сохраненные в мета, мы можем использовать их в электронном письме.

    Последняя задача, которую мы, вероятно, хотим реализовать, — это предотвратить запрос к регистрационной форме по умолчанию, так же просто, как:

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

    Все файлы можно найти в Gist здесь.

    • 0
  2. 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 с нуля. Это тратит довольно много времени на стилизацию формы, но имеет следующий довольно простой раздел с необходимым кодом WordPress:

    Шаг 4. WordPress

    Здесь нет ничего необычного; нам нужны только два фрагмента кода 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 as a name и as id при вводе текста; то же самое верно для ввода электронной почты. В противном случае это не сработает.

    И с этим мы закончили!

    • 0
  3. В этой статье представлено отличное руководство по созданию собственных форм регистрации/логина/восстановления пароля для внешнего интерфейса.

    или если вы ищете плагин, то я использовал их раньше и могу порекомендовать их:

    • 0
  4. Некоторое время назад я создал веб-сайт, который отображал настраиваемую регистрационную форму на лицевой стороне. Этот сайт больше не работает, но вот несколько скриншотов.форма входа форма регистрации форма потерянного пароля

    Вот шаги, которые я выполнил:

    1) Активируйте возможность для всех посетителей запрашивать новую учетную запись через «Настройки»> «Основные»> «Членство». Страница регистрации теперь отображается по адресу /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) Если вам нужна регистрационная форма для внешнего интерфейса, вы, вероятно, не захотите, чтобы зарегистрированные пользователи видели внутреннюю часть при входе в систему.

    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
  5. Намного проще: используйте функцию WordPress под названием 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>';
    
    }
    

    Все, что вам нужно сделать, это стилизовать форму в интерфейсе.

    • 0
  6. Если вы открыты для использования плагинов, я использовал надстройку User Registration для Gravity Forms раньше, она работала очень хорошо:

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

    Изменить: я понимаю, что это не очень подробное решение, но оно делает именно то, что вам нужно, и является хорошим решением.

    Редактировать: Чтобы расширить мой ответ, надстройка «Регистрация пользователя» для гравитационных форм позволяет сопоставлять любые поля в форме, созданной с использованием гравитационных форм, с пользовательскими полями. Например, вы можете создать форму с именем, фамилией, адресом электронной почты, веб-сайтом и паролем. После отправки надстройка сопоставит эти входные данные с соответствующими пользовательскими полями.

    Еще одна замечательная вещь в том, что вы можете добавлять любых зарегистрированных пользователей в очередь на одобрение. Их учетные записи пользователей будут созданы только после утверждения администратором в бэкэнде.

    Если приведенная выше ссылка не работает, просто погуглите «Добавление регистрации пользователя для Gravity Forms».

    • 0

Оставить ответ

You must login to add an answer.