按作者和/或标签查询帖子

时间:2013-05-21 作者:nerdarama

我很确定我需要进行某种自定义查询,但不确定最好的方式。

我有一个作者页面。它需要显示作者的帖子。那很好,我能做到。我需要修改查询,以便它显示作者的帖子以及标记为该作者姓名的帖子。

所以我想象这个问题是这样的

query_posts("author=$author_name||tag=$author_name");

我想我可以使用WP\\u query设置查询并将meta_query 与关系OR 但这只返回了作者的帖子,而忽略了标记的帖子:

 $args = array( 
   "showposts" => "$show_num_posts", 
   "meta_query" => array( 
   "relation" => "OR", 
        array(
          "author" => "$authID"),
        array(
          "tag" => "$nametag"
        )

   )
 );

 $the_query = new WP_Query($args);
我认为它忽略了它,因为它是作者发现的,我已经指定了OR 当我真正需要的是某种AND/OR. 我已经看过了this 示例,但似乎无法重新创建该用户的解决方案以满足我的需要。我只是一直在破坏整件事。

global $wpdb;
$args = $wpdb->get_results($wpdb->prepare(
    "
    SELECT $wpdb->posts.*
    FROM $wpdb->posts, $wpdb->postmeta
    WHERE  ($wpdb->posts.author = $authID)
    OR ($wpdb->postmeta.tag = $nametag)
    "
)
);
foreach ( $args as $post ) : setup_postdata($post);
你有什么可以指给我看的吗?必须有一种更简单的方法来做到这一点。我可能把它复杂化了,有一种非常简单(可能是内置的)的方法我刚刚错过了。不过,搜索codex并没有返回任何有用的结果。

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

你的第一个问题很奇怪。You seem to be mixing meta_query parameters 与其他WP_Query 参数。你不能那样做。author 不是的有效组件meta_query, 两者都不是tag. 正确的meta_query, 如果我正确地解释了这一点,甚至不会是一个元查询。您正在处理一个分类法,一个标记,因此您需要tax_query.

\'tax_query\' => array(
  array(
    \'taxonomy\' => \'post_tag\',
    \'field\' => \'slug\',
    \'terms\' => $nametag
  )
)
不幸的是,如果您使用作者构建一个完整的查询,您会得到AND 在税务查询和作者之间,您需要OR.

$query = new WP_Query( 
  array( 
    \'author\' => 1, 
    \'tax_query\' => array(
      array(
        \'taxonomy\' => \'post_tag\',
        \'field\' => \'slug\',
        \'terms\' => \'depo\'
      )
    )
  )
);
这将为您提供以下查询。

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE 1=1 
AND ( wp_term_relationships.term_taxonomy_id IN (57) ) 
AND (wp_posts.post_author = 1) 
AND wp_posts.post_type = \'post\' 
AND (wp_posts.post_status = \'publish\') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC LIMIT 0, 5
这不是你的数据,但它是说明性的。

这个AND 就在这里--AND (wp_posts.post_author = 1)-- 是个问题。你需要这样才能成为OR. 事实上,你也需要把它放在括号里。。。

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE 1=1 
AND ( 
  (wp_term_relationships.term_taxonomy_id IN (57)) 
  OR (wp_posts.post_author = 1) 
)
AND wp_posts.post_type = \'post\' 
AND (wp_posts.post_status = \'publish\') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC LIMIT 0, 5
您必须为posts_where 为了纠正这一点,但既然您已经在编写自己的SQL,我就不去管它了。我认为您可以使用上面的查询作为参考来完成工作。

结束

相关推荐

Display posts from a category

我试图在分类页面上显示一组来自单个分类的帖子,使用多个循环。<div id=\"featured-content\" class=\"clearfix\"> <? // assign the variable as current category $categoryvariable = $cat; echo($cat); ?> <?php query_posts(\'$cat\'); ?>&