我相信官方的立场是WP_Query
在管理面板中。有一个trac ticket #18408 在这个完全相同的问题上。布恩说:
根本问题是wp_reset_postdata()
用于重置全局变量以匹配主查询。但在post.php
, 没有主查询-$post
使用手动填充全局get_post()
, 而不是通过正常的$wp_query
环
因为帖子是在管理面板中手动填充的,所以您将无法以传统方式重置它。如果您打印出global $wp_query
此时,您还会发现它是空的。
首选方法是使用get_posts()
不会覆盖global $post
对象
您可以手动保存global $post
对象,并在完成循环后手动重置它。尽管如此,我不知道这种方法的总体后果。使用起来更安全get_posts()
如果可能的话。
global $post;
$tmp_post = $post;
$posts_query = new WP_Query( $args );
if( $posts_query->have_posts() ) {
while( $posts_query->have_posts() ) {
$posts_query->the_post();
the_title();
}
$post = $tmp_post;
}
另一种解决方案可能是,特别是在管理面板中,存储
global $post
在
global $wp_query
对象期间
loop_start
. 例如:
/**
* Store the global $post object so we may reset it
*
* @return void
*/
function wpse377565_admin_post_storage() {
global $wp_query,
$post;
if( ! is_admin() ) {
return;
}
$wp_query->post = $post;
}
add_action( \'loop_start\', \'wpse377565_admin_post_storage\' );
The
wp_reset_postdata()
函数查找
$this->post
在全局$wp\\u查询对象中,该对象为空且在管理请求中可用。我们可以使用上面的动作挂钩来调用
wp_reset_postdata()
. 同样,我也不知道这样做的总体后果,请谨慎使用。