¿Cómo consultar publicaciones por categoría y etiqueta?

11

Estoy tratando de mostrar una lista de publicaciones relacionadas con la categoría X y la etiqueta Y. He probado el siguiente código:

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

pero no funciona correctamente y devuelve todas las publicaciones en la categoría.

Me encantaría saber cualquier idea que tengas

Hannit Cohen
fuente
Creo que con query_posts () solo puedes hacer uso de la categoría o etiqueta. No estoy seguro, pero tal vez el uso de la función se limita a lo que significaría que esto está funcionando correctamente, pero no hace lo que desea hacer.
Hakre

Respuestas:

19

Editar: consulte a continuación la forma correcta de consultar categorías y etiquetar intersecciones.

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
fuente
3

Creo que este es un error en WordPress que se ha comentado en otro lugar, intente usar el nombre de la etiqueta en lugar del ID, entonces debería funcionar:

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

Háganos saber cómo le va, no estoy seguro de qué sucede con las etiquetas con varias palabras en el nombre.

James Piggot
fuente
2

Me topé con este mismo problema y lo resolví haciendo una solicitud de MySQL.

en resumen: get_post ($ args) le devolverá las publicaciones que tengan la categoría = MyCategory O la etiqueta = MyTag.

lo que quieres es cambiar tu OR a AND .

mi lógica era ir directamente con una consulta MySQL:

  • Consulta 1 = Seleccione todas las publicaciones que tengan la categoría MyCat
  • Consulta 2 = Seleccione todas las publicaciones que tengan la etiqueta MyTag
  • Finalmente: seleccione todas las publicaciones que están en la Consulta 1 Y la Consulta 2.

Solía wpdb en lugar de query_post ();

Un poco de código (devolviendo publicaciones publicadas con la categoría MyCat y etiqueta 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);

Esta es una manera sucia de hacerlo, pero espero que ayude =)

Wouwei
fuente
77
Esto se logra mucho más fácilmente con WP_Queryuna tax_queryrelación AND , sin necesidad de SQL sin formato.
Milo
No hay absolutamente ninguna necesidad de hacer consultas sin procesar en WordPress para lograr esto.
Johan Pretorius
2

Este código funciona:

$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
fuente
-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
fuente
2
Las respuestas de código solo rara vez cumplen con los estándares de calidad. Edite su respuesta e incluya notas / comentarios sobre cómo esto resuelve el problema original junto con cómo / dónde implementarlo.
Howdy_McGee
Esto se logra mucho más fácilmente con WP_Query y una relación tax_query AND, sin necesidad de SQL sin formato.
Johan Pretorius