come interrogare i post per categoria e tag?


11

Sto cercando di mostrare un elenco di post 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 co \ ategory.

Mi piacerebbe sentire qualsiasi intuizione che potresti avere


Penso che con query_posts () sia possibile utilizzare solo la categoria o il tag. Non ne sono sicuro, ma forse l'uso della funzione è limitato a ciò, il che significherebbe che funziona correttamente ma non fa quello che vuoi.
Hakre,

Risposte:


19

Modifica: vedere di seguito il modo corretto di interrogare la categoria e contrassegnare le intersezioni.

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;

3

Penso che questo sia un bug in WordPress che è stato commentato altrove, prova a usare il nome del tag anziché l'ID, quindi dovrebbe funzionare:

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

Facci sapere come vai avanti, non sono sicuro di cosa accada con i tag con più parole nel nome.


2

Mi sono imbattuto in questo stesso problema e risolto facendo una richiesta MySQL.

in breve: get_post ($ args) ti restituirà i post che hanno la categoria = MyCategory O il tag = MyTag.

quello che vuoi è cambiare il tuo OR in AND .

la mia logica era quella di andare dritto 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 si trovano in Query 1 AND Query 2.

Ho usato wpdb invece di query_post ();

Un po 'di codice (che restituisce 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 sporco per farlo, ma spero che aiuti =)


7
Questo è molto più facile da realizzare con WP_Querye una tax_queryrelazione AND , senza necessità di SQL grezzo.
Milo,

Non è assolutamente necessario eseguire query non elaborate in WordPress per raggiungere questo obiettivo.
Johan Pretorius,

2

Questo codice funziona:

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

-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"

2
Le risposte al codice raramente soddisfano gli standard di qualità. Modifica la tua risposta e includi note / commenti su come questo risolve il problema originale insieme a come / dove implementarlo.
Howdy_McGee

Questo è molto più facile da realizzare con WP_Query e una relazione Tax_query AND, senza necessità di SQL raw.
Johan Pretorius,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.