Listar posts, mas somente um terá imagem
-
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
-
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(); ?>
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?
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 arquivotemplate-parts/content-noticias.php
se ele existir e, senão, ele tenta chamar o arquivotemplate-parts/content.php
.Você pode chamar
get_template_part( 'template-parts/loop-home' );
e criar um arquivotemplate-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.
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
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.
- O tópico ‘Listar posts, mas somente um terá imagem’ está fechado para novas respostas.