如何按类别和标签查询帖子?


11

我试图显示与类别X和标签Y相关的帖子列表。我尝试了以下代码:

$args = array(
    'posts_per_page' => 4,
    'tag_id' => $tag_id,
    'cat' => $cat_id,
);
query_posts($args);

但它不能正常工作,并返回该类中的所有帖子。

很想听听您可能有的见解


我认为使用query_posts()只能使用类别或标签。我不确定,但是功能的使用可能仅限于此功能,这意味着此功能可以正常工作,但它并没有执行您想要执行的操作。
hakre 2010年

Answers:


19

编辑:查询类别和标签相交的正确方法,请参见下文。

global $wp_query;
        $args = array(
        'category__and' => 'category', //must use category id for this field
        'tag__in' => 'post_tag', //must use tag id for this field
        'posts_per_page' => -1); //get all posts

$posts = get_posts($args);
        foreach ($posts as $post) :
  //do stuff 
     endforeach;

3

我认为这是WordPress中的错误,已在其他地方进行了评论,请尝试使用标签的名称而不是ID,然后它应该可以工作:

$args = array(
    'posts_per_page' => 3,
    'tag' => 'review',
    'cat' => 9,
);
query_posts($args);

让我们知道您的生活,不确定名称中包含多个单词的标签会发生什么。


2

我偶然发现了这个问题,并通过发出MySQL请求解决了该问题。

简而言之:get_post($ args)将为您返回类别= MyCategory tag = MyTag的帖子。

您想要将OR更改为AND

我的逻辑是直接进行MySQL查询:

  • 查询1 =选择所有类别为MyCat的帖子
  • 查询2 =选择所有标签为MyTag的帖子
  • 最后:选择查询1和查询2中的所有帖子。

我用wpdb代替了query_post();

一些代码 (返回类别为MyCat和标签MyTag的已发布帖子)

    $query_byTag="
            SELECT wp_posts.ID
            FROM wp_posts, wp_term_relationships, wp_terms
            WHERE wp_posts.ID = wp_term_relationships.object_id
            AND wp_terms.term_id = wp_term_relationships.term_taxonomy_id
            AND wp_terms.name = 'MyTag'";

    $query_byCat="
            SELECT wp_posts.ID
            FROM wp_posts, wp_term_relationships, wp_terms
            WHERE wp_posts.ID = wp_term_relationships.object_id
            AND wp_terms.term_id = wp_term_relationships.term_taxonomy_id
            AND wp_terms.name = 'MyCat'";

$query ="
            SELECT      wp_posts.post_title AS title , 
                        wp_posts.post_content AS content,
                        wp_posts.post_date AS blogdate 
            FROM wp_posts
            WHERE wp_posts.post_status = 'publish'
            AND wp_posts.ID IN (".$query_byTag.")
            AND wp_posts.ID IN (".$query_byCat.")
            ORDER BY wp_posts.post_date DESC ";

$result= $wpdb->get_results($query);

这是一种肮脏的方式,但我希望它能帮助您=)


7
WP_Query使用tax_queryAND关系可以轻松完成此操作,无需原始SQL。
Milo 2014年

绝对不需要在WordPress中进行原始查询即可实现此目的。
Drmzindec

2

此代码有效:

$args = array(
    'tag' => get_queried_object()->slug, // If permalink like example.com/tag/example-tag, etc.
    'posts_per_page' => -1,
    'tax_query' => array( 
        array(
            'taxonomy' => 'category', // Taxonomy, in my case I need default post categories
            'field'    => 'slug',
            'terms'    => 'interior', // Your category slug (I have a category 'interior')
        ),
        ) 
); // Get all posts
$posts_new = get_posts( $args );

-1
SELECT wp_posts.post_name
FROM wp_posts, wp_term_relationships, wp_terms, wp_term_taxonomy
WHERE wp_posts.ID = wp_term_relationships.object_id
AND wp_terms.term_id = wp_term_taxonomy.term_id
AND wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id
AND wp_terms.name = "MY TAG"

2
仅代码回答很少符合质量标准。请编辑您的答案,并附上注释/评论,说明如何解决原始问题以及实施方法/在何处实施。
Howdy_McGee

使用WP_Query和tax_query AND关系可以轻松完成此操作,无需使用原始SQL。
Drmzindec
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.