我使用the_posts过滤器为每个查询的帖子添加一个对象。访问添加的对象时,使用$post
或get_post
会得到不同的结果
这是将对象附加到帖子的代码:
add_filter( 'the_posts', 'populate_posts_obj', 10,2 );
function populate_posts_obj( $posts, $query ){
if ( !count( $posts ) || !isset($query->query['post_type']) )
return $posts;
if( in_array( $query->query['post_type'], get_valid_grade_types())){
foreach ( $posts as $post ) {
if ( $obj = new Gradebook( $post->ID ) )
$post->gradebook = $obj;
}
}
return $posts;
}
然后,通过$post
访问obj,有时会获取obj,有时不会(即使是相同的帖子):
function get_the_gradebook(){
global $post;
return isset($post->gradebook) ? $post->gradebook : null;
}
通过get_post()
访问obj,始终获取obj:
function get_the_gradebook(){
global $post;
$p = get_post($post->ID);
return isset($p->gradebook) ? $p->gradebook : null;
}
我可以使用get_post()
版本,但如果我知道差异的原因会很有用。
如果你问我为每个帖子添加一个obj的原因,我认为WordPress可能会在第一时间处理缓存过程。然后,其他缓存插件可以在我的obj上工作,就像在标准WP帖子上工作一样。
答案 0 :(得分:0)
$ post是WordPress认为是当前的“帖子”(帖子/页面/自定义帖子类型),并且通常最终会为您提供您不太期待的数据。如果您在模板中执行WP_Query,或者使用的模板使用来自多个“帖子”的数据,则尤其如此。
通过将get_post()
与您想要数据的ID一起使用,您可以放心获得您真正想要的数据。
答案 1 :(得分:0)
让我们用一点伪代码解释你。我正在努力扩大我的方法,以便我的答案与StackOverflow相关,但我仍然不知道我可能会收到多少票。
简单的区别是$post
是一个变量而get_post()
是一种方法,这意味着由于多个依赖项,您可以预期get_post()
的输出不同,但$post
只会function get_post() {
return rand(0, 5);
}
$post = get_post(); /* lets assume random
value that was generated
this time was "2" */
当你明确地这样做时会改变。
让我们假设这样的事情
get_post()
现在,每次拨打$post
时,其值都会不断变化,但get_post()
的值始终为2.
回到wordpress的上下文,使用Loop中的get_post()
设置$ post,并对应引用当前网址的默认帖子ID的对象,其中{{1}}将采用将ID作为输入发布并返回post对象。