Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Filtro de posts por categorias- Slides

Prezados, Preciso de mais uma ajuda. Estou tentando fazer varios sliders onde cada slider será filtrado por um categoria, ou seja, o usuário cadastrará todos os posts em um post_type específico (slider) e de acordo com a categoria "setada", o post se encaixará em um slide diferente. Como sou um zero a esquerda em php, eis como está o código:

            <?php 
                $taxonomias = get_terms('slider_tipo');
                $term_ids = wp_list_pluck( $taxonomias, 'term_id' );
                $taxQuery = array(
                    array(
                        'taxonomy' => 'slider_tipo',
                        'field' => 'term_id',
                        'terms' => $term_ids
                    )
                );
                $args = array(
                    'post_type' => 'slider',
                    'tax_query'=> $taxQuery
                );
            ?>
            <?php foreach($taxonomias as $taxonomia) { ?>
                <h2><?= $taxonomia->name; ?></h2>
                <ul class="article-carousel">
                    <?php
                        $loop = new WP_Query( $args );
                        if( $loop->have_posts() ) { 
                            while( $loop->have_posts() ) {
                                $loop->the_post(); ?>
                                <li>
                                    <a href="<?php the_permalink()?>" title="">
                                        <?php the_post_thumbnail(); ?>
                                        <p><?php the_title() ?></p>
                                    </a>
                                </li>
                           <?php 
                        } wp_reset_postdata();
                    }?>
                </ul>
            <?php }?>

Estou conseguindo trazer os posts, mas eles estão vindo todos juntos - sem estarem filtrados. Consigo 'printar' as categorias e elas estão vindo corretas. Só a separação não está acontecendo. Alguma idéia do que pode estar errado? Abs

7 respostas

Oi Christiano, tudo bem? Confesso que não entendi muito bem a proposta, poderia me explicar melhor o que está tentando fazer?

Fala Wanderson, tentei explicar melhor. A ideia é fazer como nesse site: http://www.feedcomercial.com.br/

No caso, seria a parte de case, novidades

Opa, eu precisei fazer coisa parecida esses dias. Categoria e Post Formats. Eu usei o loop abaixo para cada slider, como eram apenas dois, não vejo problemas.

<?php $cq = new WP_Query( array('tax_query' => array( 'relation' => 'AND',
    array(
      'taxonomy' => 'category',
      'field'    => 'slug',
      'terms'    => array( 'slug-categoria' ),
    ),
    array(
      'taxonomy' => 'post_format',
      'field'    => 'slug',
      'terms'    => array( 'port-format' ),
    ),
  ) ) ); ?>
<?php if( $cq->have_posts() ): while( $cq->have_posts() ): $cq->the_post(); ?>
  <?php the_title() ?>
  <!-- more html... -->
<?php endwhile; endif; ?>

No geral, loops são muito usados no WordPress, só toma cuidado com a quantidade de Multiplus Loops, recomenda-se que tenha até três, caso não seja possível, é melhor começar a pensar em alternativas.

Fala Wanderson. Cara, valeu a força, mas não sei se é bem isso (realmente não sei de não ter entendido bem :( ).

Enfim, vou tentar mostrar que acho que fica mais fácil. O mock do projeto (projeto estático) é esse: http://stat.correioweb.com.br/site-comercial/ e o print de como está ficando: http://stat.correioweb.com.br/site-comercial/projeto_wordpress.png

A idéia é que dentro de um mesmo post type (slides), eu consiga filtrar e encaixar os posts dentro das categorias que eu criei - novidades, noticias do mercado, etc e montar os slides de acordo com a categoria 'setada'.

Na imagem acho que dá pra ver que as categorias estão vindo bonitinhas (estou printando as categorias no titulo e no content, como exemplo.) O problema é que os posts da categoria não estão vindo filtrados, estão vindo todos os posts - do tipo slides.

Essa lógica pretendo usar em outras áreas do site, como por exemplo, na área de especiais, utilizar essa lógica para inserir cada tipo de especial no mês em que for feito.

Não sei se a solução é essa mesma que você me mandou, se sim, vou tentar mais 'hard'. Se tiver uma outra idéia, é sempre bem vinda.

Mais uma vez, muito obrigado pela atenção e pelos ensinamentos.

Abs

Então, mas o loop acima resolve, você seleciona posts de um tipo e de uma categoria, depois repete o mesmo loop pra outra categoria. Só vai precisar ajustar a parte de post_type, por que eu usei post_format nesse caso. Pegou a ideia?

Vou deixar o Link da documentação do WP_Query pra você tentar alternativas que talvez sejam mais simples. (https://codex.wordpress.org/Class_Reference/WP_Query)

talvez fazer apenas assim funcione:

<?php $cq = new WP_Query( array( 'post_type' => 'slider', 'category_name' => 'mercado' ) ); ?>
<?php if( $cq->have_posts() ): while( $cq->have_posts() ): $cq->the_post(); ?>
  <?php the_title() ?>
  <!-- more html... -->
<?php endwhile; endif; ?>
solução!

Fala Wanderson. Cara pensei, peguei seu codigo, peguei umas outras ideias e consegui fazer. A titulo de informação, segue como ficou. Mais uma vez obrigado pela orientações. Abs

<?php 
                $taxonomias = get_terms('slider_tipo');
                foreach($taxonomias as $taxonomia) {
                    wp_reset_query();
                    $args = array('post_type' => 'slider',
                        'tax_query' => array(
                            array(
                                'taxonomy' => 'slider_tipo',
                                'field' => 'slug',
                                'terms' => $taxonomia ->slug,
                            ),
                        ),
                     );

                     $loop = new WP_Query($args);
                     if($loop->have_posts()) {
                        echo '<h2>'.$taxonomia->name.'</h2>';?>

                        <ul class="article-carousel">
                        <?php while($loop->have_posts()) : $loop->the_post();?>
                            <li>
                                <a href="<?php the_permalink()?>" title="">
                                    <?php the_post_thumbnail(); ?>
                                    <p><?php get_the_title();?></p>
                                </a>
                            </li>
                        <?php endwhile; ?>
                        </ul>
                    <?php };
                }
             ?>

Fico feliz que tenha feito funcionar, inicialmente eu não entendi a presença desse foreach, mas agora tá mais claro, você está gerando todas as sessões de uma só vez. Funciona, mas eu prefiriria usar um while para cada sessão.