Postarea nu afișează data dacă există o altă postare cu aceeași dată
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?
<?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(); ?>

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()
.

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

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

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

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

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.

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

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
