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

30

Как отобразить форму регистрации пользователя WordPress (форма, которая отображается на странице «www.mywebsite.com/wp-register.php») в начале моего блога?

Я настроил регистрационную форму. Но не знаю, как вызвать эту форму на главной странице. Любая поддержка будет очень полезна.

Заранее спасибо. :)

bueltge
источник
Лучшее решение, которое я нашел, это плагин Theme My Login .
wyrfel
В этой статье вы найдете большое руководство по созданию собственных форм регистрации / входа / восстановления пароля для внешнего интерфейса. или, если вы ищете плагин, то я уже использовал их и могу рекомендовать их: - Вход в Ajax / Регистрация - Вход в Ajax
Bainternet
Кристиан из Cosmolabs опубликовал отличный учебник с исходными файлами, который дает вам возможность создавать шаблоны пользовательского профиля, входа и регистрации.
Филипп

Ответы:

33

Процесс включает в себя 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() и, если она совпадает с нашим 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'крючку: в шаблоне формы просто вызов 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 здесь .

Gmazzap
источник
1
Вау, это полная переделка функциональности регистрации! Вероятно, это хорошее решение, если вы хотите полностью переопределить встроенный процесс регистрации. Я думаю, что не использовать встроенную регистрационную форму не очень хорошая идея, потому что вы потеряете другие основные функции, такие как форма потерянного пароля. Затем вновь зарегистрированный пользователь должен будет отобразить традиционную внутреннюю форму входа для входа.
Фабьен Кватраво,
1
@FabienQuatravaux потерянный пароль и форму входа можно просто использовать как обычно (бэкэнд). Да, код неполный, потому что потерянный пароль и форма входа не обрабатываются, но вопрос OP
касался
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 с нуля» . Это тратит довольно много времени на стилизацию формы, но имеет следующий довольно простой раздел о необходимом коде 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в качестве текстового ввода nameкак idатрибут и как атрибут; То же самое верно для ввода электронной почты. Иначе это не сработает.

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

icc97
источник
Отличное решение! Просто и эффективно. Но куда вы кладете эти фрагменты? В боковой панели? Этот совет подходит только для работы с регистрационной формой AJAX.
Фабьен Кватраво
1
Спасибо @FabienQuatravaux, я обновил ответ, чтобы включить последний раздел статьи. Не должно быть необходимости в форме AJAX - это просто форма POST, которая отправляется на wp-login.php?action=registerстраницу
icc97
6

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

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

Bainternet
источник
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

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

}

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

поток
источник
-1

Если вы открыты для использования плагинов, я уже использовал надстройку «Регистрация пользователей» для Gravity Forms, она работала очень хорошо:

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

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

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

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

Если приведенная выше ссылка не работает, просто Google "Регистрация пользователя для Gravity Forms"

Джеймс Кемп
источник
2
Читали ли вы заметки, добавленные к вопросу @kaiser (жирным шрифтом): «Мы ищем длинные ответы, которые дают некоторое объяснение и контекст . Не просто дайте однострочный ответ; объясните, почему ваш ответ правильный, в идеале с цитаты. Ответы, которые не включают объяснения, могут быть удалены "
gmazzap
У меня есть, но я чувствовал, что надстройку все же стоит упомянуть, поскольку в OP не упоминается о необходимости ее пользовательского кода. Рад переместить его в комментарий, если вы чувствуете, что это необходимо
Джеймс Кемп
Я не мод, поэтому я не могу комментировать ваш ответ. Я могу только отклонить, но я не сделал этого, потому что я думаю, что ваша ссылка содержит полезную информацию, однако, ответ только на ссылку бесполезен, даже потому что эту ссылку можно легко изменить и поэтому ваш ответ доведет до 404. Попытайтесь сообщить здесь соответствующий код и объясните, что делает код, тогда, я думаю, ваш ответ в порядке.
gmazzap
Джеймс, я присудил награду за реальный ответ, включающий код. Если вы хотите получить дополнительную награду, пожалуйста, разорвите плагин и покажите нам, что он делает. Спасибо.
Кайзер
Привет Кайзер, я не после награды, просто хотел поделиться своими знаниями о плагине!
Джеймс Кемп