管理面板中的wp_Reset_postdata()出现问题

时间:2020-11-02 作者:SoloCrowd

我正在连接到“在编辑器之后编辑\\u form\\u”

add_action(\'edit_form_after_editor\', \'make_the_button_to_generate_a_report_number\');
function make_the_button_to_generate_a_report_number($post) {
检查我是否正在处理“出版物”的自定义帖子类型

if ($post->post_type != \'publications\') return;
创建一些参数,然后在WP\\u查询中运行这些参数

$new_query = new WP_Query($report_number_args);
使用这些数据做一些事情
然后我想重置$post 回到过去,所以我跑了

wp_reset_postdata();
但是$post 停留在我从新WP\\U查询()收到的最后一个项目上<我做错了什么?在处理自定义帖子类型时,是否有特殊的方法重置postdata

Update:在函数的开头和结尾,我有:

echo("<h4>the title = </h4>");
echo(the_title());
开始时,标题是我单击要编辑的自定义帖子类型的标题,如果我正在创建新帖子,则为空。最后,标题总是我查询的最后一篇文章。

1 个回复
最合适的回答,由SO网友:Howdy_McGee 整理而成

我相信官方的立场是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 $postglobal $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\' );
Thewp_reset_postdata() 函数查找$this->post 在全局$wp\\u查询对象中,该对象为空且在管理请求中可用。我们可以使用上面的动作挂钩来调用wp_reset_postdata(). 同样,我也不知道这样做的总体后果,请谨慎使用。

相关推荐

WP_REMOTE_POST不使用admin-post.php

我正在开发一个插件,它有一个长期运行的功能,用于设置自定义帖子类型的帖子负载。我想异步运行此函数。为了做到这一点,我尝试了以下方法:add_action( \'admin_post_my_action\', \'my_long_running_function\' ); $url = admin_url( \'admin-post.php\' ); $args = [ \'method\' => \'POST\', \'timeou