来源:http://www.ido321.com/1031.html


原文:Creating a Custom WordPress Registration Form Plugin

译文:创建一个定制的WordPress插件注冊表单

译者:dwqs

开门见山,WordPress提供了一个自己定义的注冊表单供新用户使用,或者当加入一个新用户到已经存在的WordPress网站。

可是假设你想实现一个自己定义的注冊表单而没有显示WordPress仪表盘的选项呢?

在这篇文章中。我们将学会怎么使用标签模板和短代码模板的联合体在WordPress中创建一个自己定义的注冊表单。

WordPress默认的注冊表单仅由两个字段组成—-username和邮箱。

这个仅有的username和邮箱表单字段使得注冊速度很的简单。首先,你输入一个username,然后输入邮箱,这个邮箱就是用来接收password的。

接下来。你使用邮箱接收到的password登陆网站,而且完毕个人资料,把password改动成简单易记得。

不过在网站注冊,而不是让用户区经历这些压力,那为什么除了username和邮箱之外,不提供一个直接的、包括一些额外重要的表单字段。比如password、个人的URL、个人简单介绍、昵称和他们的姓名的注冊表单供用户使用呢?

这对于像Tuts+的多用户站点是很实用的。

在这篇文章中,我们将使用下列的表单字段建立一个自己定义的表单注冊插件:

  • username
  • password
  • email
  • website URL
  • first name
  • last name
  • nickname
  • biography (or an about section)

这个自己定义表单插件能够通过使用短代码和联系模板整合到WordPress中。

利用短代码模板,你能够在你的网站中创建一个正式的注冊页面。你也能够再一篇发表的文章中是用短代码模板。这样用户就能够在阅读完你的文章之后进行注冊。

假设你想加入一个注冊表单在你站点側边栏的某个详细位置。你能够对WordPress主题中只期望放置标签模板的位置进行编辑,来创建须要的注冊表单。

在创建之前。须要注意的是,username、password和电子邮件字段是必需的。

当我们编写验证函数时,我们将强制运行这些规则。

构建插件

        正如说的那样,我们開始对插件编码。首先,包括插件的头部:

<?

php /* Plugin Name: Custom Registration Plugin URI: http://code.tutsplus.com Description: Updates user rating based on number of posts. Version: 1.0 Author: Agbonghama Collins Author URI: http://tech4sky.com */

 

           接下来。我们创建一个包括注冊表单的HTML代码的PHP函数:

function registration_form( $username, $password, $email, $website, $first_name, $last_name, $nickname, $bio ) {
    echo '
    <style>
    div {
        margin-bottom:2px;
    }
     
    input{
        margin-bottom:4px;
    }
    </style>
    ';
 
    echo '
    <form action="' . $_SERVER['REQUEST_URI'] . '" method="post">
    <div>
    <label for="username">Username <strong>*</strong></label>
    <input type="text" name="username" value="' . ( isset( $_POST['username'] ) ? $username : null ) . '">
    </div>
     
    <div>
    <label for="password">Password <strong>*</strong></label>
    <input type="password" name="password" value="' . ( isset( $_POST['password'] ) ? $password : null ) . '">
    </div>
     
    <div>
    <label for="email">Email <strong>*</strong></label>
    <input type="text" name="email" value="' . ( isset( $_POST['email']) ? $email : null ) . '">
    </div>
     
    <div>
    <label for="website">Website</label>
    <input type="text" name="website" value="' . ( isset( $_POST['website']) ? $website : null ) . '">
    </div>
     
    <div>
    <label for="firstname">First Name</label>
    <input type="text" name="fname" value="' . ( isset( $_POST['fname']) ? $first_name : null ) . '">
    </div>
     
    <div>
    <label for="website">Last Name</label>
    <input type="text" name="lname" value="' . ( isset( $_POST['lname']) ? $last_name : null ) . '">
    </div>
     
    <div>
    <label for="nickname">Nickname</label>
    <input type="text" name="nickname" value="' . ( isset( $_POST['nickname']) ? $nickname : null ) . '">
    </div>
     
    <div>
    <label for="bio">About / Bio</label>
    <textarea name="bio">' . ( isset( $_POST['bio']) ? $bio : null ) . '</textarea>
    </div>
    <input type="submit" name="submit" value="Register"/>
    </form>
    ';
}

 

请注意注冊字段是作为变量传递给上面的函数。在函数中,你会看到以下代码的演示样例:

( isset( $_POST['lname'] ) ?

$last_name : null )

 

这个三元操作符是检查全局变量数组$_POST是否包括数据,假设有数据,就把填充的表单字段值保存以便进入下一个字段。

除非你验证了表单数据而且清空了表单数据,一个注冊表单才干算完毕。否则就不算。因此,我们要创建一个名为registration_validation的表单验证函数。

为了简化验证的”痛苦”,我们能够使用WordPress中的 WP_Error 类。跟着我编写验证函数:

1、创建函数,并将注冊表单的字段值作为函数的參数传递进来

function registration_validation( $username, $password, $email, $website, $first_name, $last_name, $nickname, $bio )  {

 

2、实例化WP_Error 类。并把实例作为全局变量,以便于我们能够再函数的作用域之外使用。

global $reg_errors;
$reg_errors = new WP_Error;

 

3、记住:我们说的username、password和电子邮件是必填的,不要忽略了。为了运行这个规则,我们须要检查它们中不论什么一个是否为空。假设为空,我们就将错误信息追加给WP_Error 类的实例。

if ( empty( $username ) || empty( $password ) || empty( $email ) ) {
    $reg_errors->add('field', 'Required form field is missing');
}

 

4、我们也能够确保username的字符个数不小于4

if ( 4 > strlen( $username ) ) {
    $reg_errors->add( 'username_length', 'Username too short. At least 4 characters is required' );
}

 

5、检查username是否被注冊了

if ( username_exists( $username ) )
    $reg_errors->add('user_name', 'Sorry, that username already exists!');

 

6、利用WordPress的validate_username函数确保用户名是可用的

if ( ! validate_username( $username ) ) {
    $reg_errors->add( 'username_invalid', 'Sorry, the username you entered is not valid' );
}

 

7、确保用户输入的password的字符个数不小于5

if ( 5 > strlen( $password ) ) {
        $reg_errors->add( 'password', 'Password length must be greater than 5' );
    }

 

8、检查电子邮件是否有效

if ( !is_email( $email ) ) {
    $reg_errors->add( 'email_invalid', 'Email is not valid' );
}
                         9、检查电子邮件是否被注冊
if ( !is_email( $email ) ) {
    $reg_errors->add( 'email_invalid', 'Email is not valid' );
}

 

                        10.、假设用户填写了站点字段,须要检查其是否有效
if ( ! empty( $website ) ) {
    if ( ! filter_var( $website, FILTER_VALIDATE_URL ) ) {
        $reg_errors->add( 'website', 'Website is not a valid URL' );
    }
}

 

                        11、最后,我们在WP_Error实例中对错误进行循环。并显示个别的错误
if ( is_wp_error( $reg_errors ) ) {
 
    foreach ( $reg_errors->get_error_messages() as $error ) {
     
        echo '<div>';
        echo '<strong>ERROR</strong>:';
        echo $error . '<br/>';
        echo '</div>';
         
    }
 
}

 

     这样,验证函数就完毕了。接下来是complete_registration()函数。用于处理用户注冊。用户的注冊真正完毕是通过wp_insert_user函数,
用户的数据作为数据保存后能够作为此函数的參数。
            
function complete_registration() {
    global $reg_errors, $username, $password, $email, $website, $first_name, $last_name, $nickname, $bio;
    if ( 1 > count( $reg_errors->get_error_messages() ) ) {
        $userdata = array(
        'user_login'    =>   $username,
        'user_email'    =>   $email,
        'user_pass'     =>   $password,
        'user_url'      =>   $website,
        'first_name'    =>   $first_name,
        'last_name'     =>   $last_name,
        'nickname'      =>   $nickname,
        'description'   =>   $bio,
        );
        $user = wp_insert_user( $userdata );
        echo 'Registration complete. Goto <a href="' . get_site_url() . '/wp-login.php">login page</a>.';  
    }
}

 

在上面的函数中,我们将$reg_errors作为WP_Error的实例,并将表单字段作为全局变量以便于能够再全局作用域中使用。

我们须要检查$reg_errors是否包括不论什么错误。假设没有错误,则将用户注冊信息插入到WordPress的数据库并用登陆链接来显示注冊完毕的信息。

然后。把所有我们之前创建的函数所有放在全局函数custom_registration_function()之中

function custom_registration_function() {
    if ( isset($_POST['submit'] ) ) {
        registration_validation(
        $_POST['username'],
        $_POST['password'],
        $_POST['email'],
        $_POST['website'],
        $_POST['fname'],
        $_POST['lname'],
        $_POST['nickname'],
        $_POST['bio']
        );
         
        // sanitize user form input
        global $username, $password, $email, $website, $first_name, $last_name, $nickname, $bio;
        $username   =   sanitize_user( $_POST['username'] );
        $password   =   esc_attr( $_POST['password'] );
        $email      =   sanitize_email( $_POST['email'] );
        $website    =   esc_url( $_POST['website'] );
        $first_name =   sanitize_text_field( $_POST['fname'] );
        $last_name  =   sanitize_text_field( $_POST['lname'] );
        $nickname   =   sanitize_text_field( $_POST['nickname'] );
        $bio        =   esc_textarea( $_POST['bio'] );
 
        // call @function complete_registration to create the user
        // only when no WP_error is found
        complete_registration(
        $username,
        $password,
        $email,
        $website,
        $first_name,
        $last_name,
        $nickname,
        $bio
        );
    }
 
    registration_form(
        $username,
        $password,
        $email,
        $website,
        $first_name,
        $last_name,
        $nickname,
        $bio
        );
}

 

我须要说明一下全局函数custom_registration_function()中有哪些代码。

首先,我通过检查$_POST['submit']是否是空来确定表单是否提交。假设提交了,我就调用

registration_validation()函数来验证用户提交的表单.

然后,确保表单数据的有效性并将有效的数据在表单字段域之后用一个变量命名。最后,调用

complete_registration()函数保存用户。我须要调用registration_form()函数来显示用户注冊表单。

我之前提到过,我打算用短代码模板来支持注冊插件。以下就是短代码模的支持代码:

// Register a new shortcode: [cr_custom_registration]
add_shortcode( 'cr_custom_registration', 'custom_registration_shortcode' );
 
// The callback function that will replace [book]
function custom_registration_shortcode() {
    ob_start();
    custom_registration_function();
    return ob_get_clean();
}

 

到这里为止,我们已经完毕了插件。以下的一张图片展示了注冊表单的外观。

注意,你可能不会得到全然同样的外观,由于WordPress网站的CSS样式不同。

应用插件

        为了在WordPress的文章页或独立页面使用这个插件。能够增加下面代码:[cr_custom_registration]

也能够加入列出的模板标记<?php custom_registration_function(); ?>.。这样能够让表单插件成

为WordPress主题的一个部分。

你能够从这篇文章的附加代码得到这个插件。

 

总结

   在这篇文章中,我们一步步创建了一个自己定义注冊表单并加入到WordPress网站。

你能够加入额外字段,进一

步扩展这个注冊表单,比如用户角色,AOL IM 账户,可是确保数据时有效的。

    假设你有不论什么问题或建议你。能够留下评论。


下一篇:怎样在站点中加入音乐