Register Template

时间:2012-04-11 作者:uknowit2

我用一些ajax为Wordpress创建了一个注册模板,这样用户可以单击我标题中的注册链接,注册表单就会在一个灯箱中打开。由于某些原因,在提交时,如果出现错误或成功消息,我的表单将显示两次。感谢您的帮助。我很困惑,因为我的登录页面有几乎相同的代码,没有任何问题。代码如下:

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

/* Load registration file. */
require_once( ABSPATH . WPINC . \'/registration.php\' );

/* Check if users can register. */
$registration = get_option( \'users_can_register\' );

/* If user registered, input info. */
if ( \'POST\' == $_SERVER[\'REQUEST_METHOD\'] && !empty( $_POST[\'action\'] ) && $_POST[\'action\'] == \'adduser\' ) {
$user_pass = wp_generate_password();
$userdata = array(
    \'user_pass\' => $user_pass,
    \'user_login\' => esc_attr( $_POST[\'user_name\'] ),
    \'first_name\' => esc_attr( $_POST[\'first_name\'] ),
    \'last_name\' => esc_attr( $_POST[\'last_name\'] ),
    \'nickname\' => esc_attr( $_POST[\'nickname\'] ),
    \'user_email\' => esc_attr( $_POST[\'email\'] ),
    \'user_url\' => esc_attr( $_POST[\'website\'] ),
    \'aim\' => esc_attr( $_POST[\'aim\'] ),
    \'yim\' => esc_attr( $_POST[\'yim\'] ),
    \'jabber\' => esc_attr( $_POST[\'jabber\'] ),
    \'description\' => esc_attr( $_POST[\'description\'] ),
    \'role\' => get_option( \'default_role\' ),
);

if ( !$userdata[\'user_login\'] )
    $error = \'<span>A username is required for registration.</span>\';
elseif ( username_exists($userdata[\'user_login\']) )
    $error = \'<span>Sorry, that username already exists!</span>\';
elseif ( !is_email($userdata[\'user_email\'], true) )
    $error = \'<span>You must enter a valid email address.</span>\';
elseif ( email_exists($userdata[\'user_email\']) )
    $error = \'<span>Sorry, that email is already registered!</span>\';
elseif ( !$userdata[\'first_name\'] )
    $error = \'<span>Please kindly enter your First Name.</span>\';
elseif ( !$userdata[\'last_name\'] )
    $error = \'<span>Please kindly enter your Last Name.</span>\';

else {
    $new_user = wp_insert_user( $userdata );
    wp_new_user_notification($new_user, $user_pass);
    echo \'<div id="result" style="color:#FF0000">Thank you for Registering!<br/>Please check your email address. That\\\'s where you\\\'ll recieve your login password.<br/> (It might go into your spam folder)</div>\';
}

 }

?>

<!-- REGISTER FORM STARTS HERE -->

<?php if (!$new_user) { ?>

        <div id="error" style="color:#FF0000"><?php echo $error; ?></div>
        <div id="result" style="color:#FF0000"></div>

        <form method="post" id="adduser" class="user-forms" action="<?php echo "http://" . $_SERVER[\'HTTP_HOST\'] . $_SERVER[\'REQUEST_URI\']; ?>">

            <p class="form-username">
                <label for="user_name"><?php _e(\'Email Address *\', \'frontendprofile\'); ?></label>
                <input class="text-input" name="user_name" type="text" id="user_name" value="<?php if ( $error ) echo wp_specialchars( $_POST[\'user_name\'], 1 ); ?>" />
            </p><!-- .form-username -->

            <p class="first_name">
                <label for="first_name"><?php _e(\'First Name\', \'frontendprofile\'); ?></label>
                <input class="text-input" name="first_name" type="text" id="first_name" value="<?php if ( $error ) echo wp_specialchars( $_POST[\'first_name\'], 1 ); ?>" />
            </p><!-- .first_name -->

            <p class="last_name">
                <label for="last_name"><?php _e(\'Last Name\', \'frontendprofile\'); ?></label>
                <input class="text-input" name="last_name" type="text" id="last_name" value="<?php if ( $error ) echo wp_specialchars( $_POST[\'last_name\'], 1 ); ?>" />
            </p><!-- .last_name -->

            <p class="form-email" style="display:none">
                <label for="email"><?php _e(\'E-mail *\', \'frontendprofile\'); ?></label>
                <input class="text-input" name="email" type="hidden" id="email" value="<?php if ( $error ) echo wp_specialchars( $_POST[\'email\'], 1 ); ?>" />
            </p><!-- .form-email -->

            <p class="form-submit">
                <?php echo $referer; ?>
                <input name="adduser" type="submit" id="addusersub" class="submit button" value="Register" />
                <?php wp_nonce_field( \'add-user\' ) ?>
                <input name="action" type="hidden" id="action" value="adduser" />
            </p><!-- .form-submit -->

        </form><!-- #adduser -->

        <script type="text/javascript">
        //Username = Email on Register
        jQuery("#user_name").change(function(){
            $("#email").val($(this).val());
        });

        //Ajax for Error Messages
        jQuery("#addusersub").click(function() 
        {
            jQuery(\'#result\').html(\'Loading ...\').fadeIn();
            var input_data = $(\'#adduser\').serialize();
            $.ajax({
                type: "POST",
                url:  "<?php echo "http://" . $_SERVER[\'HTTP_HOST\'] . $_SERVER[\'REQUEST_URI\']; ?>",
                data: input_data,
                success: function(data){
                    $(\'#result\').html(data);
                }
            }); return false;
        });
        </script>


<?php }  ?>

<!-- REGISTER FORM ENDS HERE -->

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

您的表单显示了两次,因为您错误地处理了AJAX,并且使用了将表单显示为响应的模板。您需要将表单代码包装在一个if-else语句中,该语句检查当前是否有AJAX请求正在运行。

但更明显的是,您对AJAX的理解完全错误。WordPress有一个很好的有文档记录的API,它可以让您将所有代码从模板中取出,放到其他地方(并减少代码量)。

请参见此处了解如何:http://www.garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress/

e、 g。

// embed the javascript file that makes the AJAX request
wp_enqueue_script( \'my-ajax-request\', plugin_dir_url( __FILE__ ) . \'js/ajax.js\', array( \'jquery\' ) );

// declare the URL to the file that handles the AJAX request (wp-admin/admin-ajax.php)
wp_localize_script( \'my-ajax-request\', \'MyAjax\', array( \'ajaxurl\' => admin_url( \'admin-ajax.php\' ) ) );

// if both logged in and not logged in users can send this AJAX request,
// add both of these actions, otherwise add only the appropriate one
add_action( \'wp_ajax_nopriv_myajax-submit\', \'myajax_submit\' );
add_action( \'wp_ajax_myajax-submit\', \'myajax_submit\' );

function myajax_submit() {
    // get the submitted parameters
    $postID = $_POST[\'postID\'];

    // generate the response
    $response = json_encode( array( \'message\' => \'why hello there javascript, Im doing fine thankyou\' ) );

    // response output
    header( "Content-Type: application/json" );
    echo $response;

    // IMPORTANT: don\'t forget to "exit"
    exit;
}
javascript:

jQuery.post(
    // see tip #1 for how we declare global javascript variables
    MyAjax.ajaxurl,
    {
        // here we declare the parameters to send along with the request
        // this means the following action hooks will be fired:
        // wp_ajax_nopriv_myajax-submit and wp_ajax_myajax-submit
        action : \'myajax-submit\',

        // other parameters can be added along with "action"
        message : \'hello wordpress this is javascript, how are you?\'
    },
    function( response ) {
        alert( response );
    }
);
这样做将表单代码从AJAX注册逻辑中分离出来,使您描述的问题几乎不可能实现。

还要看看我链接的那篇文章中提到的jquery表单,它进一步简化了事情。

对于布朗尼点,当使用WordPress AJAX API时,WordPress定义常量DOING_AJAX 让您知道您正在进行AJAX调用。使用此选项可以跳过内容并在中添加其他可能很重要的内容

if(defined(\'DOING_AJAX\')){
    // AJAX only stuff...

结束

相关推荐

Ajax(JQuery)wp_Query分页返回-1

我目前正在为wordpress开发一个ajaxified主题。我列出了特定类别中的帖子,但单击后分页返回-1。假设我将showposts设置为3,并且一个特定类别有2篇帖子,指向以前帖子的链接不会按预期显示。现在,如果该类别有5篇帖子,则会显示指向以前帖子的链接,这也是意料之中的,但当我单击它时,会返回-1。这是我的代码:<?php $category = get_category_by_slug($_POST[\'catname\']); $wp_query = new WP_Qu