如何重定向到另一个帖子而不会导致标题已发送错误?

时间:2015-06-05 作者:Digamber

通常,以下代码适用于我的目的。我需要检查帖子是否属于某个类别,对照用户角色进行检查,并且仅允许用户在角色匹配时查看页面

function bbrew_check_wholesaler(){
    if( is_user_logged_in() ){

        if(!check_is_role(\'myrole\'){
            wp_redirect($page_to_redirct_to);
            exit;
        }
    }
    else{
            wp_redirect($page_to_redirct_to);
            exit;
    }
}
辅助函数为

function check_is_role($role){
    $current_user = wp_get_current_user();
    $user_roles = $current_user->roles;
    $user_role = $user_roles[0];
    if($user_role == $role){
        return true;
    }else{
        return false;
    }
    die;
}
wp\\u-loaded和init-hook都没有全局$post-loaded

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

假设您位于前端,您可以使用template_redirect 钩住你想要的东西:

function bbrew_check_wholesaler() {

    global $post;

    /**
     * If we are viewing a single post page that has the specified category "foobar"
     * and the user does not have the specified role "myrole" then redirect the user
     * away from this page.
     */
    if ( is_single() && has_category(\'foobar\', $post) && ! check_is_role(\'myrole\') ) {
        wp_safe_redirect(home_url(\'away-from-post\'));
        exit;
    }

}

add_action( \'template_redirect\', \'bbrew_check_wholesaler\' );
注:在上述示例中,我们可以放弃使用is_user_logged_in() 作为后续调用wp_get_current_user() 将返回空WP_User 对象(如果用户已注销)。

我会调整你的check_is_role() 功能如下:

function check_is_role($role){

    $current_user = wp_get_current_user();

    if ( in_array($role, $current_user->roles ) 
        return true;
    } else {
        return false;
    }

}
。。。因为您要检查的指定角色可能存在于roles 属性,并且仅在索引0处。

您可以进一步扩展上述回调函数,

。。。以确定post对象是否具有指定的术语或所需的术语。

结束

相关推荐