是否按博客主页的帖子元有条件查询自定义帖子类型?

时间:2010-10-23 作者:webcodeslinger

(Moderator\'s note: 问题的原始标题是:“自定义查询:在博客主页上显示自定义帖子类型加上带有帖子元的自定义帖子类型”)

我需要有关自定义查询的帮助。我有三种自定义的帖子类型:“新闻”“事件”“故事”。在主博客页面上,只显示新闻和事件。客户端可以选择使用插件的功能将故事标记为新闻Verve Meta Boxes. 如果一篇文章的post元键为\'mark-as-news\' 然后,该帖子也应该显示在主博客页面上。

因此,我需要的写作帮助是:

如果故事有post meta\'mark-as-news\' 然后,主博客页面将按降序显示自定义帖子类型新闻和事件以及故事。

有人能帮忙吗?

谢谢

编辑:

也许这是一种更好的措辞方式:

显示自定义帖子类型新闻和事件,以及是否有键\'mark-as-news\' 对于post_meta, 显示故事。

2 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

你好@webcodeslinger:

下面是用于加载新闻和事件的基本MySQL查询的外观(这与WordPress的实际功能相比大大简化):

SELECT * FROM wp_posts WHERE post_type IN (\'news\',\'events\') 
取而代之的是这样的内容(MySQL中有更高性能的方法,但WordPress中的方法更复杂,对于大多数网站,你永远不会注意到有什么不同):

SELECT * FROM wp_posts WHERE post_type IN (\'news\',\'events\') 
  OR (post_type=\'stories\' AND ID IN 
    (SELECT post_id FROM wp_postmeta WHERE meta_key=\'mark-as-news\')
  )
所以。。。要将额外的SQL添加到主循环的查询中,请使用\'posts_where\' 钩您可以在主题的functions.php 文件(在文件底部即可)或.php 如果您正在创建插件,则插件的文件:

add_action(\'posts_where\',\'yoursite_posts_where\',10,2);
function yoursite_posts_where($where,$query) {
  global $wp_the_query;
  if (is_home() && $query===$wp_the_query) { // This means home page and the main loop
    global $wpdb;
    $where .= " OR ({$wpdb->posts}.post_type=\'actor\' AND " . 
              "{$wpdb->posts}.ID IN (" . 
                "SELECT post_id FROM {$wpdb->postmeta} " .
                "WHERE meta_key=\'mark-as-news\')) ";
  }
  return $where;
}

SO网友:Rarst

您想要的东西很容易描述,但很难使用WP API。到目前为止,我还没有看到好的、整洁的解决方案。

基本上,WP query是从数据库获取post行的SQL查询的奇特包装器。实际上,您需要对两组不同的帖子进行两个不同的查询。WP目前不处理查询中的此类逻辑。

您可以进行两次查询并合并结果,但在这种情况下,很难正确分页。

这可能是杂志风格主题变得流行的原因之一,因为它们专门展示多个领域的多组帖子,而不是与复杂的内容组合作斗争。

结束

相关推荐