Wordpress 两步注册表单

Posted

技术标签:

【中文标题】Wordpress 两步注册表单【英文标题】:Wordpress two step registration form 【发布时间】:2017-04-04 02:32:02 【问题描述】:

我正在努力实现以下目标,但我不知道从哪里开始。

我正在尝试创建一个包含两个步骤的注册/注册表单。

第一步:是有 2 个输入字段(姓名、电子邮件),当用户提交时,会发送一封电子邮件,其中包含指向第二步的链接。

第二步:用户输入发送到他的电子邮件的链接,进入带有第二个表单的页面。具有他使用的电子邮件和姓名的值,+ 2 个其他字段(用户名、密码),他可以在其中访问某些页面。

我找不到从哪里开始,也没有插件符合以下条件。

问候,

穆斯塔法。

【问题讨论】:

请看我的回答***.com/a/40959220/1960558。它真的很长,但我希望你能轻松理解 gist 上的代码:gist.github.com/avastamin/b49481968fd5f984c1e9bd51f91779b4 【参考方案1】:

我想现在你可以在这里试试这个Contact form 7 Multi-Step Form 插件:

Contact Form 7 Multi-Step Forms

尝试演示here

稍后您可以了解如何通过您的才华开发此类注册表

【讨论】:

我想开发这样的东西,我只需要方法(:感谢插件你会研究它。【参考方案2】:

尝试使用this 插件来满足您的目的。

【讨论】:

【参考方案3】:

这里简要介绍了您可以采取的步骤。

确保用户是唯一的并存储用于确认的凭据。

if(!email_exists( $email ))

    /*
       Store credentials in a custom table 
       with a unique identifier, 
       hashed password and email. 

       Email user with the confirmation link ex.
       site.com/confirmation/<unique-identifier>
    */


confirmation 页面中,只需通过以下方式创建用户:

// Confirm <unique-identifier>

// Create user
$user_id = wp_create_user( $email, $password, $email );

// Set user role
$user = new WP_User( $user_id );
$user->set_role( 'contributor' ); // or a custom role

【讨论】:

感谢您的提醒,我希望得到进一步的解释。 @MostafaMohsen,我的回答的详细说明:***.com/a/40959220/1960558【参考方案4】:

    尝试创建自定义插件并创建 2 个短代码。

    创建 2 个页面并分别插入 2 个简码。

    在第一个短代码中编写表单代码,让用户输入他们的电子邮件地址和姓名。

    然后使用wp_insert_user 将详细信息(姓名和电子邮件地址)输入数据库,然后向该电子邮件地址发送一封电子邮件,生成指向第二页的链接并在链接中附加加密的用户 ID。

    当用户点击链接时,会将他们重定向到第二页,其中将使用选择查询自动填写姓名和电子邮件地址。

    在此页面中插入所有剩余的详细信息。

【讨论】:

【参考方案5】:

第 1 步

首先,您应该创建两个单独的模板(每个步骤一个)。 在第一个模板中,您应该创建一个将用户电子邮件发送到第二页的表单。该链接应具有GET 属性,以便您可以获取他的电子邮件和名字。这是一个例子(注意它可以改进):

<?php 
/*
** Template Name: Step 1
*/

get_header();

if ( !empty( $_POST['firstname'] ) && !empty( $_POST['email'] ) ) 
    $link = 'http://my-site/step-2';
    $link = add_query_arg(
        array(
            'firstname' => $_POST['firstname'],
            'email'     => $_POST['email'],
        ),
        $link
    );

    $subject = 'New user registration';
    $message = 'Please click on the following link to complete your registration: ' . $link;
    $headers = array('Content-Type: text/html; charset=UTF-8');

    $result = wp_mail( $_POST['email'], $subject, $message, $headers );

    if ( $result ) 
        $message = 'Please check your email address to complete the registration';
     else 
        $message = 'Something went wrong. Please contact the administrator';
    

    echo $message;
 else 
?>
    <form method="POST" action="">
        <input type="text" name="firstname" placeholder="First Name">
        <input type="email" name="email" placeholder="Email address">
        <input type="submit" value="Submit">
    </form>
<?php

get_footer();

我们创建一个简单的检查表单是否已提交并且所有字段都已填写。 如果是这样,我们可以发送电子邮件到第 2 步。


第 2 步

我们将创建一个单独的模板,我们将使用$_GET 填充第一个模板中的数据,我们将添加两个新字段(用户名和密码),它们将为空。

<?php 
/*
** Template Name: Step 2
*/

get_header();

if ( !empty( $_POST['firstname'] ) && !empty( $_POST['email'] ) && !empty( $_POST['password'] ) ) 
    $user_id = username_exists( $_POST['username'] );

    if ( !$user_id and email_exists($_POST['email']) == false ) 

        $user_id = wp_create_user( $_POST['username'], $_POST['password'], $_POST['email'] );

        if ( $user_id ) 
            update_user_meta($user_id, 'first_name', $_POST['firstname']);
            $message = 'User has been created';
        
     else 
        $message = 'User already exists!';
    

    echo $message;
 else 
?>
    <form method="POST" action="">
        <input type="text" name="firstname" value="<?php echo ( !empty( $_GET['firstname'] ) ) ? $_GET['firstname'] : '' ; ?>" placeholder="First Name">
        <input type="email" name="email" value="<?php echo ( !empty( $_GET['email'] ) ) ? $_GET['email'] : '' ; ?>" placeholder="Email Address">
        <input type="text" name="username" placeholder="Username">
        <input type="password" name="password" placeholder="Password">
        <input type="submit" value="Submit">
    </form>
<?php

get_footer();

如果提交了第二个表单并且一切正常,我们就可以创建用户。 创建后,我们可以更新它的名字。

您可以对我的代码进行无限修改,但这是基础。例如,我们可以将字段设为必填,我们可以检查密码强度、名称长度等。

【讨论】:

【参考方案6】:

试试这个对你有用https://www.sitepoint.com/building-a-multi-step-registration-form-for-wordpress/

【讨论】:

【参考方案7】:

我更喜欢使用简码。这是步骤。完整代码:Gist

    创建一个页面(注册)。例如[request_form action="/thanks"]

注意:thanks_func内你需要用户正确的url $confirmation_body_text = "/signup/?hid='.$hash.'";

    创建thanks 页面并添加此短代码:

    [thanks] Thank you page [/thanks]

    在用户数据库中创建新表:

    CREATE TABLEwp_new_user( idint(11) NOT NULL, namevarchar(40) NOT NULL, emailvarchar(80) NOT NULL, usernamevarchar(30) DEFAULT NULL, passwordvarchar(30) DEFAULT NULL, hashvarchar(40) DEFAULT NULL, created_at@987687335@366543654333varchar(40) DEFAULT NULL, created_at@987687335@367654@@36765@36654

在第一步中,将发送带有signup?hid=1679091c5a880faf6fb5e6087eb1b2dc之类的链接的电子邮件

因此,在第二步中,我们将从这个唯一的电子邮件哈希中获取现有用户记录,并预填充 nameemail 字段。

    在第二步,我们将更新现有的用户记录。

    函数 request_form_func($atts, $content = null) 提取(简码_atts(数组( 'id' => 假, '类' => 假, '标题' => 假, '副标题' => 假, '行动' => "/谢谢", '键' => 假, 'button_text' => "提交" ), $atts));

    if( $class )   $class = ' ' . $class; 
    else  $class = ''; 
    
    if( empty($_GET) )
        $next_step = false;
        $db_name = '';
        $db_email = '';
    
    if(isset($_GET['hid']))
        $email_hash = trim($_GET['hid']);
    
        $table = "wp_new_user";
        $project_data = new wpdb('root','root','wordpress','localhost');  // Testserver
        $rows = $project_data->get_results( $project_data->prepare(
            "
                SELECT id,name, email, hash FROM " . $table . "
                WHERE hash = %d
            ",
            $email_hash
        ) );
    
        $db_hash = $rows[0]->hash;
        if( $db_hash == $email_hash ) 
            $field_id = $rows[0]->id;
            $db_name = $rows[0]->name;
            $db_email = $rows[0]->email;
            $next_step = true;
        
    
    
    $out = '';
    
    if($id)  $id = '-'.$id; 
    
    $out .= '<div class="request_form'.$class.'">';
    $out .= '<div class="form-wrap">';
    if($title) 
        $out .= '<span class="title">' . $title . '</span>';
    
    $out .= '<form id="step-form" class="cf" method="post" action="'.$action.'">';
    $out .= '<div class="field-wrap"><label for="fullname'.$id.'"><span class="desc">Name</span>';
    $out .= '<input type="text" id="fullname'.$id.'" name="fullname" data-required="true" placeholder="Jon Doe" value="'.$db_name.'"></label></div>';
    
    $out .= '<div class="field-wrap"><label for="email'.$id.'"><span class="desc">E-Mail</span>';
    $out .= '<input type="email" id="email'.$id.'" name="email" data-required="true" placeholder="name@domain.com" value="'.$db_email.'"></label></div>';
    
    if($next_step)
        $out .= '<div class="field-wrap"><label for="username'.$id.'"><span class="desc">Username</span>';
        $out .= '<input type="text" id="username'.$id.'" name="username" data-required="true" placeholder="username"></label></div>';
    
        $out .= '<div class="field-wrap"><label for="password'.$id.'"><span class="desc">Password</span>';
        $out .= '<input type="password" id="password'.$id.'" name="password" data-required="true" placeholder="password"></label></div>';
    

    $out .= ''; $out .= '';

    $out .= wp_nonce_field('step_form', 'step_form_nonce'.$id, true, false);
    $out .= '</form>';
    $out .= '</div>';
    $out .= '</div>';
    return $out;
    

    add_shortcode('request_form', 'request_form_func');

    然后我创建感谢短代码thanks,它将处理您的表单数据。基本上,在第一步中,您需要保存数据,还需要生成唯一 ID 以通过电子邮件发送并保存到数据库。该链接将类似于“signup?hid=1679091c5a880faf6fb5e6087eb1b2dc”

    functionthanks_func($atts, $content = null) $out = '';

    if(!empty($_POST) || wp_verify_nonce($_POST['step_form_nonce'],'step_form'))
    
    else 
        $out .= '<div class="content-area">';
        $out .= '<h2 class="h1 page-title">Something went wrong</h2>';
        $out .= '<p class="block">Please Re-Submit your form again</p>';
        $out .= '</div>';
    
        return $out;
    
    
    if(isset($_POST['fullname'])) $fullname = trim($_POST['fullname']); 
    if(isset($_POST['email'])) $email = trim($_POST['email']); 
    
    if(isset($_POST['username'])) $username = trim($_POST['username']); 
    if(isset($_POST['password'])) $password = trim($_POST['password']); 
    if(isset($_POST['hash'])) $db_hash = trim($_POST['hash']); 
    $hash = md5( rand(0,1000) ); // Generate random 32 character hash and assign it to a local variable.
    
    $header .= "MIME-Version: 1.0\n";
    $header .= "Content-Type: text/html; charset=utf-8\n";
    $header .= "From:" . "admin@domain.com";
    
    $confirmation_text = "Thanks for Submitting your first form";
    $confirmation_body_text = "/registration/?hid='.$hash.'";
    
    $subject = "Please click the link below";
    $message = "Name: $fullname\n";
    $message .= "Email Address: $email\n";
    $message .= "Click the link: $confirmation_body_text\n";
    
    if (!empty($username) && !empty($password) && !empty($field_id))
        update_custom_user($username, $password, $$db_hash);
     else if (create_custom_user($fullname, $email, $hash) && wp_mail($email, $subject, $message, $header))
    
    
    
    $out .= '<div class="content-area">';
    $content = do_shortcode($content);
    $out .= $content;
    $out .= '</div>';
    
    return $out;
    

    add_shortcode('thanks', 'thanks_func');

我还编写了 2 个函数 create_custom_userupdate_custom_user,它们将保存第一步的数据数据并在第二步更新 usernamepassword

function create_custom_user($fullname, $email, $hash)
    global $wpdb;
    $table_name = $wpdb->prefix . "new_user";

    $cur_date = new DateTime();
    $cur_date->setTimezone(new DateTimeZone('Europe/Berlin'));
    $cur_date = $cur_date->format('d.m.Y').', '.$cur_date->format('G:i');


    $wpdb->insert( $table_name, array(
        'name' => $fullname,
        'email' => $email,
        'hash' => $hash,
        'created_at' => $cur_date

    ) );

    return true;



function update_custom_user($username, $password, $field_id)
    global $wpdb;
    $table_name = $wpdb->prefix . "new_user";

    $cur_date = new DateTime();
    $cur_date->setTimezone(new DateTimeZone('Europe/Berlin'));
    $cur_date = $cur_date->format('d.m.Y').', '.$cur_date->format('G:i');


    $wpdb->update( $table_name, array(
        'username' => $username,
        'password' => $password,
        'updated_at' => $cur_date
    ),
        array(
            "id" => $field_id
        ) );

    return true;

【讨论】:

以上是关于Wordpress 两步注册表单的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress - 在同一页面中单独的登录和注册表格

WordPress 登录和注册系统,例如 http://www.damnlag.com/

将 Wordpress 的登录/注册页面重定向到自定义登录/注册页面

wordpress contact-form-7 表单 代码如何调用?

将其他帐单注册字段与 WooCommerce 中的默认 Wordpress 字段同步

如何使用“主题我的登录”插件在 wordpress 登录表单中自动填写字段?