¿Cómo consultar entradas por categoría y etiqueta?
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

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;

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

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.

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

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

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

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"

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.
