Wordpress Session的插件和登录表单

时间:2012-11-16 05:07:20

标签: php wordpress

我使用的是Screets Wordpress Sessions插件,效果非常好。我遇到的问题是,我将通过不同的表等管理我的网站用户wordpress。我有我的注册表单工作,它是否发送确认电子邮件以阻止垃圾邮件。我遇到的问题是我的简单形式:

 mysql_connect("localhost", "%username%", "%password%") or die(mysql_error()); // Connect to database server(localhost) with username and password.
    mysql_select_db("%database%") or die(mysql_error()); // Select registration database.
    if(isset($_POST['name']) && !empty($_POST['name']) AND isset($_POST['password']) && !empty($_POST['password']) AND isset($_POST['name']) && !empty($_POST['name'])){
                $username = mysql_escape_string($_POST['name']);
                $password = mysql_escape_string(md5($_POST['password']));

                $search = mysql_query("SELECT username, password, active FROM %table% WHERE username='".$username."' AND password='".$password."' AND active='1'") or die(mysql_error()); 
                $match  = mysql_num_rows($search);

                if($match = 1){
                    $msg = 'Login Complete! Thanks';
                    //$email = $row['EmailAddress'];  
                    //;  
                    //$_SESSION['EmailAddress'] = $email;  
                    //$_SESSION['LoggedIn'] = 1; 
                    $session->set_userdata( 'username', $username);
                    header ("Location: /"); 
                }else{
                    $msg = 'Login Failed!<br /> Please make sure that you enter the correct details and that you have activated your account.';
                }
            }


        ?>
        <!-- stop PHP Code -->

        <!-- title and description -->  
        <h2>Login Form</h2>
        <p>Please enter your name and password to login</p>

        <?php 
            if(isset($msg)){ // Check if $msg is not empty
                echo '<div class="statusmsg">'.$msg.'</div>'; // Display our message and add a div around it with the class statusmsg
            } ?>

        <!-- start sign up form --> 
        <form action="" method="post">
            <label for="name">Username:</label>
            <input type="text" name="name" value="" />
            <label for="password">Password:</label>
            <input type="password" name="password" value="" />

            <input type="submit" class="submit_button" value="login" />
        </form>

自动重定向到我的wordpress登录,这不是我想要的。我之前被告知使用wp_users但我真的不想使用它或插件。有什么想法让它按照我需要的方式工作吗?

编辑:为了更好地澄清问题,任何点击提交的人都会被重定向到wp-login.php。该页面甚至没有跟随我的SQL连接检查并实际创建会话。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

更好的方法是使用 Ajax 来发送和保存您的数据。首先,将以下代码包含在functions.php

/**
* User Log in
*/
function sc_login( $params ){   
    global $wpdb;

    // You can check user here
    $sql = $wpdb->prepare( 
        '
            SELECT COUNT(*) FROM ' . $wpdb->prefix . ' users
            WHERE `email`  = %d
            AND `password` = %s
        ',
            $params['user_login'], $params['user_password']
    );
    $auth = $wpdb->get_var( $sql );

    if( $auth ) {
        // Log in system
    } else {
        // Username or password is wrong
    }
}
/**
* Ajax Submit
*/
function sc_ajax_callback() {

    // run function
    $response = call_user_func($_POST['func'], $_POST);

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

// Ajax Requests
add_action( 'wp_ajax_nopriv_sc_ajax_callback', 'sc_ajax_callback' );
add_action( 'wp_ajax_sc_ajax_callback', 'sc_ajax_callback' );

在您的主题中创建一个Ajax.js文件并添加以下代码:

(function ( $ ) { 
    jQuery(document).ready(function() {
        /**
        * Log in
        */
        $('#sc_login_form').submit(function() {

            jQuery.ajax({
                type: 'POST',
                url: sc_ajax.ajaxurl,
                data: $('#sc_login_form').serialize(),
                dataType: 'json',
                success: function(response, textStatus) {

                    // Show errors?
                    if( response.errors ){
                       // YOU CAN SHOW ERRORS HERE IF YOU WANT
                       // for instance, "Email is required!"

                    // successful log in
                    } else {
                       // refresh page (HERE IS THE POINT)
                       window.location.href = sc_ajax.REDIRECT_URL;
                   }

                    console.log(response);

                }
             });

            return false;

       });

   }); 
}( jQuery ));

现在我们需要本地化Ajax脚本。打开header.php并在wp_head();功能之前添加这些代码。 请勿忘记更改下的REDIRECT_URL变量:

// insert jquery
wp_enqueue_script( 'jquery' );

// ajax requests
wp_enqueue_script( 'sc-ajax-request', get_template_directory_uri() . '/Ajax.js', array( 'jquery' ) );

// prepare your ajax custom vars
$ajax_vars = array(
    'REDIRECT_URL'  => '', // (!) CHANGE THIS WITH URL WHERE YOU WANT TO GO
    'ajaxurl'   => admin_url( 'admin-ajax.php' )
);

wp_localize_script( 'sc-ajax-request', 'sc_ajax', $ajax_vars );

最后一步是编辑你的表格:

<form id="sc_login_form">
    <input type="hidden" name="action" value="sc_ajax_callback" />
    <input type="hidden" name="func" value="sc_login" />

    Email:
    <input type="text" name="user_login" />

    Password:
    <input type="password" name="user_password"/>

    <input type="submit" value="Log in" />
</form>

我希望这会有所帮助。

答案 1 :(得分:0)

啊,是的。 WordPress的Rewrite API正在踩到你。提交表单时,脚本会尝试回发给自己。 WordPress需要 http://your-site.com/login 并重写 它 http://your-site.com/wp-login.php

以下是修复方法。

在WordPress中创建一个页面,将其命名为登录,然后将custom page template分配给您将在下一步中创建的页面。

现在您需要创建custom page template,将其放在当前有效的主题文件夹中,并将以下代码放入其中:

<?php

/*
 * Template Name: Login
 */

// Put the code for your login here.

?>

最后,将下一行添加到主题的 functions.php:

add_rewrite_rule( '^login/?$', 'index.php?page_name=$matches[1]', 'top' );

那应该很好地完成这个伎俩。 :)