Como exibir o Formulário de registro de usuário do WordPress no front-end do site?


30

Como exibir o formulário de registro de usuário do WordPress (o formulário que aparece na página "www.mywebsite.com/wp-register.php") no front-end do meu blog?

Eu personalizei o formulário de inscrição. Mas não saiba como chamar esse formulário na página inicial. Qualquer suporte será realmente uma grande ajuda.

Desde já, obrigado. :)


A melhor solução que encontrei é o plugin Theme My Login .
Wyrfel

Este artigo fornece um tutorial de greate sobre como criar seus próprios formulários de registro / login / restauração de senha de front-end. ou se você estiver procurando por um plug-in, eu os usei antes e posso recomendá-los: - Ajax Login / Register - Faça login com Ajax
Bainternet

O Cristian, da Cosmolabs, publicou um ótimo tutorial com arquivos de origem que permitem criar modelos de perfil de usuário, logon e registro de front-end.
Philip

Respostas:


33

O processo envolve 2 etapas:

  1. mostrar o formulário de front-end
  2. salve os dados no envio

Existem três abordagens diferentes que vêm à minha mente para mostrar o frontend:

  • use o formulário de registro interno, estilos de edição etc. para torná-lo mais "parecido com o front-end"
  • use uma página / postagem do WordPress e exiba o formulário usando um código de acesso
  • use um modelo dedicado não conectado a nenhuma página / postagem, mas chamado por um URL específico

Para esta resposta, usarei a última. Os motivos são:

  • usar o formulário de registro interno pode ser uma boa ideia, personalizações profundas podem ser muito difíceis usando o formulário interno e, se você também quiser personalizar os campos do formulário, a dor aumenta
  • use uma página do WordPress em combinação com um código curto, não é tão confiável e também acho que códigos de acesso não devem ser usados ​​para funcionalidade, apenas para formatação e

1: Crie o URL

Todos nós sabemos que o formulário de registro padrão de um site WordPress costuma ser alvo de spammers. Usar um URL personalizado é uma ajuda para resolver esse problema. Além disso, também quero usar um URL variável , ou seja, o URL do formulário de registro não deve ser sempre o mesmo, isso dificulta a vida dos spammers. O truque é feito usando um nonce no 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' )
  );
}

O uso dessas funções é fácil de exibir nos modelos um link para o formulário de registro, mesmo que seja dinâmico.

2: reconhecer o URL, primeiro esboço da Custom_Reg\Custom_Regclasse

Agora precisamos reconhecer o URL. Para o propósito, começarei a escrever uma classe, que será concluída mais adiante na resposta:

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

}

A função olha para a primeira parte do URL depois home_url()e, se corresponder à nossa notceção, retornará TRUE. essa função será usada para verificar nossa solicitação e executar as ações necessárias para exibir nosso formulário.

3: A Custom_Reg\Formturma

Agora vou escrever uma classe, que será responsável por gerar a marcação do formulário. Vou usá-lo também para armazenar em uma propriedade o caminho do arquivo de modelo que deve ser usado para exibir o formulário.

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

}

A classe gera a marcação de formulário repetindo todos os campos adicionados ao createmétodo de chamada em cada um deles. Cada campo deve ser uma instância de Custom_Reg\FieldInterface. Um campo oculto adicional é adicionado para verificação de não aceitação. O método do formulário é 'POST' por padrão, mas pode ser definido como 'GET' usando o setVerbmétodo Uma vez criada, a marcação é salva dentro da $formpropriedade do objeto que é ecoada pelo output()método, conectada ao 'custom_registration_form'gancho: no modelo de formulário, basta chamar do_action( 'custom_registration_form' )o output do formulário.

4: O modelo padrão

Como eu disse, o modelo para o formulário pode ser facilmente substituído, no entanto, precisamos de um modelo básico como substituto. Escrevi aqui um modelo muito bruto, mais uma prova de conceito do que um modelo real.

<?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: A Custom_Reg\FieldInterfaceinterface

Todo campo deve ser um objeto que implementa a seguinte interface

<?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 = '');
}

Penso que os comentários explicam o que as classes que implementam essa interface devem fazer.

6: Adicionando alguns campos

Agora precisamos de alguns campos. Podemos criar um arquivo chamado 'fields.php' onde definimos as classes de campos:

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

Eu usei uma classe base para definir a implementação padrão da interface, no entanto, é possível adicionar campos muito personalizados implementando diretamente a interface ou estendendo a classe base e substituindo alguns métodos.

Neste ponto, temos tudo para exibir o formulário, agora precisamos de algo para validar e salvar os campos.

7: A Custom_Reg\Saverclasse

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

}

Essa classe possui 2 métodos principais, um ( validate) que faz o loop dos campos, valida-os e salva bons dados em uma matriz, o segundo ( save) salva todos os dados no banco de dados e envia a senha por email para o novo usuário.

8: Usando classes definidas: finalizando a Custom_Regclasse

Agora podemos trabalhar novamente na Custom_Regaula, adicionando os métodos que "colam" o objeto definido e os fazem funcionar

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

}

O construtor da classe aceita uma instância de Forme uma de Saver.

init()O método (using checkUrl()) examina a primeira parte do URL depois home_url()e, se corresponder ao nonce certo, verifica se o formulário já foi enviado; se estiver usando o Saverobjeto, valida e salva os dados do usuário; caso contrário, apenas imprima o formulário .

init()O método também aciona o gancho de ação que 'custom_reg_form_init'passa a instância do formulário como argumento: esse gancho deve ser usado para adicionar campos, configurar o modelo personalizado e também personalizar o método do formulário.

9: Juntando as coisas

Agora precisamos escrever o arquivo principal do plugin, onde pudermos

  • requer todos os arquivos
  • carregar o domínio de texto
  • iniciar todo o processo usando a Custom_Regclasse instanciadora e chamar o init()método usando um gancho razoavelmente precoce
  • use o 'custom_reg_form_init' para adicionar os campos à classe de formulário

Tão:

<?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: Faltando tarefas

Agora tudo está bem feito. Temos apenas que personalizar o modelo, provavelmente adicionando um arquivo de modelo personalizado ao nosso tema.

Podemos adicionar estilos e scripts específicos apenas à página de registro personalizada dessa maneira

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( ... );
  }
});

Usando esse método, podemos enfileirar alguns scripts js para lidar com a validação do lado do cliente, por exemplo, este . A marcação necessária para fazer esse script funcionar pode ser facilmente manipulada editando a Custom_Reg\BaseFieldclasse.

Se quisermos personalizar o email de registro, podemos usar o método padrão e, com os dados personalizados salvos na meta, podemos utilizá-los no email.

A última tarefa que provavelmente queremos implementar é impedir a solicitação do formulário de registro padrão, tão fácil quanto:

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

Todos os arquivos podem ser encontrados em um Gist aqui .


1
Uau, este é um redesenho completo da funcionalidade de registro! Essa provavelmente é uma boa solução se você deseja substituir completamente o processo de registro interno. Acho que não usar o formulário de registro interno não é uma boa ideia, pois você perderá outros recursos essenciais, como o formulário de senha perdida. E então, um usuário recém-registrado precisaria exibir o formulário de login de back-end tradicional para entrar.
Fabien Quatravaux 31/03

1
A senha perdida e o formulário de login do @FabienQuatravaux podem ser usados ​​apenas como de costume (back-end). Sim, o código é incompleta porque senha perdida e formulário de login não são tratados, mas pergunta OP foi apenas cerca de formulário de inscrição e a resposta foi já demasiado longa para adicionar outras funcionalidades ...
gmazzap

13

TLDR; Coloque o seguinte formulário no seu tema, os atributos namee idsão importantes:

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

Encontrei um excelente artigo da Tutsplus sobre Como criar um formulário de registro de Wordpress sofisticado do zero . Isso gasta bastante tempo estilizando o formulário, mas possui a seguinte seção bastante simples do código wordpress necessário:

Etapa 4. WordPress

Não há nada chique aqui; exigimos apenas dois snippets do WordPress, ocultos no arquivo wp-login.php.

O primeiro trecho:

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

E:

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

Editar: eu adicionei o bit final extra do artigo para explicar onde colocar os trechos de código acima - é apenas um formulário para que ele possa ir em qualquer modelo de página ou barra lateral ou criar um código curto com ele. A seção importante é a formque contém os trechos acima e os campos obrigatórios importantes.

O código final deve ficar assim:

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

Observe que é realmente importante e necessário ter user_logincomo namee como um idatributo na sua entrada de texto; o mesmo vale para a entrada de email. Caso contrário, não funcionará.

E com isso, terminamos!


Ótima solução! Simples e eficiente. Mas onde você coloca esses trechos? Em uma barra lateral? Essa dica parece funcionar apenas com um formulário de registro do ajax.
Fabien Quatravaux

1
Obrigado @FabienQuatravaux, atualizei a resposta para incluir a última seção do artigo. Não deve haver nenhuma necessidade de um formulário AJAX - é apenas uma forma POST que submete à wp-login.php?action=registerpágina
icc97


4

Eu criei um site há algum tempo que exibia um formulário de inscrição personalizado no lado frontal. Este site não está mais ativo, mas aqui estão algumas capturas de tela. forma de login formulário de registro formulário de senha perdida

Aqui estão os passos que segui:

1) Ative a possibilidade de todos os visitantes solicitarem uma nova conta através da opção Configurações> Geral> Associação. A página de registro agora aparece no URL /wp-login.php?action=register

2) Personalize o formulário de registro para que ele se pareça com o front-end do site. Isso é mais complicado e depende do tema que você está usando.

Aqui está um exemplo com vinte e treze:

// 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
}

Em seguida, modifique a folha de estilo do tema para fazer com que o formulário apareça como você deseja.

3) Você pode modificar ainda mais o formulário, ajustando as mensagens exibidas:

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) Se você precisar de um formulário de registro de front-end, provavelmente não desejará que os usuários registrados vejam o back-end quando fizerem login.

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();
}

Existem muitas etapas, mas o resultado está aqui!


0

Muito mais fácil: use uma função do WordPress chamada wp_login_form()( página Codex aqui ).

Você pode criar seu próprio plug-in para poder usar um código curto em suas páginas:

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

}

Tudo o que você precisa fazer é estilizar seu formulário no frontend.


-1

Se você está aberto ao uso de plug-ins, já usei o complemento Registro do Usuário para o Gravity Forms, funcionou muito bem:

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

Edit: Sei que esta não é uma solução muito detalhada, mas faz exatamente o que você precisa e é uma boa solução.

Editar: para expandir ainda mais a minha resposta, o complemento Registro do usuário para formulários de gravidade permite mapear todos os campos em um formulário criado usando Gravity Forms, para campos específicos do usuário. Por exemplo, você pode criar um formulário com Nome, Sobrenome, Email, Site, Senha. Após o envio, o complemento mapeará essas entradas para os campos relevantes do usuário.

Outra grande coisa sobre isso é que você pode adicionar usuários registrados a uma fila de aprovação. Suas contas de usuário seriam criadas apenas uma vez aprovadas no back-end por um administrador.

Se o link acima for quebrado, basta Google "adicionar registro do usuário para formulários de gravidade"


2
Você leu as notas @kaiser adicionadas à pergunta (negrito): "Estamos procurando respostas longas que forneçam alguma explicação e contexto . Não dê apenas uma resposta em uma linha; explique por que sua resposta está correta, idealmente com respostas que não incluam explicações podem ser removidas "
gmazzap

Tenho, mas achei que o complemento ainda vale a pena mencionar, pois o OP não menciona a necessidade de codificá-lo de maneira personalizada. Feliz para movê-lo para um comentário, se você sente que é necessário
James Kemp

Eu não sou um mod, então não posso comentar sua resposta. Só posso votar, mas não o fiz porque acho que seu link contém informações úteis; no entanto, a resposta somente de link não é útil, mesmo porque esse link pode ser facilmente alterado e, portanto, sua resposta é 404. Tente relatar aqui o código relevante e explicar o que esse código faz, então sua resposta está boa, eu acho.
gmazzap

James, concedi a recompensa a uma resposta real que inclui código. Se você quiser uma recompensa adicional, desmonte o plug-in e mostre-nos exatamente o que está fazendo. Obrigado.
Kaiser #

Oi Kaiser, eu não estou atrás da recompensa, só queria compartilhar meu conhecimento do plugin!
James Kemp
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.