更新:我自己回答了这个问题。见下文。
我想我要的是一个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)。
还有什么我可以使用的吗?