在自定义注册表上注册新用户后重定向至“谢谢”页面

时间:2018-05-25 作者:denis

到目前为止,我能够在我的Wordpress网站上创建“自定义注册表单”,并向注册用户发送一封激活邮件,其中包含激活链接。

我想做的是在注册过程结束后不久,用户会被重定向到一个“谢谢”页面。但当我向代码中添加wp\\u redirect()时;它给出的误差为“Cannot modify header information - headers already sent by...“”

下面是“自定义注册表”的代码

  <?php
/*
Template Name: Register Page
*/
?>
<?php wp_head(); the_post(); ?>

      <div class="half-d" id="account-log">

            <form method="post">

        <label class="reg-form-lab p-label">Last Name</label>
        <input type="text" value="" name="last_name" id="last_name" class="reg-form-inp"/>
        <label class="reg-form-lab">First Name</label>
        <input type="text" value="" name="first_name" id="first_name" class="reg-form-inp"/>
        <label class="reg-form-lab p-label">Email</label>
        <input type="text" value="" name="email" id="email" class="reg-form-inp"/>
        <label class="reg-form-lab p-label">Username</label>
        <input type="text" value="" name="username" id="username" class="reg-form-inp"/>
        <label class="reg-form-lab p-label">Password</label>
        <input type="password" value="" name="pwd1" id="pwd1" class="reg-form-inp"/>
        <label class="reg-form-lab p-label">Password again</label>
        <input type="password" value="" name="pwd2" id="pwd2" class="reg-form-inp"/>
        <div class="alignleft"><p><?php if($sucess != "") { echo $sucess; } ?> <?php if($err != "") { echo $err; } ?></p></div>
        <button type="submit" name="btnregister" class="button" id="wp-submit" >Submit</button>
        <input type="hidden" name="task" value="register" />
    </form>

      </div>


      <div class="half-d" id="social-log">


        <p class="new-acc" id="iscr"><a href="https://mywebpage/login">Sign in</a></p>


      </div>


<?php
    $err = \'\';
    $success = \'\';

    global $wpdb, $PasswordHash, $current_user, $user_ID;

    if(isset($_POST[\'task\']) && $_POST[\'task\'] == \'register\' ) {


        $pwd1 = $wpdb->escape(trim($_POST[\'pwd1\']));
        $pwd2 = $wpdb->escape(trim($_POST[\'pwd2\']));
        $first_name = $wpdb->escape(trim($_POST[\'first_name\']));
        $last_name = $wpdb->escape(trim($_POST[\'last_name\']));
        $email = $wpdb->escape(trim($_POST[\'email\']));
        $username = $wpdb->escape(trim($_POST[\'username\']));

        if( $email == "" || $pwd1 == "" || $pwd2 == "" || $username == "" || $first_name == "" || $last_name == "") {
            $err = \'Please don\\\'t leave the required fields.\';
        } else if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $err = \'Invalid email address.\';
        } else if(email_exists($email) ) {
            $err = \'Email already exist.\';
        } else if($pwd1 <> $pwd2 ){
            $err = \'Password do not match.\';
        } else {

            $user_id = wp_insert_user( array (\'first_name\' => apply_filters(\'pre_user_first_name\', $first_name), \'last_name\' => apply_filters(\'pre_user_last_name\', $last_name), \'user_pass\' => apply_filters(\'pre_user_user_pass\', $pwd1), \'user_login\' => apply_filters(\'pre_user_user_login\', $username), \'user_email\' => apply_filters(\'pre_user_user_email\', $email), \'role\' => \'subscriber\' ) );
            if( is_wp_error($user_id) ) {
                $err = \'Error on user creation.\';
            } else {
                do_action(\'user_register\', $user_id);
                $success = \'You\\\'re successfully register\';
            }

        }
        //wp_redirect(\'xxxxxxxxxxxxxxxxxx\');
    }
?>
以及我插入函数的代码。用于发送激活电子邮件的php文件如下:

add_action( \'user_register\', \'actuser_user_register\' );
function actuser_user_register( $user_id ) {

$user = get_user_by(\'id\',$user_id);

$user_email = stripslashes($user->user_email);

 $code = sha1( $user_id . time() );

update_user_meta( $user_id, \'activation_key\', $code );
update_user_meta( $user_id, \'activation_flag\', 0 );

$activation_link = add_query_arg( array( \'key\' => $code, \'user\' => $user_id ), get_permalink($id));

$firstName = get_user_meta($user->ID, "first_name", true);
$lastName = get_user_meta($user->ID, "last_name", true);

$to = $user_email;
$subject = \'Activation Required\';
$message = \'xxxxxxxxxxxxxxx\';


wp_mail( $to, $subject, $message);
//wp_redirect(\'xxxxxxxxxx\');
}

2 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

好的,很明显在这种情况下重定向不起作用。在发送标头之前不能输出任何HTML,重定向会发送标头。

最简单(但不好)的解决方案是将PHP代码移到该页面模板的顶部:

<?php
    /* Template Name: Register Page */

    $err = \'\';
    $success = \'\';

    global $wpdb, $PasswordHash, $current_user, $user_ID;

    if(isset($_POST[\'task\']) && $_POST[\'task\'] == \'register\' ) {

        ...
        wp_redirect(\'xxxxxxxxxxxxxxxxxx\');
        die();
    }

    wp_head(); the_post();
?>
  ...
  <div class="half-d" id="account-log">

        <form method="post">
        ...
        </form>

  </div>
  ...
你也必须die 执行重定向后的脚本。

但是这不是一个很好的方法。您不应该直接在模板中处理任何表单-模板用于显示站点,而不是用于处理任何数据和逻辑。

更好的方法是将表格发送给wp_admin_url(\'admin-post.php)\' and processing it using [admin\\u post\\u(操作)`]1.

SO网友:Rocky Walker

在注册用户后,使用此挂钩重定向到另一个页面。

add_action( \'user_register\', \'thankyou_page_redirect\', 10, 1 );

function thankyou_page_redirect( $user_id ) {

    $thankyoupage  = site_url(\'thank-you\');

    wp_redirect($thankyoupage);
    exit;

}

结束

相关推荐