bagaimana cara meminta posting berdasarkan kategori dan tag?

11

Saya mencoba menampilkan daftar posting yang terkait dengan kategori X dan tag Y. Saya sudah mencoba kode berikut:

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

tetapi tidak bekerja dengan benar dan mengembalikan semua posting di co \ ategory.

Senang mendengar wawasan yang mungkin Anda miliki

hannit cohen
sumber
Saya pikir dengan query_posts () Anda hanya dapat menggunakan kategori atau tag. Saya tidak yakin, tapi mungkin penggunaan fungsi ini terbatas pada apa yang berarti ini berfungsi dengan baik tetapi tidak melakukan apa yang Anda inginkan.
hakre

Jawaban:

19

Sunting: Lihat di bawah ini untuk cara yang tepat untuk query persimpangan kategori dan tag.

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;
Chris_O
sumber
3

Saya pikir ini adalah bug di WordPress yang telah dikomentari di tempat lain, coba gunakan nama tag daripada ID maka seharusnya berfungsi:

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

Beri tahu kami bagaimana caranya, tidak yakin apa yang terjadi dengan tag dengan banyak kata dalam namanya.

James Piggot
sumber
2

Saya tersandung ke masalah yang sama dan mengatasinya dengan membuat permintaan MySQL.

singkatnya: get_post ($ args) akan mengembalikan Anda posting yang memiliki kategori = MyCategory ATAU tag = MyTag.

yang Anda inginkan adalah mengubah OR Anda menjadi DAN .

Logika saya adalah langsung dengan MySQL Query:

  • Kueri 1 = Pilih semua posting yang memiliki kategori MyCat
  • Kueri 2 = Pilih semua posting yang memiliki tag MyTag
  • Terakhir: Pilih semua posting yang ada di Kueri 1 DAN Kueri 2.

Saya menggunakan wpdb alih-alih query_post ();

Sedikit kode (mengembalikan posting yang diterbitkan dengan kategori MyCat dan tag 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);

Ini adalah cara kotor untuk melakukannya tetapi saya harap ini membantu =)

Wouwei
sumber
7
Ini jauh lebih mudah dicapai dengan WP_Querydan tax_queryhubungan DAN , tidak perlu untuk SQL mentah.
Milo
Sama sekali tidak perlu melakukan permintaan mentah di WordPress untuk mencapai ini.
Johan Pretorius
2

Kode ini berfungsi:

$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 );
Oleksandr Chopenko
sumber
-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"
mal
sumber
2
Jawaban kode saja jarang memenuhi standar kualitas. Harap edit jawaban Anda dan sertakan catatan / komentar tentang bagaimana ini memecahkan masalah asli bersama dengan bagaimana / di mana mengimplementasikannya.
Howdy_McGee
Ini jauh lebih mudah dilakukan dengan WP_Query dan hubungan tax_query DAN, tidak perlu untuk SQL mentah.
Johan Pretorius