0

我使用 the_posts 过滤器为每个查询的帖子添加一个对象。$post访问添加的对象时,我使用or得到不同的结果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;
}

然后,通过 obj 访问 obj $post,有时会得到 obj,有时不会(即使是同一篇文章):

function get_the_gradebook(){
  global $post;
  return isset($post->gradebook) ? $post->gradebook : null;
}

通过 访问 obj get_post(),始终获取 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 帖子上工作一样。

4

2 回答 2

0

$post 是 WordPress 认为的当前“帖子”(帖子/页面/自定义帖子类型),并且通常最终会为您提供您没想到的数据。如果您在模板中执行 WP_Query 或有一个使用来自多个“帖子”的数据的模板,则尤其如此。

通过使用get_post()您想要从中获取数据的 ID,您可以确信您正在获取您真正想要的数据。

于 2013-07-13T18:27:09.433 回答
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始终是 2。

回到 wordpress 的上下文,$post 是get_post()Loop内设置的,它对应于引用当前 URL 的默认帖子 ID 的对象,其中get_post()将帖子 ID 作为输入并返回帖子对象。

于 2013-07-13T18:35:40.567 回答