CURRENT_USER_无法始终正常工作

时间:2014-07-20 作者:Ben Wainwright

我有一个自定义的Wordpress主题,其中包括一个仅限成员的部分。为了实现这一点,我在受限页面的顶部有以下代码。

<?php if ( ! current_user_can (\'view_players_area\') ) { header(\'Location: \' . wp_login_url( "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]" ) ); } ?>
大多数情况下,这很好用,但有时它只是无缘无故地不起作用。没有错误消息,只是在您登录时,它会不断重定向回登录页面。我最初使用is_user_logged_in() 并且有一个类似的问题,这就是导致我使用此代码的原因。

如果有人对可能导致这种情况的原因有任何建议,我将不胜感激——这让我毛骨悚然,因为会员区需要在未来几周内上线。

当做

Edit

根据回复和聊天室中一些用户的建议,我修改了代码,这样重定向就不会在模板中完成。现在在afunctions.php 包括以下内容:

<?php

function redirect_restricted_areas( $query )
{
    if ( !is_admin() && $query->is_main_query() )
    {
          if ( ! current_user_can( \'view_players_area\' ) && (
               $query->is_singular (\'player-page\') ||
               $query->is_post_type_archive (\'player-page\')
          ) ) 

          header(\'Location: \' . wp_login_url( "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]" ) );
    }

}

add_action ( \'pre_get_posts\', \'redirect_restricted_areas\' );
遗憾的是,虽然这是一个很好的建议,可以简化我的代码,但它并不能解决我的问题。

Further Edit

因此,通过一些调试,我可以看到$current\\u user并不总是被设置,但我不知道为什么。

Another Edit

进一步调查,这似乎与饼干有关。在了解了一些Wordpress认证cookies之后,我注意到以下内容。使用dBug(print_r()) 我确定,根据PHP,Wordpress auth cookie不存在,但如果打开Chrome inspector,我可以清楚地看到cookie就在那里。现在还不太清楚该怎么做,但如果有人能给我指出正确的方向。。。

4 个回复
SO网友:kaiser

不设置header 在模板文件中。这些是HTTP请求本身的一部分。

关于您的问题:

添加模板(您需要的任何文件-请参阅“模板层次结构”)。除此之外,您还包括默认的内容,如get_header(); 等等对于受限零件,您可以使用以下选项:

if ( current_user_can( \'view_players_area\' ) )
{
    // Code that you want to show to logged in users
    // with a capability of `view_players_area`
}
else
{
    # @link http://queryposts.com/function/wp_login_form/
    wp_login_form();
}

SO网友:MaximOrlovsky

将此代码与您的代码一起放在文件的顶部:

global $current_user;
if ( !$current_user->ID ) {
    get_currentuserinfo();
}

SO网友:Stephen Harris

你需要exit() 设置标题后(我建议使用wp_redirect()).

未经测试,但以下操作应该有效。如果真是这样的话current_user_can() 如果不起作用,我会首先禁用任何其他插件以排除冲突,然后检查用户是否确实拥有您认为他们应该拥有的权限。

function redirect_restricted_areas( $query )
{

    //Determine if we\'re on the log-in page
    global $pagenow;
    $on_login_page = in_array( $pagenow, array( \'wp-login.php\', \'wp-register.php\' ) );

    //If we\'re on the front-end and the main query is restricted
    //redirect the user if they do not have permission.
    if ( !$on_login_page && !is_admin() && $query->is_main_query() )
    {
          if ( ! current_user_can( \'view_players_area\' ) && (
               $query->is_singular (\'player-page\') ||
               $query->is_post_type_archive (\'player-page\')
          ) ) {

            $url = wp_login_url( "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]" );
            wp_redirect( $url );
            exit();
          }
    }

}
add_action ( \'pre_get_posts\', \'redirect_restricted_areas\' );

SO网友:Michael Ecklund

您可以尝试使用wp_redirect(); 还有钩子after_setup_theme (此时不应为任何输出)。

通过早期纾困创造更易于管理的条件。

这是我的看法,我想。。。

if(!function_exists(\'mbe_redirect_restricted_areas\')){
    function mbe_redirect_restricted_areas(){

        // Determine login page status.
        global $pagenow;

        // Do nothing on login page.
        if(in_array($pagenow, array(
            \'wp-login.php\',
            \'wp-register.php\'
        )){
            return false;
        }

        // Do nothing in admin area.
        if(is_admin()){
            return false;
        }

        // Do nothing if user is logged in and has capability.
        if(is_user_logged_in() && current_user_can(\'view_players_area\')){
            return false;
        }

        // Do nothing if not in player page area.
        if(stripos($_SERVER[\'REQUEST_URI\'], \'player-page\') === false){
            return false;
        }

        // Guests and users without capability.
        wp_redirect(wp_login_url("http://{$_SERVER[\'HTTP_HOST\']}{$_SERVER[\'REQUEST_URI\']}"));
        exit;

    }
    add_action(\'after_setup_theme\', \'mbe_redirect_restricted_areas\');
}

结束

相关推荐

Apply permissions per post

我们有一个WordPress网站,在那里我们有外部作者,我们在Editor 数量我们希望这些编辑能够创建新的帖子并修改他们自己的帖子,但偶尔我们会有一些正在进行的帖子,我们更希望保持更私密。这是一个非常小的用户池,需要“保护”的帖子数量甚至更少,所以我对任何需要为我们自己的用户明确授予权限或为外部用户明确拒绝权限的技术都没有意见。否认当然会更容易,但我不会太挑剔。