2

我正在使用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 连接来检查并实际创建会话。有任何想法吗?

4

2 回答 2

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>

我希望这有帮助。

于 2012-11-16T22:20:02.797 回答
0

是啊。WordPress 的 Rewrite API 正在踩着你。当您提交表单时,脚本会尝试回发给自己。WordPress 获取http://your-site.com/login并将其重写为 http://your-site.com/wp-login.php

这是修复它的方法。

在 WordPress 中创建一个页面,将其命名为login,然后将自定义页面模板分配给您将在下一步中创建的页面。

现在您需要创建一个自定义页面模板,将其放在您当前活动的主题文件夹中,并将以下代码放入其中:

<?php

/*
 * Template Name: Login
 */

// Put the code for your login here.

?>

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

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

那应该可以很好地解决问题。:)

于 2012-11-16T06:40:06.483 回答