come interrogare i post per categoria e tag?
Sto cercando di mostrare un elenco di post che sono correlati alla categoria X e al tag Y. Ho provato il seguente codice:
$args = array(
'posts_per_page' => 4,
'tag_id' => $tag_id,
'cat' => $cat_id,
);
query_posts($args);
ma non funziona correttamente e restituisce tutti i post nella categoria.
Mi piacerebbe avere qualche suggerimento da parte vostra

Modifica: Vedi sotto per il modo corretto di interrogare le intersezioni tra categorie e tag.
global $wp_query;
$args = array(
'category__and' => 'category', //devi usare l'ID della categoria per questo campo
'tag__in' => 'post_tag', //devi usare l'ID del tag per questo campo
'posts_per_page' => -1); //ottieni tutti gli articoli
$posts = get_posts($args);
foreach ($posts as $post) :
//fai qualcosa
endforeach;

Questo codice funziona:
$args = array(
'tag' => get_queried_object()->slug, // Se il permalink è tipo esempio.com/tag/example-tag, ecc.
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'category', // Tassonomia, nel mio caso ho bisogno delle categorie predefinite degli articoli
'field' => 'slug',
'terms' => 'interior', // Lo slug della tua categoria (ho una categoria 'interior')
),
)
); // Ottieni tutti gli articoli
$posts_new = get_posts( $args );

Credo che questo sia un bug in WordPress già segnalato altrove, prova a usare il nome del tag invece dell'ID e dovrebbe funzionare:
$args = array(
'posts_per_page' => 3, // Numero di post da visualizzare
'tag' => 'review', // Slug del tag (invece dell'ID)
'cat' => 9, // ID della categoria
);
query_posts($args); // Esegue la query
Facci sapere come va, non sono sicuro di cosa succeda con tag che hanno nomi composti da più parole.

Mi sono imbattuto nello stesso problema e l'ho risolto effettuando una richiesta MySQL.
In breve: get_post($args) restituirà i post che hanno la categoria=MyCategory OPPURE il tag=MyTag.
Quello che vuoi è cambiare l'OPPURE in E.
La mia logica è stata di procedere direttamente con una Query MySQL:
- Query 1 = Seleziona tutti i post che hanno la categoria MyCat
- Query 2 = Seleziona tutti i post che hanno il tag MyTag
- FINALMENTE: Seleziona tutti i post che sono presenti sia in Query 1 E Query 2.
Ho utilizzato wpdb invece di query_post();
Un po' di codice (restituisce i post pubblicati con categoria MyCat e tag 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);
Questo è un modo un po' rozzo per farlo, ma spero che sia d'aiuto =)

Questo può essere ottenuto molto più facilmente con WP_Query
e una relazione tax_query
AND, non c'è bisogno di utilizzare SQL grezzo.

Non c'è assolutamente bisogno di utilizzare query grezze in WordPress per ottenere questo risultato.

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 = "IL MIO TAG"

Le risposte con solo codice raramente soddisfano gli standard di qualità. Per favore modifica la tua risposta e includi note/commenti su come questa soluzione risolve il problema originale, insieme a come/dove implementarla.
