WP_AUTHENTICATE但未登录

时间:2017-11-08 作者:BadAddy

我对Wordpress的所有东西都很陌生,似乎真的被我读到的东西弄糊涂了。

我正在做的是为一个特定的工作创建一个插件,登录后我只需更改菜单。现在我使用DIVI 2作为一个主题,我在函数中有这个主题。插件的php:

function my_wp_nav_menu_args( $args = \'\' ) {

if( is_user_logged_in() ) {
    $args[\'menu\'] = \'UserMenu\';
} else {
    $args[\'menu\'] = \'MainMenu\';
}
return $args;
}
add_filter( \'wp_nav_menu_args\', \'my_wp_nav_menu_args\' );
这似乎有道理,但不起作用,我不确定这是Divi2,还是经过多次测试,用户没有登录。它一直是假的is_user_logged_in().

以下是我用于自定义登录的代码:

<?php
/**
 * Created by PhpStorm.
 * User: Andrew
 * Date: 08/11/2017
 * Time: 11:21
 */
global $wpdb;
$userOK = -1;
print_r(is_user_logged_in());
if(is_user_logged_in()) { //This does not action, ever!
    ?>
    <script>
     window.location.href = "https://URL.uk/userhome/";
    </script>
    <?php
}

if($_POST[\'wd_resendActivationButton\'] === \'resend\') {
    sendActivation($_POST[\'userid\'], $_POST[\'useremail\'],"2");
}

if($_POST[\'loginEmail\'] && $_POST[\'loginPassword\'] && !$_POST[\'wd_resendActivationButton\']){
    $userOK = 0;
    $user = wp_authenticate( $_POST[\'loginEmail\'] , $_POST[\'loginPassword\'] );
    if(is_wp_error($user)) {
        echo $user->get_error_message();
    } else {
        if($user->user_status === "0") {
            wp_logout();
        } else {
            ?>
            <script>
                window.location.href = "https://url.uk/userhome/";
            </script>
            <?php
        }
    }
}
据我所知,wp_authenticate 用户也登录了,但似乎没有这样做。所以不知道问题出在哪里。有人能给我指一下正确的方向吗?

UPDATE

使用以下代码,很明显wp\\U身份验证失败,尽管它确实给了我用户对象,但它不会让用户登录:

    if($_POST[\'loginEmail\'] && $_POST[\'loginPassword\'] && !$_POST[\'wd_resendActivationButton\']){
    $userOK = 0;
    $user = wp_authenticate( $_POST[\'loginEmail\'] , $_POST[\'loginPassword\'] );
    if(is_wp_error($user)) {
        echo $user->get_error_message();
    } else {
        if($user->user_status === "0") {
            wp_logout();
        } else {
            if(is_user_logged_in()) {
                ?>
                <script>
                    console.log(\'logged in\');
                    window.location.href = "https://URL.uk/userhome/";
                </script>
                <?php
            } else {
                ?>
                <script>
                    console.log(\'Not logged in\');
                    window.location.href = "https://URL.uk/";
                </script>
                <?php
            }
        }
    }
}
谢谢

阿迪

2 个回复
SO网友:gdfgdfg

wp_authenticate() 只检查用户数据,但不实际验证-docs.

您可以使用wp_signon, 使用和wp_authenticate: source, 像这样:

    $credentials = [
        \'user_login\' => $name,
        \'user_password\' => $password,
        \'rememberme\' => true,
    ];

    $signon = wp_signon($credentials, true); // true - use HTTP only cookie

    if(is_wp_error($signon)){
        return false;
     }
     // The user is logged in redirect, return true, etc.

SO网友:BadAddy

我设法找出了原因。但我觉得奇怪的是,关于它的信息如此之少。无论如何,我希望这可以帮助其他人在未来:

    if($_POST[\'loginEmail\'] && $_POST[\'loginPassword\'] && !$_POST[\'wd_resendActivationButton\']){
    $userOK = 0;
    $user = wp_authenticate_username_password(NULL, $_POST[\'loginEmail\'] , $_POST[\'loginPassword\'] );
    wp_set_current_user($user->ID, $user->user_email);
    wp_set_auth_cookie($user->ID);
    do_action(\'wp_login\', $user->user_email);
    if(is_wp_error($user)) {
        echo $user->get_error_message();
    } else {
        if($user->user_status === "0") {
            wp_logout();
            $userOK =1;
        } else {
            if(is_user_logged_in()) {
                $nonce = wp_create_nonce();
                function my_wp_nav_menu_args( $args = \'\' ) {
                        if ( is_user_logged_in() ) {
                            $args[\'menu\'] = \'UserMenu\';
                        }
                        return $args;
                    }
                    add_filter( \'wp_nav_menu_args\', \'my_wp_nav_menu_args\' );
                ?>
                <script>
                    console.log(\'logged in\');
                    window.location.href = "https://URL.uk/userhome?loggedin=true&_wpnonce=<?php echo $nonce; ?>";
                </script>
                <?php
            } else {
                ?>
                <script>
                    console.log(\'Not logged in\');
                    window.location.href = "https://URL.uk/";
                </script>
                <?php
            }
        }
    }
}
我只想补充一点,我不确定菜单的过滤函数是否需要在这里,或者我是否可以将其放回函数中。php并使用:

 add_filter( \'wp_nav_menu_args\', \'my_wp_nav_menu_args\' );
不确定什么是标准做法。但这是可行的。

谢谢

结束

相关推荐

有关.htaccess和wp-login.php预防的问题

我注意到一个“错误”。我在教程中读到的htaccess规则。我试图做的是阻止访问wp登录。php使用非常常见。htaccess规则如下:<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_URI} ^(.*)?wp-login\\.php(.*)$ [OR] RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$ RewriteCond %{REMOTE_A