Публікація не показує дату, якщо є ще одна публікація з тією ж датою


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;. Отож воно стає одразу один раз. Відразу після цього обидва дні однакові, і перевірка провалиться. Ось чому ваша перша публікація відображає її, але інші її не показують.

Чому він показує?

Якщо ви запитаєте себе, чому вона показує більше однієї дати, після того, як глобальна стане евкалізованою, тоді вам доведеться поглянутиsetup_postdata() . Ця функція викликається the_post();і відповідає за налаштування всього для однієї публікації в циклі.

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

        // your loop stuff here
    }
}

Внутрішнє середовище setup_postdata()досить легко зрозуміти (принаймні, до того, що встановлюють глобалісти):

$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()робота і як використовувати його на правильний шлях

На нього не впливає the_date()функція if / else (перевірка глобалів). Він також робить НЕ має фільтра. Як це виправити? Простий:

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

Це додає будь-які зворотні дзвінки, приєднані до the_dateфільтра, до вашого власного виводу. Він також використовує date_formatпараметр опції за замовчуванням як за замовчуванням - який також використовується the_date(). І це уникає будь-яких beforeі afterзначень - знову ж таки, саме як the_date()функція.


1
Дякую кайзер. Це пояснює, чому іноді не вдається надрукувати дату. Дуже дякую.
Роберт відтінок

1
Дуже вичерпне пояснення. Краще, ніж прийнята відповідь.
Nilambar Sharma

1
@Nilambar Прийнята відповідь - версія tl; dr та ідеально:
Кайзер,

реквізит для заглиблення в цей @kaiser - більше розуміння, ніж я коли-небудь очікував у такому
буденному

1
Ця відповідь краща, ніж пояснення WP-документів.
Ян

10

Не використовуйте the_date(), а використовуйте the_time().

the_date повертає лише дату, the_time повертає дату + час. Я не знаю, чому Wordpress не поверне більше однієї дати, коли the_dateвикористовується в циклі. Але це пов’язано з тим, що значення однакове. Якщо ви використовуєте the_timeзначення, це ніколи не є однаковим, тому воно завжди повертає значення. Так ви можете надрукувати щось на зразок<?php the_time('F j, Y'); ?>

Це посилання з кодексу пояснює, як 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.