Posting tidak menunjukkan tanggal jika ada pos lain dengan tanggal yang sama

19

Saya memiliki jenis posting khusus "tekan." dan membuat template halaman permintaan posting dari tipe tersebut. Posting seharusnya menunjukkan tanggal publikasi mereka, tetapi jika ada lebih dari satu posting dengan tanggal yang sama, hanya posting pertama yang menunjukkan tanggal dan yang lainnya tidak. Apakah ada cara untuk menunjukkan tanggal setiap posting?

masukkan deskripsi gambar di sini

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

Jawaban:

40

Saya menghadapi masalah serupa di masa lalu karena saya memodifikasi fungsi tanggal saya. Dan kemudian posting yang menampilkan tanggal jika hanya setiap posting memiliki tanggal yang berbeda jika tidak kembali kosong.

Coba tambahkan <?php echo get_the_date(); ?>saja.

Rona Robert
sumber
26

Mengapa itu tidak muncul?

Ketika Anda melihat sumber the_date()fungsi, maka Anda akan melihat dua GLOBALS:

global $currentday, $previousday;

Dan kemudian ada aturan jika ada tanggal untuk tampilan ... atau tidak. Cek ini mirip dengan yang dilakukan dengan is_new_day():

if ( $currentday != $previousday ) {

    // show date

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

Seperti yang Anda lihat, pengaturan $previousdaylangsung diatur ke $currentday;. Jadi itu akan di-echo sekali. Tepat setelah itu, kedua hari itu sama dan cek akan gagal. Itulah alasan mengapa posting pertama Anda menampilkannya, tetapi yang lain tidak menunjukkannya.

Mengapa ini terlihat?

Jika Anda bertanya pada diri sendiri mengapa itu menunjukkan lebih dari satu tanggal, setelah global dinuadisasi, maka Anda harus melihatnyasetup_postdata() . Fungsi ini dipanggil oleh the_post();dan bertanggung jawab untuk mengatur segala sesuatu untuk satu posting di loop.

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

        // your loop stuff here
    }
}

Internal setup_postdata()cukup mudah untuk dipahami (setidaknya untuk apa global ditetapkan):

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

Jadi bagian yang bergerak adalah $previousdayterhadap mana $currentdayglobal diatur dan diperiksa. Dan kecuali ada hari baru , the_date()tidak akan menampilkan apa pun.

Cukup atur posting Anda ke hari yang sama sekali berbeda dan tiba-tiba Anda akan melihat tanggal muncul di setiap posting.

Apa ide di balik itu?

Sebenarnya idenya cukup sederhana dan hadir sejak v0.7.1 - setidaknya ini adalah apa yang phpDocBlock menyatakan: Mengapa Anda ingin menampilkan tanggal untuk setiap posting di arsip? Arsip terlihat seperti ini:

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

Anda tidak setuju dengan itu? Nah, maka Anda hanya menggunakan fungsi yang dimaksudkan untuk menjadi sesuatu yang sama sekali berbeda.

Mengapa ini get_the_date()bekerja dan bagaimana menggunakannya dengan cara yang benar

Itu tidak terpengaruh oleh if / else dalam the_date()fungsi (global memeriksa). Itu juga tidak memiliki filter. Bagaimana cara memperbaikinya? Sederhana:

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

Ini menambahkan semua panggilan balik yang dilampirkan pada the_datefilter ke output khusus Anda. Ini juga menggunakan pengaturan date_formatopsi default sebagai default - yang digunakan oleh the_date()juga. Dan itu menghindari apa pun beforedan afternilai - lagi, persis seperti the_date()fungsinya.

kaisar
sumber
1
Terima kasih kaiser. Itu menjelaskan mengapa kadang-kadang gagal mencetak tanggal. Terima kasih banyak.
Robert rona
1
Penjelasan yang sangat komprehensif. Lebih baik daripada jawaban yang diterima.
Nilambar Sharma
1
@Nilambar Jawaban yang diterima adalah versi tl; dr dan sangat baik-baik saja :)
kaiser
alat peraga untuk menggali @iser ini - lebih banyak wawasan daripada yang pernah saya duga tentang masalah duniawi seperti itu
serraosays
1
Jawaban ini lebih baik daripada penjelasan dokumen WP.
Ian
10

Jangan gunakan the_date(), sebaliknya gunakan the_time().

the_date mengembalikan tanggal saja, the_time mengembalikan tanggal + waktu. Saya tidak tahu alasan mengapa wordpress tidak akan mengembalikan lebih dari satu tanggal ketika the_datedigunakan dalam satu lingkaran. Tetapi itu ada hubungannya dengan fakta bahwa nilainya sama. Jika Anda menggunakan the_timenilai tidak pernah sama, karena itu selalu mengembalikan nilainya. Jadi, Anda dapat mencetak sesuatu seperti<?php the_time('F j, Y'); ?>

Tautan ini dari kodeks, menjelaskan cara kerja the_date jauh lebih baik daripada saya.

gdaniel
sumber
1

Brute paksa itu.

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

Bekerja untuk saya, menampilkan tanggal penuh, waktu untuk setiap posting terlepas dari apakah itu tanggal yang sama atau tidak.

Sheba Tech
sumber
0

Itu hanya muncul sekali karena itulah cara buku harian akan bekerja. Ini akan menunjukkan tanggal di bagian atas dan Anda akan menulis entri Anda di bawahnya. Saya menggunakan kode ini, menampilkannya tanggal untuk setiap posting menggunakan the_time.

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

Untuk info lebih lanjut saya menulis tutorial tentang hal itu di sini: Mengapa the_date () Berfungsi di WordPress Hanya Muncul Sekali pada Posting Pertama

Jonny Jordan
sumber
Harap dicatat jika Anda ingin mempromosikan produk / blog Anda sendiri, Anda harus mengungkapkan afiliasi Anda , jika tidak, jawaban Anda mungkin ditandai sebagai spam. Silakan baca Bagaimana tidak menjadi spammer
DavidPostill