como consultar postagens por categoria e tag?

11

Estou tentando mostrar uma lista de postagens relacionadas à categoria X e à tag Y. Tentei o seguinte código:

$args = array(
    'posts_per_page' => 4,
    'tag_id' => $tag_id,
    'cat' => $cat_id,
);
query_posts($args);

mas não funciona corretamente e retorna todas as postagens na categoria.

Gostaria de ouvir qualquer insight que você possa ter

hannit cohen
fonte
Eu acho que com query_posts () você só pode usar categoria ou tag. Não tenho certeza, mas talvez o uso da função seja limitado ao que significa que isso está funcionando corretamente, mas não faz o que você deseja.
hakre

Respostas:

19

Editar: veja abaixo a maneira correta de consultar cruzamentos de categoria e tag.

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;
Chris_O
fonte
3

Eu acho que isso é um bug no WordPress que foi comentado em outro lugar, tente usar o nome da tag em vez do ID, pois deve funcionar:

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

Deixe-nos saber como você se sai, sem saber o que acontece com as tags com várias palavras no nome.

James Piggot
fonte
2

Eu me deparei com esse mesmo problema e o resolvi fazendo uma solicitação do MySQL.

em resumo: get_post ($ args) retornará as postagens que possuem a categoria = MyCategory OU a tag = MyTag.

o que você quer é mudar seu OR para AND .

minha lógica era ir direto com uma consulta MySQL:

  • Consulta 1 = Selecione todas as postagens que possuem a categoria MyCat
  • Consulta 2 = Selecione todas as postagens com a tag MyTag
  • Finalmente: selecione todas as postagens que estão na consulta 1 e na consulta 2.

Eu usei wpdb em vez de query_post ();

Um pouco de código (retornando postagens publicadas com a categoria MyCat e a 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);

Esta é uma maneira suja de fazer isso, mas espero que ajude =)

Wouwei
fonte
7
Isso é muito mais facilmente realizado com WP_Querye um tax_queryrelacionamento AND , sem a necessidade de SQL bruto.
Milo
Não há absolutamente nenhuma necessidade de fazer consultas brutas no WordPress para conseguir isso.
Johan Pretorius
2

Este código funciona:

$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 );
Oleksandr Chopenko
fonte
-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"
mal
fonte
2
As respostas apenas ao código raramente atendem aos padrões de qualidade. Edite sua resposta e inclua notas / comentários sobre como isso resolve o problema original, além de como / onde implementá-lo.
Howdy_McGee
Isso é muito mais fácil com WP_Query e um relacionamento tax_query AND, sem a necessidade de SQL bruto.
Johan Pretorius