使用PRE_GET_POST的QUERIED_OBJECT获取通知和警告

时间:2021-08-20 作者:Brendan Jackson

我的代码在我的页面上得到了我想要的结果,我正在获取另一篇文章,我的主题正在按预期在页面上输出我需要的所有相关数据。

function replaceQuery( $query )  {
      
  if ( !is_admin() && $query->is_main_query() && $query->is_page ) {
        
    $childQuery = get_post(13);
    $query->queried_object->ID = $childQuery->ID;
    $query->queried_object->post_content = $childQuery->post_content;
    $query->queried_object->post_title = $childQuery->post_title;
    $query->queried_object->post_name = $childQuery->post_name;
    $query->queried_object->queried_object_id = $childQuery->post_name;
    $query->query_vars[\'page_id\'] = $childQuery->ID;
    $query->query_vars[\'p\'] = $childQuery->ID;
    
   }
}
 // I\'ve also used the "parse_query" hook
add_action( \'pre_get_posts\', \'replaceQuery\');
问题是,我收到了所有的警告和通知

Notice:  Indirect modification of overloaded property WP_Query::$queried_object has no effect in mycode.php on line 47

Warning:  Creating default object from empty value in mycode.php on line 47
我在这里发现了类似的问题is_category in pre_get_posts results in php notices

似乎我试图对WP查询对象进行更改太早或(在上面的情况下)太迟。我尝试用作条件的属性消除了许多错误,但当我添加任何其他内容时,它似乎破坏了代码。

我是否可以使用其他条件或其他挂钩来摆脱这些通知&;警告?

1 个回复
SO网友:KUMAR

不要修改queryed\\u object属性,而是使用set方法修改查询以获得所需的输出。下面的示例将起作用。仅使用查询中的一个,即page\\u id(设置页面id时)或post\\u in/p(分别设置post\\u id的数组或post\\u id时)。

function replaceQuery( $query )  {
  
   if ( !is_admin() && $query->is_main_query() && $query->is_page ) {
    
     $childQuery = get_post(13);

     //to set/query multiple post ids
     $query->set( \'post__in\', array( $childQuery->ID ) );

     //to set/query only a single post id
     $query->set( \'p\', $childQuery->ID );

     //to set/query page id
     $query->set( \'page_id\', $childQuery->ID );

  }

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

相关推荐

wordpress hooks

我目前正在使用woocommerce主题,Hotel(https://woocommerce.com/products/hotel/).我最近刚刚创建了一个主页和一个博客页面,其解释方式如下:https://www.wpbeginner.com/wp-tutorials/how-to-create-a-separate-page-for-blog-posts-in-wordpress/现在我想做的是:创建一个带有固定元素的主页,这些元素永远不会改变(如照片),然后添加一些动态元素(如博客中的帖子)……假设