Suporte » Desenvolvendo com WordPress » Listar posts, mas somente um terá imagem

  • Resolvido Randys

    (@birobas)


    Gostaria de criar uma listagem de posts, mas quero que somente o último post inserido puxe a imagem destacada. Eu utilizo o WP_Query para puxar os posts, tem como fazer com ele?

    Vou deixar um print de exemplo de como gostaria que fosse. Não precisa ter a mesma formatação do print, só gostaria de saber como faço para criar o loop.

    Link do print de modelo: https://prnt.sc/jlvjss

Visualizando 10 respostas - 1 até 10 (de um total de 10)
  • Moderador Felipe Elia

    (@felipeelia)

    Só usar uma flag no loop não resolve? Algo como:

    $query = new WP_Query( $args );
    if ( $query->have_posts() ) {
    	$primeiro_post = true;
    	while ( $query->have_posts() ) {
    		$query->the_post();
    		if ( $primeiro_post ) {
    			$primeiro_post = false;
    			the_post_thumbnail();
    		}
    		// Título, texto e etc.
    	}
    	wp_reset_postdata();
    }

    Não funcionou na verdade nem esta listado os posts.
    Meu código esta assim:

    <?php
    
                                        $args = array(
    
                                            'post_type' => 'noticias',
                                            'showposts' => '4'
                                        );
    
                                        $query = new WP_Query ( $args );
    
                                        if ( $query->have_posts() ) {
                                            $primeiro_post = true;
                                            while ( $query-have_posts() ) {
                                                $query-the_post();
                                                if ( $primeiro_post ) {
                                                    $primeiro_post = false;
                                                    the_post_thumbnail();
                                                }
                                                get_template_part( 'template-parts/content', 'noticias' );
                                            }
                                        }
                                    ?>
    
                                    <?php
                                        wp_reset_postdata();
                                    ?>
    Moderador Felipe Elia

    (@felipeelia)

    O nome do seu post type é noticias mesmo?

    Além disso, no seu código:
    while ( $query-have_posts() ) {
    deveria ser
    while ( $query->have_posts() ) {

    e
    $query-the_post();
    deveria ser
    $query->the_post();

    Sim, realmente eu vi e já ajustei esse erro.

    Vou tentar ser mais específico com o que quero.
    No meu arquivo front-page.php terá três colunas Notícias, Avisos e Projetos uma ao lado da outra e na mesma linha. Eu fiz um loop para cada uma delas, alternado somente o tipo do post_type, ficou desta forma:

    <?php
        $args = array (
    
            'post_type' => 'noticias',
            'showposts' => '4'
    
        );
    
        $query = new WP_Query ( $args );
    
        if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
    
            get_template_part( 'template-parts/content', 'noticias' );
    
    ?>
    <?php
        endwhile; endif;
        wp_reset_postdata();
    ?>

    E o conteúdo é chamado nos arquivos content-noticias, content-avisos, content-projetos.

    Eu vi que o tema VMAG no repositório WordPress que eles utilizam o tipo de loop que eu quero e descobri que o loop fica na pasta do tema em inc/widgets no arquivo chamado vmag-block-column.php, mas o arquivo é muito complexo e não consegui pegar ele como exemplo, mas vi que ele utiliza um contador para verificar se o post é o último postado e somente nele vai a imagem destacada e os demais são listados abaixo somente com o título do post.

    Eu sei que o loop deverá ficar nos arquivos content-* de cada post_type.

    É possível me ajudar?

    Moderador Felipe Elia

    (@felipeelia)

    Ficou um pouco confuso. No print que você mandou o conteúdo com imagem é o primeiro, mas você quer no último? Se for isso você pode incrementar uma variável a cada laço do while e testar se ela é igual à propriedade post_count da sua query (mais aqui). Seria algo como:

    $i = 0;
    while ( $query->have_posts() ) {
        $query->the_post();
        $i++;
        if ( $query->post_count == $i ) {
            // Exibe a imagem.
        }
    }

    Eu sei que o loop deverá ficar nos arquivos content-* de cada post_type.

    Se você quer exibir a mesma coisa nas três colunas, você não precisa criar três arquivos diferentes. A função get_template_part só faz um include e, por si só, não tem nada a ver com post types. Chamar get_template_part( 'template-parts/content', 'noticias' ); só faz o WP chamar o arquivo template-parts/content-noticias.php se ele existir e, senão, ele tenta chamar o arquivo template-parts/content.php.

    Você pode chamar get_template_part( 'template-parts/loop-home' ); e criar um arquivo template-parts/loop-home.php só, por exemplo. Atente só que não será possível usar o valor de $query dentro desse arquivo, por uma questão de escopo de funções. Para usar valores de $query você teria que usar uma variável global ou usar um include do php ao invés da get_template_part.

    No print há 3 colunas cada uma com um tipo de post diferente LATEST NEWS, POPULAR NEWS TRENDING.

    O que quero fazer é igual do print, ter três colunas cada uma com um tipo de informação diferente, porém gostaria que somente o post mais recente exiba a imagem em destaque, os demais posts fica somente um link do post.

    Desculpe a insistência ou se estou sendo chato, mas quero aprender isso há algum tempo e nunca compreendi como fazer.

    Moderador Felipe Elia

    (@felipeelia)

    Não está sendo chato, pode ficar tranquilo.

    Com o código que eu passei na primeira resposta você não conseguiu resolver qual parte do problema?

    Cara eu consegui aqui, mas preciso que tu me dê um help.
    No meu front-page tenho o seguinte código para chamar um post_type chamado Notícias

    <?php
        $args = array (
    
            'post_type' => 'noticias',
            'posts_per_page' => '1',
    
        );
    
        $query = new WP_Query ( $args );
    
        if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
    
            get_template_part( 'template-parts/content', 'noticias' );
    
    ?>
    <?php
        endwhile; endif;
        wp_reset_postdata();
    ?>

    e no meu arquivo content-notícias o código que faz o loop da forma que eu quero que é exibir o resumo e imagem de destaque para o primeiro post e em seguida, apenas o título de cada post subsequente

    <?php
     
    // First query arguments.
    $args1 = array(
        'post_type' => 'noticias',
        'posts_per_page' => '1'
    );
     
    // First custom query.
    $query1 = new WP_Query( $args1 );
     
    // Check that we have query results.
    if ( $query1->have_posts() ) {
     
        // Start looping over the query results.
        while ( $query1->have_posts() ) {
     
            $query1->the_post();
     
            ?>
     
            <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php post_thumbnail( 'thumbnail' );?>
                </a>
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                </a>
                <?php the_excerpt(); ?>
            </article>
     
            <?php
     
        }
     
    }
     
    // Restore original post data.
    wp_reset_postdata();
     
    // Second query arguments.
    $args2 = array(
        'offset' => '1',
        'post_type' => 'noticias'
    );
     
    // Second custom query.
    $query2 = new WP_Query( $args2 );
     
    // Check that we have query results.
    if ( $query2->have_posts() ) {
     
        echo '<ul class="more-posts">';
         
            // Start looping over the query results.
            while ( $query2->have_posts() ) {
     
                $query2->the_post();
         
                ?>
     
                <li <?php post_class(); ?>>
                    <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                        <?php the_title(); ?>
                    </a>
                </li>
         
                <?php
         
            }
         
        echo '</ul>';
     
    }
     
    // Restore original post data.
    wp_reset_postdata();
     
    ?>

    Olha só como ficou o resultado do loop –> https://prnt.sc/jmnyi4

    Porém não consegui limitar a quantidade de posts que vão aparecer, a cada post publicado a lista abaixo fica maior tu sabes como faço para limitar isso?

    Neste print esta a forma do layout que desejo fazer –> https://prnt.sc/jmnyza

    Moderador Felipe Elia

    (@felipeelia)

    Você está fazendo uma query dentro da outra… só chama o get_template_part então, sem a query fora dele (deixa a de dentro).

    Deu tudo certo aqui @felipeelia muito obrigado.
    Valeu pela paciência.

Visualizando 10 respostas - 1 até 10 (de um total de 10)
  • O tópico ‘Listar posts, mas somente um terá imagem’ está fechado para novas respostas.