Wpis nie wyświetla daty, jeśli jest inny wpis z tą samą datą

19

Mam niestandardowy typ postu „naciśnij”. i utworzył szablon strony z zapytaniami tego typu. Posty powinny zawierać datę publikacji, ale jeśli jest więcej niż jeden post z tą samą datą, tylko pierwszy post pokazuje datę, a pozostałe nie. Czy istnieje sposób pokazania daty każdego postu?

wprowadź opis zdjęcia tutaj

<?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(); ?>
Jaeeun Lee
źródło

Odpowiedzi:

40

W przeszłości miałem podobny problem, ponieważ zmodyfikowałem funkcję daty. A potem posty wyświetlały datę, jeśli tylko każdy post ma inną datę, w przeciwnym razie zwróci puste.

Spróbuj dodać <?php echo get_the_date(); ?>zamiast tego.

Robert Hue
źródło
26

Dlaczego się nie pokazuje?

Kiedy spojrzysz na źródło the_date()funkcji, zauważysz dwa globale:

global $currentday, $previousday;

A potem jest zasada, czy jest data do wyświetlenia ... czy nie. Kontrola jest podobna do tej przeprowadzanej za pomocą is_new_day():

if ( $currentday != $previousday ) {

    // show date

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

Jak widać, $previousdaynatychmiast ustawia się na $currentday;. Więc raz echo. Zaraz potem oba dni są takie same, a sprawdzenie się nie powiedzie. To jest powód, dla którego twój pierwszy post wyświetla go, ale inni go nie pokazują.

Dlaczego to pokazuje?

Jeśli zadajesz sobie pytanie, dlaczego pokazuje więcej niż jedną datę, po tym, jak globalizacja zostanie zrównana, będziesz musiał rzucić okiemsetup_postdata() . Ta funkcja jest wywoływana przez the_post();i jest odpowiedzialna za skonfigurowanie wszystkiego dla pojedynczego postu w pętli.

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

        // your loop stuff here
    }
}

Elementy wewnętrzne setup_postdata()są dość łatwe do zrozumienia (przynajmniej do tego, co ustawiają globały):

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

Zatem ruchoma część jest $previousdaywzględem której $currentdayglobalny zostaje ustawiony i sprawdzony. I dopóki nie będzie nowego dnia , the_date()niczego nie wyświetli.

Po prostu ustaw swoje posty na zupełnie inne dni i nagle zobaczysz datę pojawiającą się na każdym postu.

Jaki jest tego pomysł?

W rzeczywistości pomysł jest dość prosty i obecny od wersji 0.7.1 - przynajmniej tak stwierdza phpDocBlock: Dlaczego chciałbyś wyświetlać datę każdego postu w archiwum? Archiwum wygląda następująco:

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

Nie zgadzasz się z tym? Cóż, po prostu używasz funkcji, która miała być czymś zupełnie innym.

Dlaczego get_the_date()działa i jak używać go we właściwy sposób

Nie ma wpływu na if / else w the_date()funkcji (sprawdzenie globalne). To też ma nie mieć filtr. Jak to naprawić? Prosty:

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

Dodaje to wszelkie wywołania zwrotne dołączone do the_datefiltra do niestandardowego wyjścia. Używa również domyślnego date_formatustawienia opcji jako domyślnego - które również jest używane the_date(). I unika wszelkich wartości beforei after- ponownie, dokładnie jako the_date()funkcji.

kajzer
źródło
1
Dzięki Kaiser. To wyjaśnia, dlaczego czasami nie drukuje daty. Wielkie dzięki.
Robert hue
1
Bardzo wyczerpujące wyjaśnienie. Odpowiedź lepsza niż zaakceptowana.
Nilambar Sharma
1
@Nilambar Przyjęta odpowiedź to wersja tl; dr i idealnie w porządku :)
kaiser
rekwizyty do wkopania się w ten @kaiser - więcej wglądu, niż kiedykolwiek się spodziewałem w tak przyziemnym problemie
serraosays
1
Ta odpowiedź jest lepsza niż wyjaśnienie dokumentacji WP.
Ian
10

Nie używaj the_date(), zamiast tego używaj the_time().

the_date zwraca tylko datę, the_time zwraca datę + czas. Nie znam powodu, dla którego wordpress nie zwróci więcej niż jednej daty, gdy the_datejest używany w pętli. Ale ma to związek z faktem, że wartość jest taka sama. Jeśli użyjesz the_timewartości, nigdy nie będzie taka sama, dlatego zawsze zwraca wartość. Możesz więc wydrukować coś podobnego<?php the_time('F j, Y'); ?>

Ten link z kodeksu wyjaśnia, w jaki sposób the_date działa o wiele lepiej niż ja.

gdaniel
źródło
1

Brutalna siła.

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

Pracował dla mnie, wyświetla pełną datę, godzinę dla każdego postu, niezależnie od tego, czy jest to ta sama data, czy nie.

Sheba Tech
źródło
0

Pojawia się tylko raz, ponieważ tak działałby pamiętnik. Na górze widniałaby data, a poniżej wpisy. Używam tego kodu, aby wyświetlić daty dla każdego postu, używając the_time.

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

Aby uzyskać więcej informacji, napisałem samouczek na ten temat tutaj: Dlaczego funkcja the_date () w WordPress pojawia się tylko raz w pierwszym poście

Jonny Jordan
źródło
Pamiętaj, że jeśli chcesz promować swój własny produkt / blog, musisz ujawnić swoje powiązanie , w przeciwnym razie Twoja odpowiedź może zostać oznaczona jako spam. Proszę przeczytać Jak nie być spamerem
DavidPostill,