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

17 nov 2010, 23:58:53
Vistas: 160K
Votos: 14

Estoy tratando de mostrar una lista de entradas que estén 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 entradas de la categoría.

Me encantaría escuchar cualquier sugerencia que puedan tener

1
Comentarios

Creo que con query_posts() solo puedes hacer uso de categorías o etiquetas. No estoy seguro, pero tal vez el uso de la función está limitado a eso, lo que significaría que esto está funcionando correctamente pero no hace lo que quieres que haga.

hakre hakre
18 nov 2010 01:40:26
Todas las respuestas a la pregunta 5
0
21

Editar: Ver más abajo la forma correcta de consultar intersecciones de categorías y etiquetas.

global $wp_query;
        $args = array(
        'category__and' => 'category', //debes usar el ID de categoría para este campo
        'tag__in' => 'post_tag', //debes usar el ID de etiqueta para este campo
        'posts_per_page' => -1); //obtener todas las publicaciones

$posts = get_posts($args);
        foreach ($posts as $post) :
  //hacer algo
     endforeach;
3 dic 2010 21:58:39
0

Este código funciona:

$args = array(
    'tag' => get_queried_object()->slug, // Si el enlace permanente es como ejemplo.com/tag/etiqueta-ejemplo, etc.
    'posts_per_page' => -1,
    'tax_query' => array( 
        array(
            'taxonomy' => 'category', // Taxonomía, en mi caso necesito las categorías por defecto de las publicaciones
            'field'    => 'slug',
            'terms'    => 'interior', // El slug de tu categoría (tengo una categoría 'interior')
        ),
        ) 
); // Obtener todas las publicaciones
$posts_new = get_posts( $args );
11 mar 2016 02:57:31
0

Creo que esto es un error en WordPress que ha sido comentado en otros lugares, intenta usar el nombre de la etiqueta en lugar del ID, entonces debería funcionar:

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

Déjanos saber cómo te va, no estoy seguro de qué pasa con etiquetas que tienen múltiples palabras en el nombre.

4 dic 2010 14:29:13
3

Me encontré con este mismo problema y lo resolví haciendo una consulta MySQL.

En resumen: get_post($args) te devolverá posts que tengan la categoría=MiCategoría O el tag=MiTag.

Lo que tú quieres es cambiar ese O por un Y.

Mi lógica fue ir directamente con una consulta MySQL:

  • Consulta 1 = Seleccionar todos los posts que tienen la categoría MiCat
  • Consulta 2 = Seleccionar todos los posts que tienen el tag MiTag
  • Finalmente: Seleccionar todos los posts que están en la Consulta 1 Y en la Consulta 2.

Usé wpdb en lugar de query_post();

Un poco de código (devuelve posts publicados con categoría MiCat y tag MiTag):

    $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 = 'MiTag'";

    $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 = 'MiCat'";

$query ="
            SELECT      wp_posts.post_title AS titulo , 
                        wp_posts.post_content AS contenido,
                        wp_posts.post_date AS fecha 
            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 forma poco elegante de hacerlo pero espero que te ayude =)

8 jun 2014 22:01:12
Comentarios

Esto se logra mucho más fácilmente con WP_Query y una relación tax_query AND, no es necesario usar SQL crudo.

Milo Milo
8 jun 2014 22:10:28

No hay absolutamente ninguna necesidad de hacer consultas crudas en WordPress para lograr esto.

Drmzindec Drmzindec
30 ene 2020 10:44:07

También creo que esto está mal: "AND wp_terms.term_id = wp_term_relationships.term_taxonomy_id" porque estás omitiendo completamente la tabla 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 = "MI ETIQUETA"
15 mar 2016 20:45:26
Comentarios

Las respuestas que solo incluyen código rara vez cumplen con los estándares de calidad. Por favor edita tu respuesta e incluye notas/comentarios sobre cómo esto resuelve el problema original junto con cómo/dónde implementarlo.

Howdy_McGee Howdy_McGee
15 mar 2016 23:24:59

Esto se logra mucho más fácilmente con WP_Query y un tax_query con relación AND, no es necesario usar SQL crudo.

Drmzindec Drmzindec
30 ene 2020 10:44:35