cum să interogăm articolele după categorie și etichetă?

17 nov. 2010, 23:58:53
Vizualizări: 160K
Voturi: 14

Încerc să afișez o listă de articole care sunt legate de categoria X și eticheta Y. Am încercat următorul cod:

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

dar nu funcționează corect și returnează toate articolele din categorie.

Mi-ar plăcea să aud orice sugestie ați avea

1
Comentarii

Cred că cu query_posts() poți folosi doar categoriile sau etichetele. Nu sunt sigur, dar poate că utilizarea funcției este limitată la asta, ceea ce ar însemna că funcționează corect, dar nu face ceea ce vrei tu să facă.

hakre hakre
18 nov. 2010 01:40:26
Toate răspunsurile la întrebare 5
0
21

Edit: Vezi mai jos metoda corectă de a interoga intersecția dintre categorii și etichete.

global $wp_query;
        $args = array(
        'category__and' => 'category', //trebuie folosit ID-ul categoriei pentru acest câmp
        'tag__in' => 'post_tag', //trebuie folosit ID-ul etichetei pentru acest câmp
        'posts_per_page' => -1); //obține toate articolele

$posts = get_posts($args);
        foreach ($posts as $post) :
  //fă ceva 
     endforeach;
3 dec. 2010 21:58:39
0

Acest cod funcționează:

$args = array(
    'tag' => get_queried_object()->slug, // Dacă permalink-ul este de tipul example.com/tag/exemplu-tag, etc.
    'posts_per_page' => -1,
    'tax_query' => array( 
        array(
            'taxonomy' => 'category', // Taxonomie, în cazul meu am nevoie de categoriile implicite ale articolelor
            'field'    => 'slug',
            'terms'    => 'interior', // Slug-ul categoriei dumneavoastră (eu am o categorie 'interior')
        ),
        ) 
); // Obține toate articolele
$posts_new = get_posts( $args );
11 mar. 2016 02:57:31
0

Cred că aceasta este o eroare în WordPress care a fost menționată și în alte locuri, încearcă să folosești numele tag-ului în loc de ID, atunci ar trebui să funcționeze:

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

Spune-ne cum merge, nu sunt sigur ce se întâmplă cu tag-urile care au nume formate din mai multe cuvinte.

4 dec. 2010 14:29:13
3

Am întâmpinat aceeași problemă și am rezolvat-o făcând o cerere MySQL.

Pe scurt: get_post($args) vă va returna postări care au categoria=MyCategory SAU tagul=MyTag.

Ceea ce doriți este să schimbați SAU în ȘI.

Logica mea a fost să merg direct cu o interogare MySQL:

  • Interogarea 1 = Selectează toate postările care au categoria MyCat
  • Interogarea 2 = Selectează toate postările care au tagul MyTag
  • În final: Selectează toate postările care se află atât în Interogarea 1 cât și în Interogarea 2.

Am folosit wpdb în loc de query_post();

Un pic de cod (returnează postările publicate cu categoria MyCat și tagul 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);

Aceasta este o metodă mai puțin elegantă, dar sper că vă ajută =)

8 iun. 2014 22:01:12
Comentarii

Acest lucru este mult mai ușor de realizat cu WP_Query și o relație tax_query AND, fără a fi nevoie de SQL brut.

Milo Milo
8 iun. 2014 22:10:28

Nu este absolut nicio necesitate să folosești interogări brute în WordPress pentru a realiza acest lucru.

Drmzindec Drmzindec
30 ian. 2020 10:44:07

de asemenea, cred că acest lucru este greșit: "AND wp_terms.term_id = wp_term_relationships.term_taxonomy_id" pentru că omiți complet tabelul wp_term_taxonomy.

DrLightman DrLightman
15 sept. 2020 13:46:36
2
-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 = "ETICHETA MEA"
15 mar. 2016 20:45:26
Comentarii

Răspunsurile care conțin doar cod rareori îndeplinesc standardele de calitate. Te rugăm să editezi răspunsul tău și să incluzi note/comentarii despre cum rezolvă această soluție problema inițială, precum și cum/unde să o implementezi.

Howdy_McGee Howdy_McGee
15 mar. 2016 23:24:59

Această sarcină se realizează mult mai ușor cu WP_Query și un tax_query cu relația AND, nu este nevoie de SQL brut.

Drmzindec Drmzindec
30 ian. 2020 10:44:35