PRE_GET_POST和$QUERY->IS_PAGE()的奇怪问题

时间:2017-07-14 作者:Mayeenul Islam

在我虚构的插件中使用了以下代码来重定向页面中未登录的用户173 (ID)至sample-page (缓动)。代码运行良好。但就在今天,我发现该代码在Firefox中引起了注意。

当我试图从Settings»Reading中将静态页面设置为首页时,出现了这个问题。

Notice: 正在尝试获取中非对象的属性/wp-includes/class-wp-query.php 在线3760Notice: 正在尝试获取中非对象的属性/wp-includes/class-wp-query.php 在线3762Notice: 正在尝试获取中非对象的属性/wp-includes/class-wp-query.php 在线3764

经过多次检查,我发现以下代码位导致了问题。具体而言,问题在于is_page(173).

add_action(\'pre_get_posts\', function($query) {
  if( $query->is_main_query() && ! is_admin() && ! is_user_logged_in() && $query->is_page(173) ) {
    wp_redirect(home_url(\'/sample-page\'));
    exit();
  }
});
我试着从$query->is_page(173)is_page(173) - 结果是一样的。

为了在空白安装中进行测试,我尝试禁用所有插件并设置默认主题Twenty16,然后重新安装WordPress以获得新的安装。我把下面的代码放在了2016年functions.php, 当调试打开时,here\'s what I got. (通知位于标题的黑色区域下,只需按Ctrl键+A键即可查看它们)您可以从以下位置检查重定向是否正常工作this page (173) 到this page 没有任何通知

我的代码有什么问题?

2 个回复
SO网友:Tom J Nowell

pre_get_posts 不适合此用途,而应使用template_redirect 过滤器,例如。

add_action( \'template_redirect\', funnction() {
    if ( ! is_user_logged_in() && is_page( 123 ) ) {
        wp_safe_redirect( home_url( \'/sample-page\' ) );
        exit;
    }
} );

SO网友:Tom

关闭调试模式,它就会消失,至少对我有用。我知道这是一个老帖子,但我只是想帮助有同样问题的人。

结束

相关推荐