Beitrag zeigt kein Datum an, wenn es einen anderen Beitrag mit demselben Datum gibt

19

Ich habe benutzerdefinierten Beitragstyp "Presse". und machte eine Seitenvorlage die Abfragen Beiträge dieses Typs. Die Beiträge sollen ihr Veröffentlichungsdatum anzeigen, aber wenn es mehr als einen Beitrag mit demselben Datum gibt, zeigt nur der erste Beitrag das Datum und die anderen nicht. Gibt es eine Möglichkeit, das Datum jedes Posts anzuzeigen?

Bildbeschreibung hier eingeben

<?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
quelle

Antworten:

40

Ich hatte in der Vergangenheit ein ähnliches Problem, weil ich meine Datumsfunktion geändert habe. In den Posts wurde das Datum angezeigt, wenn nur die Posts ein anderes Datum haben, andernfalls ist das Datum leer.

Versuchen Sie <?php echo get_the_date(); ?>stattdessen das Hinzufügen .

Robert hue
quelle
26

Warum wird es nicht angezeigt?

Wenn Sie sich die Quelle der the_date()Funktion ansehen , werden Sie zwei globale Merkmale bemerken:

global $currentday, $previousday;

Und dann gibt es eine Regel, ob ein Datum angezeigt werden soll oder nicht. Die Prüfung ähnelt der Prüfung mit is_new_day():

if ( $currentday != $previousday ) {

    // show date

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

Wie Sie sehen, wird das $previousdaysofort eingestellt $currentday;. Also wird es einmal wiederholt. Danach sind beide Tage gleich und die Prüfung schlägt fehl. Das ist der Grund, warum dein erster Post ihn anzeigt, die anderen aber nicht.

Warum zeigt es?

Wenn Sie sich fragen, warum es dann mehr als ein Datum anzeigt, nachdem das globale Datum angepasst wurde, müssen Sie es sich ansehensetup_postdata() . Diese Funktion wird von aufgerufen the_post();und ist dafür verantwortlich, alles für einen einzelnen Post in der Schleife einzurichten.

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

        // your loop stuff here
    }
}

Die Interna von setup_postdata()sind recht einfach zu verstehen (zumindest was die Globalen eingestellt bekommen):

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

Der bewegliche Teil ist also derjenige, $previousdaygegen den das $currentdayGlobale gesetzt und geprüft wird. Und wenn es keinen neuen Tag gibt , the_date()wird nichts angezeigt.

Stellen Sie einfach Ihre Beiträge auf ganz andere Tage ein und plötzlich wird das Datum auf jedem Beitrag angezeigt.

Was ist die Idee dahinter?

Eigentlich ist die Idee seit v0.7.1 ziemlich einfach und präsent - zumindest heißt es in phpDocBlock so: Warum möchten Sie das Datum für jeden Beitrag in einem Archiv anzeigen? Ein Archiv sieht so aus:

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

Sie stimmen dem nicht zu? Nun, dann verwenden Sie einfach eine Funktion, die etwas völlig anderes sein sollte.

Warum tut get_the_date()Arbeit und wie sie die verwenden richtigen Weg

Es ist nicht betroffen von dem if / else in der the_date()Funktion (dem Globals Check). Es hat auch nicht den Filter. Wie kann man das beheben? Einfach:

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

Dadurch werden alle an den the_dateFilter angehängten Rückrufe zu Ihrer benutzerdefinierten Ausgabe hinzugefügt. Es wird auch die Standardoptionseinstellung date_formatals Standardeinstellung verwendet, die auch von verwendet wird the_date(). Und es vermeidet alle beforeund afterWerte - genau wie die the_date()Funktion.

Kaiser
quelle
1
Danke kaiser Das erklärt, warum manchmal das Datum nicht gedruckt werden kann. Vielen Dank.
Robert Farbton
1
Sehr ausführliche Erklärung. Besser als akzeptierte Antwort.
Nilambar Sharma
1
@ Nilambar Die akzeptierte Antwort ist die TL; DR- Version und völlig in Ordnung :)
Kaiser
Requisiten für die Suche nach diesem @kaiser - mehr Einsicht als ich jemals erwartet hatte
sagt Serraos
1
Diese Antwort ist besser als die Erklärung der WP-Dokumentation.
Ian
10

Verwenden Sie nicht the_date(), sondern verwenden Sie the_time().

the_date liefert nur das Datum, the_time liefert das Datum + die Uhrzeit. Ich weiß nicht, warum WordPress nicht mehr als ein Datum zurückgibt, wenn the_datees in einer Schleife verwendet wird. Das hat aber damit zu tun, dass der Wert der gleiche ist. Wenn Sie the_timeden Wert nie gleich verwenden, wird immer der Wert zurückgegeben. So kann man sowas drucken<?php the_time('F j, Y'); ?>

Dieser Link aus dem Codex erklärt, wie the_date viel besser funktioniert als ich.

gdaniel
quelle
1

Brutale Kraft es.

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

Arbeitete für mich, zeigt das vollständige Datum und die Uhrzeit für jeden Beitrag an, unabhängig davon, ob es das gleiche Datum ist oder nicht.

Sheba Tech
quelle
0

Es taucht nur einmal auf, denn so würde ein Tagebuch funktionieren. Es würde das Datum oben anzeigen und Sie würden Ihre Einträge darunter schreiben. Ich benutze diesen Code, um die Daten für jeden Beitrag mit the_time anzuzeigen.

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

Für weitere Informationen habe ich hier ein Tutorial dazu geschrieben: Warum die Funktion the_date () in WordPress nur einmal im ersten Beitrag angezeigt wird

Jonny Jordan
quelle
Bitte beachten Sie, dass Sie Ihre Zugehörigkeit offenlegen müssen, wenn Sie für Ihr eigenes Produkt / Blog werben möchten. Andernfalls wird Ihre Antwort möglicherweise als Spam gekennzeichnet. Bitte lesen Sie Wie man kein Spammer ist
DavidPostill