โพสต์จะไม่แสดงวันที่หากมีโพสต์อื่นที่มีวันเดียวกัน


19

ฉันมีประเภทโพสต์ที่กำหนดเอง "กด" และจัดทำเทมเพลตของหน้าการสืบค้นของประเภทนั้น โพสต์ควรจะแสดงวันที่เผยแพร่ของพวกเขา แต่ถ้ามีมากกว่าหนึ่งโพสต์ที่มีวันเดียวกันโพสต์แรกเท่านั้นที่แสดงวันที่และคนอื่น ๆ ไม่ได้ มีวิธีแสดงวันที่ของทุกโพสต์หรือไม่

ป้อนคำอธิบายรูปภาพที่นี่

<?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(); ?>

คำตอบ:


40

ฉันประสบปัญหาที่คล้ายกันในอดีตเพราะฉันแก้ไขฟังก์ชันวันที่ของฉัน จากนั้นโพสต์ก็แสดงวันที่หากโพสต์แต่ละรายการมีวันที่แตกต่างกันมิฉะนั้นจะส่งคืนว่าง

ลองเพิ่ม<?php echo get_the_date(); ?>แทน


26

ทำไมมันไม่แสดง?

เมื่อคุณดูที่แหล่งที่มาของthe_date()ฟังก์ชั่นคุณจะสังเกตเห็นวงกลมสองอัน:

global $currentday, $previousday;

แล้วก็มีกฎว่าถ้ามีวันที่จะแสดง ... หรือไม่ การตรวจสอบคล้ายกับที่ทำกับis_new_day():

if ( $currentday != $previousday ) {

    // show date

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

ในขณะที่คุณสามารถดูได้ทันทีที่ได้รับการตั้งค่าให้$previousday $currentday;ดังนั้นมันจึงได้รับเสียงสะท้อนครั้งเดียว หลังจากนั้นทั้งสองวันจะเหมือนกันและการตรวจสอบจะล้มเหลว นั่นคือเหตุผลที่โพสต์แรกของคุณแสดง แต่โพสต์อื่นไม่แสดง

ทำไมถึงแสดง?

หากคุณถามตัวเองว่าทำไมมันแสดงให้เห็นแล้ววันมากกว่าหนึ่งหลังจากที่ทั่วโลกได้รับ euqalized แล้วคุณจะต้องดูที่ setup_postdata()ฟังก์ชั่นนี้ถูกเรียกโดยthe_post();และรับผิดชอบในการตั้งค่าทุกอย่างสำหรับโพสต์เดียวในลูป

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

        // your loop stuff here
    }
}

internals ของsetup_postdata()นั้นค่อนข้างง่ายที่จะเข้าใจ (อย่างน้อยกับสิ่งที่ globals ได้รับการตั้งค่า):

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

ดังนั้นส่วนที่เคลื่อนไหวนั้น$previousdayผิดกับที่$currentdayโลกได้รับการตั้งค่าและตรวจสอบ และถ้ามีวันใหม่ , the_date()จะไม่แสดงอะไร

เพียงแค่ตั้งค่าโพสต์ของคุณเป็นวันที่แตกต่างกันโดยสิ้นเชิงและคุณจะเห็นวันที่ปรากฏในแต่ละโพสต์

แนวคิดเบื้องหลังคืออะไร

จริงๆแล้วความคิดนั้นค่อนข้างเรียบง่ายและมีอยู่ตั้งแต่ v0.7.1 - อย่างน้อยนี่คือสิ่งที่ phpDocBlock ระบุ: ทำไมคุณต้องการแสดงวันที่สำหรับแต่ละโพสต์ในที่เก็บถาวร ไฟล์เก็บถาวรมีลักษณะดังนี้:

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

คุณไม่เห็นด้วยกับที่? ถ้าอย่างนั้นคุณก็แค่ใช้ฟังก์ชั่นที่ตั้งใจจะให้เป็นอะไรที่ต่างออกไปโดยสิ้นเชิง

เหตุใดจึงget_the_date()ทำงานและวิธีใช้อย่างถูกวิธี

มันจะไม่ได้รับผลกระทบจาก if / else ในthe_date()ฟังก์ชั่น (การตรวจสอบกลม) นอกจากนี้ยังไม่ได้มีตัวกรอง จะแก้ไขได้อย่างไร? ง่าย:

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

สิ่งนี้จะเพิ่มการเรียกกลับที่แนบมากับthe_dateตัวกรองไปยังเอาต์พุตที่คุณกำหนดเอง นอกจากนี้ยังใช้การdate_formatตั้งค่าตัวเลือกเริ่มต้นเป็นค่าเริ่มต้น - ซึ่งถูกใช้โดยthe_date()เช่นกัน และจะหลีกเลี่ยงค่าใด ๆbeforeและafter- อีกครั้งเหมือนกับthe_date()ฟังก์ชั่น


1
ขอบคุณไกเซอร์ นั่นอธิบายว่าทำไมบางครั้งมันไม่สามารถพิมพ์วันที่ ขอบคุณมาก.
Robert hue

1
คำอธิบายที่ครอบคลุมมาก ดีกว่าคำตอบที่ยอมรับ
Nilambar Sharma

1
@Nilambar คำตอบที่ได้รับการยอมรับเป็นTL; DRรุ่นและสมบูรณ์ดี :)
Kaiser

อุปกรณ์ประกอบฉากสำหรับขุดลงใน @kaiser นี้ - เจาะลึกกว่าที่ฉันคาดไว้ในเรื่องของโลกีย์
serraosays

1
คำตอบนี้ดีกว่าคำอธิบาย WP เอกสาร
เอียน

10

อย่าใช้แทนที่จะใช้the_date()the_time()

the_date คืนค่าวันที่เท่านั้น the_time คืนค่าวันที่ + เวลา ฉันไม่รู้ว่าทำไม wordpress จะไม่ส่งคืนมากกว่าหนึ่งวันเมื่อthe_dateใช้ในการวนซ้ำ แต่มันเกี่ยวข้องกับความจริงที่ว่าคุณค่านั้นเหมือนกัน หากคุณใช้the_timeค่าจะไม่เหมือนเดิมดังนั้นจะส่งคืนค่าเสมอ เพื่อให้คุณสามารถพิมพ์สิ่งที่ชอบ<?php the_time('F j, Y'); ?>

ลิงก์นี้จาก codex อธิบายว่า the_date ทำงานได้ดีกว่าฉันอย่างไร


1

กำลังดุร้ายมัน

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

ทำงานให้ฉันแสดงวันที่เต็มเวลาสำหรับแต่ละโพสต์โดยไม่คำนึงว่าเป็นวันเดียวกันหรือไม่


0

มันจะปรากฏขึ้นเพียงครั้งเดียวเพราะนั่นเป็นวิธีการทำงานของไดอารี่ มันจะแสดงวันที่ด้านบนและคุณจะเขียนรายการของคุณด้านล่าง ฉันใช้รหัสนี้แสดงวันที่ของแต่ละโพสต์โดยใช้ the_time

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

สำหรับข้อมูลเพิ่มเติมฉันเขียนบทช่วยสอนเกี่ยวกับที่นี่: ทำไม the_date () ฟังก์ชั่นใน WordPress แสดงขึ้นเพียงครั้งเดียวในโพสต์แรก


โปรดทราบว่าคุณต้องการประชาสัมพันธ์ผลิตภัณฑ์ / บล็อกของคุณเองคุณต้องเปิดเผยความร่วมมือมิฉะนั้นคำตอบของคุณอาจถูกตั้งค่าสถานะว่าเป็นสแปม โปรดอ่านวิธีที่จะไม่เป็นผู้ส่งสแปม
DavidPostill
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.