1

更新:我自己回答了这个问题。见下文。

我想我要的是一个set_the_id()功能的等价物,如果存在的话。

我正在使用带有 Varnish 的 Wordpress 来提高性能,并且我想为侧边栏使用 ESI(Edge Side Include),因此可以比帖子内容本身更频繁地刷新诸如最近/热门帖子之类的内容。

这样做的一种方法是在你的插件目录等中创建一个端点,以便 Varnish 从 ESI 评论中访问,代码如下:

<?php
/* ESI handler for Varnish - Sidebar (all tabs except search) */

$cwd = getcwd();
$path = substr($cwd, 0, strpos($cwd, 'wp-content/'));
require $path . 'wp-blog-header.php';


    echo '<!-- ESI sidebar created '.date(DATE_RFC2822).' -->',"\n";
    if ( ! dynamic_sidebar( 'primary-widget-area' ) )
    {
        echo '<!-- Unable to load primary-widget-area (sidebar) -->';
    }
?>

到目前为止一切都很好;这足以加载 Wordpress 并找到所有相关插件。然而,它们会在不同的点(特别是wp-includes/post-template.php第 29 行)产生错误,因为它们需要使用诸如get_the_id()in_category()和 post 对象的属性来突出显示某些帖子等,并且尚未加载任何帖子。

如何告诉 Wordpress 在上面的代码中加载特定的帖子 ID,就好像我去了一个类似的 URL http://example.com?p=1,但没有输出完整的页面?我只想将环境设置为好像帖子处于活动状态,然后我可以在我的 ESI 调用中将当前帖子 ID 作为参数传递。

我认为query_posts()可能会有所帮助,我尝试添加:

query_posts( 'p=5' );

但它什么也没做。

我也想知道WP_Post::get_instance()(它似乎只接受一个对象,而不是一个帖子 ID)。

还有什么我可以使用的吗?

4

1 回答 1

0
$query = new WP_Query( 'p=1' );

if ( $query->have_posts() ) {
    $query->the_post();   // this loads it
}

有关所有其他参数,请参阅http://codex.wordpress.org/Class_Reference/WP_Query

于 2013-12-01T20:51:29.477 回答