全局var post和get_post之间有什么区别?

时间:2013-07-13 02:11:18

标签: wordpress

我使用the_posts过滤器为每个查询的帖子添加一个对象。访问添加的对象时,使用$postget_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帖子上工作一样。

2 个答案:

答案 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对象。