!is_admin()条件在管理页面中变为True

时间:2013-06-21 作者:Bakaburg

我需要用户重定向到登录,如果没有登录,一旦他们是,重定向到后端,如果他们试图看到前端页面。这是我的代码:

add_action( \'template_redirect\', function () {
    if(is_user_logged_in() ):
        bk1_debug(\'logged in\');
        if (!is_admin()):
            bk1_debug(\'not in admin, redirecting...\');
            wp_redirect(admin_url());
        endif;
    else:
        bk1_debug(\'not logged in, redirecting...\');
        wp_redirect(wp_login_url( admin_url() ));
    endif;

}, 10 );
当然不行了。。。出于某种原因“不在管理中,正在重定向…”在后端也被调用,甚至更好的是,在前端什么都不会发生!仅对未登录用户进行重定向。

有什么想法吗?

3 个回复
最合适的回答,由SO网友:Bakaburg 整理而成

下面是@s\\u ha\\u dum的建议,他指出用户无论如何都需要登录才能转到后端,“template\\u redirect”在后端不起作用(即使我的代码只在后端触发控制台消息),我将代码简化如下:

add_action( \'template_redirect\', function () {
    if(!is_admin()) wp_redirect(admin_url());
}, 10 );
但一切都没有改变。但我还是走到了前端,什么也没发生。我还尝试了“init”,什么都没有。

然后我想也许我在错误的时候调用了“template\\u redirect”,所以我混合了两个钩子:

add_action( \'init\', function () {
    add_action( \'template_redirect\', function(){
        if(!is_admin()) wp_redirect(admin_url());
    }, 10);
}, 10 );
这终于奏效了!!!

SO网友:s_ha_dum

重定向未登录用户是唯一在后端有效的方法:)。

你所描述的很奇特。template_redirect 是一个front-end 钩据我所知,你的代码永远不会在后端运行。您可以通过这一行演示:

add_action(\'template_redirect\',function() {die;});

你可以随心所欲地穿过后端,但如果你想到达前端,你什么也得不到。我真的认为你的分析是错误的。您的代码不应该在后端执行。

我把die; 并得到相同的结果。它不在后端执行。

您可能会看到“未登录”用户被拖到前端,此时代码会运行。

我所能想到的是,还有其他一些重定向,给人一种在后端执行的错觉。

在最初写这个答案时,我忽略了显而易见的问题。您不需要将“未登录”用户从后端重定向到登录屏幕。WordPress会自动这样做,或者应该这样做,除非有什么事情对你的网站造成了不明智的影响。

您真正需要的是:

add_action( 
  \'template_redirect\', 
  function () {
    wp_redirect(admin_url());
  }
  ,10
);
这几乎完全阻止了对前端的访问,这听起来就像您所描述的:

我需要用户重定向到登录,如果没有登录,一旦他们是,重定向到后端,如果他们试图看到前端页面。

这真的是你想要的吗?

SO网友:jave.web

您的功能说明:

在…上FRONT END 在显示模板之前执行此操作:
    ;如果用户已登录:         ;检查您是否不在管理页上(后端),如果您不在管理页上:              ;,转到管理员

     ;如果用户未登录:         ;重定向到登录,无论发生什么。。。

因此,您可以看到您的方法也有一些漏洞:-)wp_redirect() 医生说:

wp\\U重定向()does not exit 自动和should 几乎总是这样be followed by exit

你没有,这里的其他人也没有。。。

解决方案

从您所描述的内容来看,您希望在任何地方都做一些事情,无论做什么,为此,您可以想到2个“真正”的一般行动,这些行动对于执行来说是合乎逻辑的:

init - 自WordPress 1.5开始提供,在WordPress中仍然是最新的4.5, 虽然有很多插件都与之挂钩,但您可以使用add_action(...)\'s优先级设置为1。。。

set_current_user

自WordPress 2.0.1以来,在WordPress中仍然是最新的4.5; 医生说:

默认情况下更改用户后运行wp_set_current_user() 作用请注意wp_set_current_user() 也是一个“可插入”功能,意味着插件可以覆盖它(docs link)

在此之后,您可以确定您需要知道的一切:

无论用户是否登录-is_user_logged_in()

  • 无论您是在管理页面上还是在其他地方-is_admin()wp-login.php 或不是-$GLOBALS[\'pagenow\'] == "wp-login.php"
  • 代码

    add_action( \'set_current_user\', function(){  
      //"After user is set, do ..."
    
      //"If user IS logged in, but is NOT on any admin/backend page 
      //=> redirect to admin url and !exit current execution!"  
      if( is_user_logged_in() && ! is_admin() ){
        wp_redirect(admin_url());
        exit();
      }
    
      //"If user is NOT logged in and we are NOT on (default) login page
      //=> redirect to login page !and exit current execution!"
      if( ! is_user_logged_in() && ($GLOBALS[\'pagenow\'] != "wp-login.php") ){
        wp_redirect(wp_login_url());
        exit();
      }  
    
    } );
    
    在WordPress 4.5上进行了测试,在正面和正面都能像您所描述的那样工作&;后端。。。

    结束

    相关推荐

    已在GET_HEADER之前使用wp_reDirect在前端POST表单上发送的标头

    我已经处理了已经发送的标题的各种问题,检查了是否有空格,并确保在wp\\u重定向之后出现get\\u标题行,但我被卡住了。代码为:<?php if ( !is_user_logged_in()) { include (TEMPLATEPATH . \'/member.php\'); } else { ?> <?php if( \'POST\' == $_SERVER[\'REQUEST_METHOD\'] &&