カテゴリとタグで投稿をクエリする方法は?


11

カテゴリXとタグYに関連する投稿のリストを表示しようとしています。次のコードを試しました。

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

しかし、正しく機能せず、co \ ategory内のすべての投稿を返します。

あなたが持っているかもしれない洞察を聞きたいです


query_posts()ではカテゴリまたはタグしか使用できないと思います。よくわかりませんが、関数の使用が制限されている可能性があります。これは、正しく機能していることを意味しますが、意図したとおりには機能しません。
2010年

回答:


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)は、category = MyCategory または tag = MyTag を持つ投稿を返します。

ORANDに変更する必要があります。

私の論理は、MySQLクエリをそのまま使用することでした。

  • クエリ1 =カテゴリMyCatを持つすべての投稿を選択する
  • クエリ2 =タグMyTagを持つすべての投稿を選択
  • 最後に、クエリ1およびクエリ2に含まれるすべての投稿を選択します。

query_post()の代わりにwpdb を使用しました

少しのコード (カテゴリ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_Querytax_queryAND関係を使用するはるかに簡単に実現できます。生のSQLは必要ありません。
ミロ2014年

これを実現するためにWordPressで生のクエリを実行する必要はまったくありません。
ヨハンプレトリウス

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は必要ありません。
ヨハンプレトリウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.