当前接受的答案会导致新帖子删除循环中的最后一个帖子,因为它不会更新帖子计数。这是我的修改版本,其中还包括:
- 支持空类别。
- 只有一个地方可以声明新帖子的ID。
- 添加 is_main_query() 作为评论中最初回答的人。
- 一个设置来决定是否应该附加或前置新帖子。
- 隐藏帖子的日期,否则你会得到类似 00000000 的东西。我本可以使用动态日期,但在不更新内容的情况下不断更新日期可能是不好的 SEO。
- 隐藏帖子的评论链接,因为它只是指向主页。
- 控制帖子类型的设置。您可能更喜欢“页面”,因为“帖子”显示的是一般类别,我发现无法绕过。假设这是一件好事,“页面”在其他帖子中看起来也更加突出。
这是修改后的代码:
function virtual_post($query) {
$post_type = 'page'; // default is post
if (get_class($query)=='WP')
$query = $GLOBALS['wp_query'];
if ($query->is_main_query()) {
$append = true; // or prepend
// create the post and fill up the fields
$post = new WP_Post((object)array(
'ID' => -1,
'post_title' => 'Dummy post',
'post_content' => 'This is a fake virtual post.',
'post_date' => '',
'comment_status' => 'closed'
));
if ($post_type <> 'post')
$post->post_type = $post_type;
// add it to the internal cache, so WP doesn't fire a database query for it
if(!wp_cache_get($post->ID, 'posts')) {
wp_cache_set($post->ID, $post, 'posts');
if ($query->post_count==0 || $append)
$query->posts[] = $post;
else
array_unshift($query->posts, $post);
$query->post_count++;
}
}
}
$virtual_post_settings = array('enable' => true, 'include_empty_categories' => true);
if ($virtual_post_settings['enable']) {
if ($virtual_post_settings['include_empty_categories'])
add_action('wp', 'virtual_post');
else
add_action('loop_start', 'virtual_post');
}