A postagem não mostra a data se houver outra postagem com a mesma data


19

Eu tenho o tipo de postagem personalizada "press". e criou um modelo de página com as postagens desse tipo de consulta. As postagens devem mostrar sua data de publicação, mas se houver mais de uma postagem com a mesma data, apenas a primeira postagem mostrará a data e as outras não. Existe uma maneira de mostrar a data de cada postagem?

insira a descrição da imagem aqui

<?php get_header(); ?>
<?php
$wp_query = new WP_Query();
$wp_query -> query('post_type=press&showposts=100');
while ($wp_query->have_posts()) : $wp_query->the_post(); ?>
<div id="press">
<div class="press-item cf">
<div class="press-img"><a href="<?php the_field('link'); ?>"><?php the_post_thumbnail('medium');?></a> </div>
<div class="press-content">
<div class="press-title"><a href="<?php the_field('link'); ?>"><?php echo get_the_title(); ?></a> </div>
<div class="press-excerpt"><?php the_excerpt(); ?> </div>
<div class="press-date"><?php the_date(); ?></div>
</div>
</div>
</div>
<?php endwhile;  ?>
<?php get_footer(); ?>

Respostas:


40

Eu enfrentei um problema semelhante no passado porque modifiquei minha função de data. E as postagens exibiam data se apenas cada postagem tivesse uma data diferente, caso contrário, ela retornaria em branco.

Tente adicionar em seu <?php echo get_the_date(); ?>lugar.


26

Por que isso não aparece?

Quando você olha para a fonte da the_date()função, notará duas globais:

global $currentday, $previousday;

E então há uma regra se há uma data para exibir ... ou não. A verificação é semelhante à feita com is_new_day():

if ( $currentday != $previousday ) {

    // show date

    // Set global
    $previousday = $currentday;
}
// else
return null;

Como você pode ver, o $previousdayinstantaneamente é definido como $currentday;. Por isso, é ecoado uma vez. Logo depois, os dois dias são os mesmos e a verificação falhará. Essa é a razão pela qual sua primeira postagem a exibe, mas as outras não.

Por que isso mostra?

Se você se perguntar por que ele mostra mais de uma data, depois que o global for igualado, será necessário dar uma olhadasetup_postdata() . Essa função é chamada the_post();e é responsável por configurar tudo para uma única postagem no loop.

if ( have_posts() )
{
    while ( have_posts() )
    {
        the_post(); # <-- Calls setup_postdata( $post );

        // your loop stuff here
    }
}

Os internos de setup_postdata()são bastante fáceis de entender (pelo menos o que os globais definem):

$currentday = mysql2date('d.m.y', $post->post_date, false);
$currentmonth = mysql2date('m', $post->post_date, false);

Portanto, a parte móvel é $previousdaycontra a qual o $currentdayglobal é definido e verificado. E a menos que haja um novo dia , the_date()não exibirá nada.

Basta definir suas postagens para dias totalmente diferentes e, de repente, você verá a data em cada postagem.

Qual é a ideia por trás disso?

Na verdade, a ideia é bem simples e presente desde a v0.7.1 - pelo menos é o que o phpDocBlock afirma: Por que você gostaria de exibir a data de cada postagem em um arquivo? Um arquivo é assim:

+--------------+
| 28.10.2014   |
+--------------+
| Post Title A |
| Post Title B |
+--------------+
| 29.10.2014   |
+--------------+
| Post Title C |
| Post Title D |
+--------------+

Você não concorda com isso? Bem, então você está simplesmente usando uma função que deveria ser algo totalmente diferente.

Por que get_the_date()funciona e como usá-lo da maneira certa

Não é afetado pelo if / else na the_date()função (a verificação global). Também não possui o filtro. Como consertar isso? Simples:

echo apply_filters( 'the_date', get_the_date(), get_option( 'date_format' ), '', '' );

Isso adiciona quaisquer retornos de chamada anexados ao the_datefiltro à sua saída personalizada. Ele também usa a date_formatconfiguração de opção padrão como padrão - que também é usada the_date(). E evita quaisquer valores beforee after- novamente, exatamente como a the_date()função.


1
Obrigado Kaiser. Isso explica por que às vezes falha na impressão da data. Muito obrigado.
Robert hue

1
Explicação muito abrangente. Resposta melhor do que aceita.
Nilambar Sharma

1
@Nilambar a resposta aceita é a tl; dr versão e perfeitamente bem :)
kaiser

adereços para cavar este @kaiser - mais conhecimento do que eu esperava sobre uma questão tão mundano
serraosays

1
Esta resposta é melhor que a explicação dos documentos do WP.
Ian

10

Não use the_date(), use the_time().

the_date retorna apenas a data, the_time retorna a data + a hora. Não sei o motivo pelo qual o wordpress não retornará mais de uma data quando the_datefor usado em um loop. Mas tem a ver com o fato de que o valor é o mesmo. Se você usarthe_time o valor nunca é o mesmo, portanto, ele sempre retornará o valor. Então você pode imprimir algo como<?php the_time('F j, Y'); ?>

Este link do codex explica como the_date funciona muito melhor do que eu.


1

Força bruta.

<?php the_time('F j, Y'); ?> - <?php the_time(); ?>

Trabalhou para mim, exibe a data completa, a hora de cada postagem, independentemente de ser a mesma data ou não.


0

Só aparece uma vez porque é assim que um diário funcionaria. Ele mostraria a data na parte superior e você escreveria suas entradas abaixo dela. Eu uso esse código para exibir as datas de cada postagem usando the_time.

<?php the_time(get_option('date_format')); ?>

Para obter mais informações, escrevi um tutorial sobre o assunto aqui: Por que a função the_date () no WordPress aparece apenas uma vez no primeiro post


Observe que se você deseja promover seu próprio produto / blog, deve divulgar sua afiliação ; caso contrário, sua resposta poderá ser sinalizada como spam. Por favor, leia Como não ser um spammer
DavidPostill
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.