问题描述

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

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

但它不能正常工作,并返回所有的文档。

很乐意听到你可能有的见解

最佳解决方案

编辑:查看下面的正确方法查询类别和标签交叉。

global $wp_query;
        $args = array(
        'category__and' => 'category',
        '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;

次佳解决方案

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

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

让我们知道你如何得到,不知道在名称中有多个单词的标签会发生什么。

第三种解决方案

我偶然遇到同样的问题,并通过提出 MySQL 请求来解决这个问题。

简而言之:get_post($ args) 将返回你的类别= MyCategory OR 或 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);

这是一个肮脏的方法,但我希望它有助于=)

第四种方案

此代码工作原理:

$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 );

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。