WordPress Kullanıcı Kayıt Formu web sitesinin önünde nasıl gösterilir?


30

Blogumun ön kısmında WordPress kullanıcı kayıt formu ("www.mywebsite.com/wp-register.php" sayfasında görünen form) nasıl görünür?

Kayıt formunu özelleştirdim. Ancak bu formun ön sayfadan nasıl çağrılacağını bilmiyorum. Herhangi bir destek gerçekten çok yardımcı olacaktır.

Şimdiden teşekkürler. :)


Bulduğum en iyi çözüm Theme My Login eklentisi .
wyrfel

Bu madde şifre formları kendi önyüzü kayıt / giriş / yükleme oluşturmak için nasıl bir azam öğretici sağlar. ya da bir eklenti arıyorsanız, daha önce bunları kullandım ve
önerebilirim

Cosmolabs'dan Cristian, size bir ön uç Kullanıcı Profili, Giriş ve Kayıt şablonları oluşturma yeteneği veren kaynak dosyalarla ilgili harika bir ders yayınladı .
Philip

Yanıtlar:


33

İşlem 2 adımdan oluşuyor:

  1. ön formu göster
  2. gönderimdeki verileri kaydet

Frontend'i göstermek için aklıma gelen 3 farklı yaklaşım var:

  • daha "ön uç gibi" yapmak için yerleşik kayıt formunu, stilleri düzenleme vb.
  • bir WordPress sayfası / postası kullanın ve bir kısa kod kullanarak formu görüntüleyin
  • Herhangi bir sayfaya / yazıya bağlı olmayan, ancak belirli bir URL ile çağrılan özel bir şablon kullanın.

Bu cevap için ikincisini kullanacağım. Sebepler:

  • yerleşik kayıt formunu kullanmak iyi bir fikir olabilir, yerleşik form kullanarak derin özelleştirmeler çok zor olabilir ve eğer form alanlarını özelleştirmek isterseniz ağrı artar
  • bir WordPress sayfasını bir kısa kodla birlikte kullanmak çok güvenilir değildir ve ayrıca kısa biçimlerin işlevsellik için kullanılmaması gerektiğini düşünüyorum.

1: URL'yi oluşturun

Hepimiz bir WordPress sitesinin varsayılan kayıt formunun spam gönderenler için bir hedef olduğunu biliyoruz. Özel bir URL kullanmak, bu sorunu çözmek için bir yardımdır. Ayrıca değişken bir url de kullanmak istiyorum , yani kayıt formu url'si her zaman aynı olmamalıdır, bu spam gönderenlerin hayatını zorlaştırır. Hile url'de bir noce kullanarak yapılır :

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

Bu işlevleri kullanmak, şablonlarda dinamik olsa bile kayıt formuna bir bağlantıyı görüntülemek kolaydır.

2: Url’yi, Custom_Reg\Custom_Regsınıfın ilk saplamasını tanıyın

Şimdi url'yi tanımamız gerekiyor. Pourpose için bir cevap yazmaya başlayacağım, sonra bir sınıf yazmaya başlayacağım:

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

}

İşlev, url'nin ilk kısmına bakar ve home_url()bizim olmayanımızla eşleşirse TRUE değerini döndürür. Bu fonksiyon isteğimizi kontrol etmek ve formumuzu göstermek için gerekli işlemleri yapmak için kullanılacaktır.

3: Custom_Reg\Formsınıf

Şimdi bir form yazacağım, form biçimlendirmesini oluşturmaktan sorumlu olacak. Bir özelliği, formu görüntülemek için kullanılması gereken şablon dosya yolunu da saklamak için kullanacağım.

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

}

Sınıf create, her biri için arama yöntemi eklenmiş tüm alanları kapsayan form biçimlendirme oluşturur . Her alanın bir örneği olması gerekir Custom_Reg\FieldInterface. Uygun olmayan doğrulama için ek bir gizli alan eklenir. Form yöntemi varsayılan olarak 'POST', ancak setVerbyöntem kullanılarak 'GET' olarak ayarlanabilir . Oluşturulduktan sonra, işaretleme yöntemle $formyankılanan nesne özelliğinin içine kaydedilir output(), kancaya 'custom_registration_form'bağlanır: form şablonunda çağrı yalnızca do_action( 'custom_registration_form' )form çıktısını alır.

4: Varsayılan şablon

Dediğim gibi form için şablon kolayca geçersiz kılınabilir, ancak geri dönüş olarak temel bir şablona ihtiyacımız var. Buraya çok kaba bir şablon, gerçek bir şablondan çok bir kavram kanıtı yazdım.

<?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\FieldInterfacearayüz

Her alan aşağıdaki arayüzü uygulayan bir nesne olmalıdır

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

Bu arayüzün uygulandığı sınıfların ne yapması gerektiğini açıkladığını düşünüyorum.

6: Bazı alanlar ekleme

Şimdi bazı alanlara ihtiyacımız var. Fields sınıflarını tanımladığımız 'fields.php' adında bir dosya oluşturabiliriz:

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

Varsayılan arabirim uygulamasını tanımlamak için bir temel sınıf kullanıyorum, ancak bir tanesi doğrudan arabirimi uygulayan veya temel sınıfı genişleten ve bazı yöntemleri geçersiz kılan çok özelleştirilmiş alanlar ekleyebilir.

Bu noktada formu görüntülemek için her şeye sahibiz, şimdi alanları doğrulamak ve kaydetmek için bir şeye ihtiyacımız var.

7: Custom_Reg\Saversınıf

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

}

Bu sınıf, validatealanları dolaştıran, bunları doğrulayan ve iyi verileri bir diziye kaydeden bir ( ) 2 ana yönteme sahiptir , ikincisi ( save) tüm verileri veritabanına kaydeder ve e-posta yoluyla yeni kullanıcıya parola gönderir.

8: Tanımlanmış sınıfları kullanmak: Custom_Regsınıfı bitirmek

Şimdi tekrar Custom_Regsınıfta çalışabiliriz , tanımlanan nesneyi "yapıştırma" yöntemlerini ekleyerek bunları çalıştırabiliriz.

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

}

Sınıfın yapıcı bir örneğini kabul Formve biri Saver.

init()yöntem (kullanma checkUrl()) sonra url'nin ilk bölümüne home_url()bakar ve doğru noce ile eşleşirse, formun zaten gönderilip gönderilmediğini kontrol eder, eğer öyleyse Savernesneyi kullanarak kullanıcı verilerini doğrular ve saklar, aksi takdirde sadece formu yazdırır .

init()yöntem 'custom_reg_form_init', form örneğini argüman olarak geçen eylem kancasını da ateşler : bu kanca, alanlar eklemek, özel şablonu ayarlamak ve ayrıca form yöntemini özelleştirmek için kullanılmalıdır.

9: Bir şeyleri bir araya getirmek

Şimdi ana eklenti dosyasını yazabileceğiz, nereye yapabiliriz

  • tüm dosyaları gerektir
  • textdomain'i yükleyin
  • Oldukça erken olan bir kanca kullanarak, örneğe hazır Custom_Regsınıf ve çağrı init()yöntemini kullanarak tüm süreci başlatmak
  • Form sınıfına alanları eklemek için 'custom_reg_form_init' kullanın

Yani:

<?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: Kayıp görevler

Şimdi her şey çok güzel bitti. Sadece şablonu özelleştirmek zorundayız, muhtemelen temamıza özel bir şablon dosyası ekliyoruz.

Bu yolla yalnızca özel kayıt sayfasına özel stiller ve komut dosyaları ekleyebiliriz.

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

Bu yöntemi kullanarak, müşteri tarafı doğrulamasını yapmak için bazı js betiklerini sıkıştırabiliriz, örneğin bu . Bu betiğin çalışmasını sağlamak için gereken işaretleme, Custom_Reg\BaseFieldsınıfı düzenlemeyle kolayca yapılabilir .

Kayıt e-postasını özelleştirmek istiyorsak, standart yöntemi kullanabiliriz ve metada kaydedilmiş özel verilerimiz varsa, bunları e-postada kullanabiliriz.

Muhtemelen uygulamak istediğimiz son görev, varsayılan kayıt formuna olan talebi engellemektir, bu kadar kolay:

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

Tüm dosyalar burada bir Gist'te bulunabilir .


1
Vay, bu kayıt fonksiyonelliğinin tamamen yeniden tasarımı! Yerleşik kayıt işlemini tamamen geçersiz kılmak istiyorsanız, bu muhtemelen iyi bir çözümdür. Yerleşik kayıt formunu kullanmamanın iyi bir fikir olmadığını düşünüyorum çünkü kayıp şifre formu gibi diğer temel özellikleri kaybedeceksiniz. Ardından, yeni kayıtlı bir kullanıcının oturum açmak için geleneksel arka uç giriş formunu görüntülemesi gerekir.
Fabien Quatravaux

1
@FabienQuatravaux şifrenizi kaybetti ve giriş formu her zamanki gibi kullanılabilir (arka uç). Evet, kod eksik çünkü şifre ve giriş formu kaybedildi, ancak OP sorusu sadece kayıt formu ile ilgiliydi ve cevap başka işlevler eklemek için çok uzun
sürdü

13

TLDR; Temanız aşağıdaki formu koyun nameve idnitelikleri önemlidir:

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

Fantezi bir Wordpress Kayıt Formu'nun baştan başlatılması üzerine mükemmel bir Tutsplus makalesi buldum . Bu, formu şekillendirmek için zamanının çoğunu harcıyor, ancak gereken wordpress kodunda oldukça basit bir bölümü var:

4. Adım. WordPress

Burada süslü bir şey yok; sadece wp-login.php dosyasında gizlenmiş iki WordPress parçacığına ihtiyacımız var.

İlk pasaj:

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

Ve:

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

Düzenleme: Yukarıdaki kod parçacıklarını nereye koyacağınızı açıklamak için makaleden fazladan bir bit daha ekledim - bu sadece bir formdur, böylece herhangi bir sayfa şablonuna veya kenar çubuğuna gidebilir ya da bir kısa kod yapabilir. Önemli kısım, formyukarıdaki pasajları ve gerekli olan önemli alanları içeren bölümdür .

Son kod şöyle görünmelidir:

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

Lütfen metin girişinizde bir ve bir nitelik olarak bulunmanın gerçekten önemli ve gerekli olduğunu unutmayın ; aynısı e-posta girişi için de geçerlidir. Aksi takdirde, işe yaramaz.user_loginnameid

Ve bununla işimiz bitti!


Harika çözüm! Basit ve verimli. Ama bu pasajları nereye koydun? Bir kenar çubuğunda mı? Bu ipucu sadece bir ajax kayıt formu ile çalışmak için dikiş yapar.
Fabien Quatravaux

1
Teşekkürler @FabienQuatravaux, Cevabını makalenin son bölümünü içerecek şekilde güncelledim. AJAX formuna gerek yoktur - sadece wp-login.php?action=registersayfaya gönderilen POST formu
icc97


4

Bir süre önce, ön uçta özelleştirilmiş bir kayıt formu görüntüleyen bir web sitesi yaptım. Bu web sitesi artık yayında değil, işte bazı ekran görüntüleri. Giriş Formu Kayıt formu kayıp şifre formu

İşte izlediğim adımlar:

1) Tüm ziyaretçiler için Ayarlar> Genel> Üyelik seçeneği üzerinden yeni bir hesap isteme olasılığını etkinleştirin. Kayıt sayfası şimdi /wp-login.php?action=register adresinde görünmektedir.

2) Kayıt formunu, sitenizin ön yüzü gibi görünecek şekilde özelleştirin. Bu daha zor ve kullandığınız temaya göre değişir.

İşte yirmi on üç ile bir örnek:

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

Ardından, formun istediğiniz gibi görünmesini sağlamak için tema stil sayfasını değiştirin.

3) Görüntülenen mesajları ayarlayarak formu daha da değiştirebilirsiniz:

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) Bir ön uç kayıt formuna ihtiyacınız varsa, muhtemelen kayıtlı kullanıcıların giriş yaptıklarında arka uçlarını görmesini istemeyeceksiniz.

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

Çok fazla adım var ama sonuç burada!


0

Çok daha kolay: denilen bir WordPress işlevini kullanın wp_login_form()( burada Kodeksi sayfası ).

Kendi eklentinizi oluşturabilir, böylece sayfalarınızda kısa kod kullanabilirsiniz.

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

}

Tek yapmanız gereken, ön formdaki formunuzu şekillendirmek.


-1

Eklenti kullanımına açıksanız, daha önce Gravity Formları için Kullanıcı Kaydı eklentisini kullandım, çok iyi çalıştı:

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

Düzenleme: Bunun çok ayrıntılı bir çözüm olmadığını biliyorum, ancak tam olarak ihtiyacınız olanı yapıyor ve iyi bir çözüm.

Düzenleme: Cevabımı daha da genişletmek için, yerçekimi formları için Kullanıcı Kaydı eklentisi, Gravity Formları kullanılarak oluşturulan bir formdaki tüm alanları kullanıcıya özel alanlara eşlemenizi sağlar. Örneğin, Ad, Soyadı, E-posta, Web Sitesi, Şifre ile bir form oluşturabilirsiniz. Gönderildikten sonra, eklenti bu girişleri ilgili kullanıcı alanlarıyla eşleştirir.

Bu konuda bir başka harika şey de, kayıtlı kullanıcıları onay sırasına ekleyebilmenizdir. Kullanıcı hesapları yalnızca arka uçta bir yönetici tarafından onaylandıktan sonra oluşturulabilir.

Yukarıdaki bağlantı koparsa, yalnızca Google "Yerçekimi Formları için Kullanıcı Kaydı eklenir"


2
Soruya eklenen @kaiser notlarını okudunuz mu (cesur mayın): " Bazı açıklamalar ve bağlam sağlayan uzun cevaplar arıyoruz . Sadece bir satırlık cevap vermeyin; cevabınızın neden doğru olduğunu, ideal olarak alıntı içermiyor. Açıklama içermeyen cevaplar kaldırılabilir "
gmazzap

Yaptım, ama eklentinin hala bahsetmeye değer olduğunu hissettim, çünkü OP özel kodlama gereğinden bahsetmiyor. Gerekli olduğunu düşünüyorsanız, bir yoruma taşımak için
James Kemp

Ben bir mod değilim, bu yüzden cevabınızı yorumlamak için hareket edemiyorum. Sadece oy kullanabilirim ama bunu yapmadım, çünkü bağlantınızın faydalı bilgiler içerdiğini düşünüyorum, ancak yalnızca bağlantı yanıtı kullanışlı değil, çünkü bu bağlantı kolayca değiştirilebilir ve bu nedenle yanıtınız 404'e ulaşabilir. Burada ilgili kodu rapor etmeye çalışın ve bu kodun ne yaptığını açıklayın, cevabınız iyi, sanırım.
gmazzap

James, lütufu kod içeren gerçek bir cevaba verdim . Ek bir ödül istiyorsanız, lütfen eklentiyi ayırın ve tam olarak ne yaptığını gösterin. Teşekkürler.
kaiser

Merhaba Kaiser, ödülün peşinde değilim, sadece eklenti hakkındaki bilgimi paylaşmak istedim!
James Kemp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.