1

我使用 WordPress 博客,我想在不向数据库添加任何内容的情况下显示帖子。我想说的是:

我在页面加载时生成一个帖子,并将其添加到主页中。我已经搜索并找到wp_insert_post()了功能,但它也添加到了数据库中。我怎么能用php做到这一点?

例如: 有一个由查询生成的帖子数组。如何在页面加载之前将我的帖子插入该数组?

我想清楚我的想法。这是我想要的一步一步。

* 1) *我正在生成一个这样的数组 $arr['title] = "my title", $arr['content'] = "my content",

* 2) *WP 向数据库发送一个查询并且有帖子我是对的吗?并且有一个数组,显示在主题和主页上?此时我想将我的外部数组(在步骤 1 中生成)添加到这个数组(由 WP 通过查询生成)

3)通过这种方式,我将能够添加帖子而不将其添加到我的数据库中。

4

2 回答 2

2

您可以简单地将虚拟帖子作为原始 HTML 添加到您的主题模板之一中。

或者,如果您喜欢冒险,您可以修改主要查询结果并将您的帖子包含在其中:

add_action('loop_start', function($query){

  // create the post and fill up the fields
  $post = new WP_Post((object)array(
    'ID'           => -1,
    'post_title'   => 'Bla blah',
    'post_content' => 'Your content',
  ));

  // add it to the internal cache, so WP doesn't fire a database query for it
  // -1 is the ID of your post
  if(!wp_cache_get(-1, 'posts'))
    wp_cache_set(-1, $post, 'posts');

  // prepend it to the query
  array_unshift($query->posts, $post);
});
于 2013-01-22T14:18:14.423 回答
1

当前接受的答案会导致新帖子删除循环中的最后一个帖子,因为它不会更新帖子计数。这是我的修改版本,其中还包括:

  1. 支持空类别。
  2. 只有一个地方可以声明新帖子的ID。
  3. 添加 is_main_query() 作为评论中最初回答的人。
  4. 一个设置来决定是否应该附加或前置新帖子。
  5. 隐藏帖子的日期,否则你会得到类似 00000000 的东西。我本可以使用动态日期,但在不更新内容的情况下不断更新日期可能是不好的 SEO。
  6. 隐藏帖子的评论链接,因为它只是指向主页。
  7. 控制帖子类型的设置。您可能更喜欢“页面”,因为“帖子”显示的是一般类别,我发现无法绕过。假设这是一件好事,“页面”在其他帖子中看起来也更加突出。

这是修改后的代码:

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');
}
于 2017-08-14T12:23:31.747 回答