Сообщение не показывает дату, если есть другое сообщение с такой же датой


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()работа и как использовать его на правильный путь

На него не влияет 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
Спасибо Кайзер. Это объясняет, почему иногда не удается распечатать дату. Большое спасибо.
Роберт Хюэ

1
Очень полное объяснение. Лучше, чем принятый ответ.
Ниламбар Шарма

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

Эта ссылка из кодекса объясняет, как 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 отображается только один раз в первом посте


Обратите внимание: если вы хотите рекламировать свой собственный продукт / блог, вы должны сообщить о своей принадлежности , в противном случае ваш ответ может быть помечен как спам. Пожалуйста, прочитайте Как не быть
спамером
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.