come interrogare i post per categoria e tag?

17 nov 2010, 23:58:53
Visualizzazioni: 160K
Voti: 14

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

1
Commenti

Penso che con query_posts() tu possa utilizzare solo categorie o tag. Non sono sicuro, ma forse l'uso della funzione è limitato a questo, il che significa che funziona correttamente ma non fa quello che vuoi fare.

hakre hakre
18 nov 2010 01:40:26
Tutte le risposte alla domanda 5
0
21

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;
3 dic 2010 21:58:39
0

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 );
11 mar 2016 02:57:31
0

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.

4 dic 2010 14:29:13
3

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

8 giu 2014 22:01:12
Commenti

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

Milo Milo
8 giu 2014 22:10:28

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

Drmzindec Drmzindec
30 gen 2020 10:44:07

inoltre penso che questo sia sbagliato: "AND wp_terms.term_id = wp_term_relationships.term_taxonomy_id" perché stai saltando completamente la tabella wp_term_taxonomy.

DrLightman DrLightman
15 set 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 = "IL MIO TAG"
15 mar 2016 20:45:26
Commenti

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.

Howdy_McGee Howdy_McGee
15 mar 2016 23:24:59

Questo è molto più facilmente realizzabile con WP_Query e un tax_query con relazione AND, non è necessario utilizzare SQL grezzo.

Drmzindec Drmzindec
30 gen 2020 10:44:35