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


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;

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.


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 =)


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

-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
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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.