我对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
}
}
}
}
谢谢
阿迪
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\' );
不确定什么是标准做法。但这是可行的。
谢谢