pre_get_posts redirecting

时间:2013-08-05 作者:theodorhanu

是否有可能将访问者重定向到主页,例如,如果不允许他们查看页面/帖子的内容,请使用pre\\u get\\u posts操作?

我正在尝试开发一个简化的会员插件,我想测试当前用户/当前访问者是否可以查看页面/帖子的内容。为此,我想从wp\\U查询中检索查询到的帖子id,并测试用户/访问者是否可以查看他请求的内容。如果他不能,我想把他重定向到错误页面。

我还使用类来封装一些数据。下面是一段代码:

class Public {
    public function __construct() {
        add_action(\'pre_get_posts\', array($this, \'try_redirect\'));
    }

    private function try_redirect() {
        wp_redirect( home_url() ); // doesn\'t work
    }
}
如果这不可能,你能给我另一个主意吗?谢谢

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

您只能允许注册用户通过以下方式查看您的内容

1.此解决方案仅对登录用户进行后期显示

class RavsPublic {
    function __construct() {
        add_action(\'pre_get_posts\', array($this, \'try_redirect\'));
    }

    function try_redirect( $query ) {
        // not on home page and not login
        if( !is_home() && !is_user_logged_in() ){
            // send them to home page
            wp_redirect( home_url() );
            exit();
            return $query;
        }
        return $query;
    }
}
new RavsPublic();
2)如果每个帖子都包含一个可以查看该帖子的用户列表(作为帖子元),则此解决方案。

//show your content only to registered users
class RavsPublic {
    function __construct() {
        add_action(\'pre_get_posts\', array($this, \'try_redirect\'));
    }

    function try_redirect( $query ) {

        global $current_user;
        get_currentuserinfo();

        //current user login name
        $user = $current_user->user_login;

         $allowed_user_list = False;

        //if visiter visiting a post
        if( $query->query_vars->is_single ){

            //retrieve post
            $args=array(
                \'name\' => $query->query_vars->name,
                \'post_type\' => \'post\',
                \'post_status\' => \'publish\',
                \'posts_per_page\' => 1
            );
            $my_posts = get_posts( $args );

            //retrieve post meta which contain allowed user list
            $allowed_user_list = get_post_meta( $my_posts[0]->ID, \'allowed_user_list\');

            //check if user exist in allowed user list
            $is_user_allowed = in_array( $user, $allowed_user_list );
        }

        //redirect visiter to home page if he\'s not allowed to see this post or not login
        if( !is_home() && !is_user_logged_in() && !$is_user_allowed ){
            wp_redirect( home_url() ); // doesn\'t work
            exit();
            return $query;
        }

        return $query;
    }
}
new RavsPublic();

SO网友:Michael Lewis

你通常会想die(); 重定向后。而且,您不能在每个页面加载上都设置重定向,否则它将进入重定向循环。

尝试以下操作:

add_action(\'pre_get_posts\', \'wpse_109110\');
function wpse_109110(){
    if (is_single()){
        wp_redirect(home_url());
        die();
    }
}
如果您尝试访问单个帖子/页面,它将重定向到主页。

SO网友:s_ha_dum

public is a reserved word in PHP. 你会得到一个错误,直到你重命名它,至少我是这样做的。

其次,在实例化该类或静态调用重定向方法之前,不会发生任何事情。

class My_Public {
    public function __construct() {
        add_action(\'pre_get_posts\', array($this, \'try_redirect\'));
    }

    public function try_redirect() {
       wp_redirect( \'http://google.com\' ); // doesn\'t work
       die;
    }
}
// This
// $mp = new My_Public();
// or this
add_action(\'pre_get_posts\',array(\'My_Public\',\'try_redirect\'));
我可能更喜欢template_redirect 对于这种重定向,而不是pre_get_posts. 你有更多的信息要处理,你不需要明确的die; 具有template_redirect, 但上述方法确实有效。

还有其他更直接的答案是如何限制用户,但我想我会提到我注意到的,并向您展示如何让“测试”代码正常工作。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post