这很奇怪,默认情况下不应该发生。get_posts
使用WP_Query
. 如果您查看get_posts
, 传递给的所有参数get_posts
未更改地传递给WP_Query
除了以下参数category
已更改为cat
, 这个include
和exclude
参数,以包括或排除更改为的某些帖子post__in
和post__not_in
分别和numberposts
已更改为posts_per_page
.
1839 function get_posts( $args = null ) {
1840 $defaults = array(
1841 \'numberposts\' => 5, \'offset\' => 0,
1842 \'category\' => 0, \'orderby\' => \'date\',
1843 \'order\' => \'DESC\', \'include\' => array(),
1844 \'exclude\' => array(), \'meta_key\' => \'\',
1845 \'meta_value\' =>\'\', \'post_type\' => \'post\',
1846 \'suppress_filters\' => true
1847 );
1848
1849 $r = wp_parse_args( $args, $defaults );
1850 if ( empty( $r[\'post_status\'] ) )
1851 $r[\'post_status\'] = ( \'attachment\' == $r[\'post_type\'] ) ? \'inherit\' : \'publish\';
1852 if ( ! empty($r[\'numberposts\']) && empty($r[\'posts_per_page\']) )
1853 $r[\'posts_per_page\'] = $r[\'numberposts\'];
1854 if ( ! empty($r[\'category\']) )
1855 $r[\'cat\'] = $r[\'category\'];
1856 if ( ! empty($r[\'include\']) ) {
1857 $incposts = wp_parse_id_list( $r[\'include\'] );
1858 $r[\'posts_per_page\'] = count($incposts); // only the number of posts included
1859 $r[\'post__in\'] = $incposts;
1860 } elseif ( ! empty($r[\'exclude\']) )
1861 $r[\'post__not_in\'] = wp_parse_id_list( $r[\'exclude\'] );
1862
1863 $r[\'ignore_sticky_posts\'] = true;
1864 $r[\'no_found_rows\'] = true;
1865
1866 $get_posts = new WP_Query;
1867 return $get_posts->query($r);
1868
1869 }
唯一值得注意的区别是以下两行
1846 \'suppress_filters\' => true
1864 $r[\'no_found_rows\'] = true;
其中1846行是最重要的。默认情况下,
get_posts
不会被任何作用于
WP_Query
因为这在第1846行中是静音的。
WP_Query
默认情况下,由其上使用的任何外部过滤器更改,这适用于主查询和使用
WP_Query
. 这就是为什么使用诸如
is_main_query()
专门针对主查询。
同样非常重要的是要知道,任何写得不好、没有重置的查询都可能并且会干扰这两者WP_Query
和get_posts
也就是他们的输出。query_posts
也会破坏页面上的许多功能
要对此进行调试,您需要查找作用于WP_Query
或主查询,也可以查找pre_get_posts
. 查找任何自定义查询,并确保WP_Query
已用重置wp_reset_postdata()
. 如果您使用过setup_postdata( $post )
具有get_posts
, 然后你也需要重置它。删除对的任何使用query_posts
.
如果这不起作用,请切换到默认主题并再次测试。别忘了先清除浏览器和插件缓存。最后,逐个停用每个插件,然后进行测试。如果与插件相关,这将显示导致此问题的插件