comment interroger les messages par catégorie et tag?

11

J'essaie d'afficher une liste de messages liés à la catégorie X et à la balise Y. J'ai essayé le code suivant:

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

mais cela ne fonctionne pas correctement et renvoie tous les messages de la catégorie.

J'adorerais entendre toute idée que vous pourriez avoir

hannit cohen
la source
Je pense qu'avec query_posts (), vous ne pouvez utiliser que la catégorie ou la balise. Je ne suis pas sûr, mais peut-être que l'utilisation de la fonction est limitée à ce qui signifierait que cela fonctionne correctement mais qu'elle ne fait pas ce que vous voulez.
hakre

Réponses:

19

Modifier: voir ci-dessous pour savoir comment interroger les intersections de catégories et de balises.

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
la source
3

Je pense que c'est un bug dans WordPress qui a été commenté ailleurs, essayez d'utiliser le nom de la balise plutôt que l'ID, alors cela devrait fonctionner:

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

Faites-nous savoir comment vous vous en sortez, ne savez pas ce qui se passe avec les balises avec plusieurs mots dans le nom.

James Piggot
la source
2

Je suis tombé sur ce même problème et l'ai résolu en faisant une demande MySQL.

en bref: get_post ($ args) vous renverra des articles qui ont la catégorie = MyCategory OU la balise = MyTag.

ce que vous voulez, c'est changer votre OU en ET .

ma logique était d'aller directement avec une requête MySQL:

  • Requête 1 = Sélectionnez tous les articles qui ont la catégorie MyCat
  • Requête 2 = Sélectionnez tous les messages qui ont la balise MyTag
  • Enfin: sélectionnez tous les messages qui se trouvent dans la requête 1 ET la requête 2.

J'ai utilisé wpdb au lieu de query_post ();

Un peu de code (renvoyant les articles publiés avec la catégorie MyCat et la balise 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);

C'est une sale façon de le faire mais j'espère que ça aide =)

Wouwei
la source
7
Ceci est beaucoup plus facile à réaliser avec WP_Queryet une tax_queryrelation ET , pas besoin de SQL brut.
Milo
Il n'est absolument pas nécessaire de faire des requêtes brutes dans WordPress pour y parvenir.
Johan Pretorius
2

Ce code fonctionne:

$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
la source
-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
la source
2
Le code ne répond que rarement aux normes de qualité. Veuillez modifier votre réponse et inclure des notes / commentaires sur la façon dont cela résout le problème d'origine ainsi que comment / où le mettre en œuvre.
Howdy_McGee
Ceci est beaucoup plus facile à réaliser avec WP_Query et une relation tax_query AND, pas besoin de SQL brut.
Johan Pretorius