Postarea nu afișează data dacă există o altă postare cu aceeași dată

28 oct. 2014, 20:50:23
Vizualizări: 35.8K
Voturi: 25

Am un tip de postare personalizat "press" și am creat un șablon de pagină care interoghează postările de acest tip. Postările ar trebui să afișeze data publicării, dar dacă există mai multe postări cu aceeași dată, doar prima postare afișează data iar celelalte nu. Există vreo modalitate de a afișa data pentru fiecare postare?

Exemplu de afișare postări cu date identice în WordPress

<?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(); ?>
0
Toate răspunsurile la întrebare 5
0
53

Am întâmpinat o problemă similară în trecut pentru că am modificat funcția de dată. Și atunci postările afișau data doar dacă fiecare post avea o dată diferită, altfel returna gol.

Încearcă să adaugi <?php echo get_the_date(); ?> în loc.

28 oct. 2014 21:03:01
6
30

De ce nu apare?

Când te uiți la sursa funcției the_date(), vei observa două variabile globale:

global $currentday, $previousday;

Apoi există o verificare dacă există o dată de afișat... sau nu. Verificarea este similară cu cea făcută cu is_new_day():

if ( $currentday != $previousday ) {

    // afișează data

    // Setează global
    $previousday = $currentday;
}
// else
return null;

După cum poți vedea, $previousday este imediat setat la $currentday;. Astfel, este afișat o singură dată. Imediat după aceea, ambele zile sunt identice și verificarea va eșua. Acesta este motivul pentru care primul tău post o afișează, dar celelalte nu.

De ce apare?

Dacă te întrebi de ce apare mai mult de o dată, după ce variabila globală devine egală, atunci va trebui să arunci o privire la setup_postdata(). Această funcție este apelată de the_post(); și este responsabilă pentru configurarea tuturor elementelor pentru un singur post în buclă.

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

        // conținutul buclei tale aici
    }
}

Mecanismul intern al setup_postdata() este destul de ușor de înțeles (cel puțin în ceea ce privește setarea variabilelor globale):

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

Deci partea dinamică este $previousday față de care variabila globală $currentday este setată și verificată. Și dacă nu există o zi nouă, the_date() nu va afișa nimic.

Pur și simplu setează postările tale la zile complet diferite și vei vedea cum data apare la fiecare post.

Care este ideea din spatele acestui mecanism?

De fapt, ideea este destul de simplă și există încă din versiunea 0.7.1 - cel puțin așa menționează phpDocBlock: De ce ai vrea să afișezi data pentru fiecare post într-o arhivă? O arhivă arată astfel:

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

Nu ești de acord cu asta? Atunci pur și simplu folosești o funcție care a fost concepută pentru un alt scop.

De ce funcționează get_the_date() și cum să-l folosești corect

Nu este afectat de condiția if/else din funcția the_date() (verificarea variabilelor globale). De asemenea, nu are nici filtrul. Cum poți remedia asta? Simplu:

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

Aceasta adaugă orice callback atașat filtrului the_date la ieșirea ta personalizată. De asemenea, utilizează setarea implicită a opțiunii date_format - care este folosită și de the_date(). Și evită orice valori before și after - exact ca și funcția the_date().

28 oct. 2014 22:44:17
Comentarii

Mulțumesc kaiser. Asta explică de ce uneori nu reușește să afișeze data. Mulțumesc mult.

Robert hue Robert hue
29 oct. 2014 03:58:45

Explicație foarte detaliată. Mai bună decât răspunsul acceptat.

Nilambar Sharma Nilambar Sharma
29 oct. 2014 05:43:02

@Nilambar Răspunsul acceptat este versiunea tl;dr și este perfect în regulă :)

kaiser kaiser
29 oct. 2014 05:48:56

felicitări pentru investigarea acestui lucru @kaiser - mai multe detalii decât m-am așteptat vreodată la o problemă atât de banală

serraosays serraosays
13 oct. 2016 03:02:08

Acest răspuns este mai bun decât explicația din documentația WP.

Ian Ian
10 apr. 2017 01:19:37

A funcționat și pentru mine. Bun.

Robert Andrews Robert Andrews
22 ian. 2019 10:04:40
Arată celelalte 1 comentarii
0
10

Nu folosi the_date(), ci mai degrabă the_time().

the_date returnează doar data, the_time returnează data + ora. Nu știu motivul pentru care WordPress nu returnează mai mult de o dată când the_date este folosit într-o buclă. Dar are legătură cu faptul că valoarea este aceeași. Dacă folosești the_time valoarea nu este niciodată aceeași, prin urmare întotdeauna returnează valoarea. Deci poți afișa ceva de genul <?php the_time('F j, Y'); ?>

Acest link din codex, explică cum funcționează the_date mult mai bine decât o fac eu.

28 oct. 2014 21:01:58
0

Forță brută.

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

A funcționat pentru mine, afișează data completă și ora pentru fiecare postare, indiferent dacă este aceeași dată sau nu.

24 dec. 2016 01:55:38
1

Apare doar o dată pentru că așa funcționează un jurnal. Data ar fi afișată în partea de sus și ai scrie intrările dedesubt. Folosesc acest cod pentru a afișa datele pentru fiecare post folosind the_time.

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

Pentru mai multe informații, am scris un tutorial despre asta aici: De ce Funcția the_date() în WordPress Apare Doar Odată la Primul Post

9 apr. 2017 14:13:27
Comentarii

Vă rugăm să rețineți că dacă doriți să vă promovați propriul produs/blog, trebuie să declarați afilierea, altfel răspunsul dumneavoastră poate fi marcat ca spam. Vă rugăm să citiți Cum să nu fii un spammer

DavidPostill DavidPostill
9 apr. 2017 14:32:40