在显示前更改POST对象

时间:2018-02-16 作者:Kevin

下面是从the_post 钩这段代码在我们的一个实时站点上运行得很好,但我正在尝试在本地进一步开发该插件,而这已经不起作用了。

public function fetch_post_data( $post ) { 
  $post->post_content = \'This is a test.\';
}

add_action(\'the_post\', \'fetch_post_data\');
这当然是非常简单的,但它让人明白了这一点。我正在修改post对象,试图在内容输出到页面之前对其进行更改。正如我所说,这在我们的实时站点上运行得很好,但由于某些原因,在我的本地开发服务器上不起作用。疯狂的是如果我var_dump($post); 我可以看到$post 对象确实已使用我的新内容进行了更新。有没有更好的方法来做到这一点,这就是为什么它不起作用的原因?任何帮助都将不胜感激。

我知道这段代码很有效,因为它已经在一个实时站点上使用了,我知道它正在修改对象,因为当我转储它时,它会正确显示新值,我知道其他人正在通过google(即https://stackoverflow.com/questions/30007523/modifying-post-post-content-in-wordpress). 我只是不明白为什么WP在本地服务器上输出内容时,没有考虑更新的对象。

如果我发布以下内容,第一行输出我的新的修改内容,第二行输出旧的未修改内容。为什么它们不一样?

var_dump($post->post_content);
echo get_the_content();

2 个回复
SO网友:Nathan Johnson

get_the_content() 实际上不会返回post_content 来自全局的属性$post 对象相反,它返回全局变量的第一页$pages, 之前设置的the_post 吊钩已启动。看见L287 of wp-includes/post-template.

重置$pages 全局,您可以使用setup_postdata() 方法WP_Query 从传递的对象the_post

add_action( \'the_post\', \'wpse_the_post\', 10, 2 );
function wpse_the_post( $post, $query ) {
  $post->post_title = \'Foo\';
  $post->post_content = \'Yolo\';

  //* To prevent infinite loop
  remove_action( \'the_post\', \'wpse_the_post\' );
  $query->setup_postdata( $post );
  add_action( \'the_post\', \'wpse_the_post\', 10, 2 );
}
这是一种倒退,因为您需要两次设置post数据。但如果你打算使用the_post

我会使用两种不同的过滤器(the_titlethe_content).

SO网友:Kevin

我可以用以下方法解决这个问题。我不知道这是否合适,我也不明白为什么有必要这样做,但它正在做我现在需要它做的事情:

public function fetch_post_data($post) {
    add_filter( \'the_title\', function( $title) use ($post) {
            if(is_singular() && in_the_loop() && is_main_query() && $post->post_type === \'my_cpt\') {
                return $post->post_title;
            }
            return $title;
        } );

        add_filter( \'the_content\', function( $content ) use ($post) {
            if(is_singular() && in_the_loop() && is_main_query() && $post->post_type === \'my_cpt\') {
                return $post->post_content;
            }
            return $content;
        } );
}
如果有人对为什么现在有必要这样做有任何意见,我很乐意听听。

结束

相关推荐