Как получить дату публикации записи вне цикла?

19 июн. 2012 г., 14:43:39
Просмотры: 60.1K
Голосов: 11

Мне нужно получить дату публикации записи, чтобы сделать автоматическое истечение срока действия записи. Проблема в том, что я не могу получить правильную дату публикации.

Вот мой код:

global $wpdb;

$post_ids = $wpdb->get_results( "SELECT ID FROM $wpdb->posts WHERE post_status ='publish'" );

foreach($post_ids as $id){

      $postdate = get_the_date("Y-m-d",$id ); //здесь то, что я смог придумать
       .......
      ......и т.д.
}

Когда я вывожу $postdate, получается неправильная дата. Не та дата, которая существует в таблице wp_posts.

Как получить дату корректно?

0
Все ответы на вопрос 4
14
21

get_the_date должен использоваться внутри цикла (Loop). Для использования вне цикла применяйте get_the_time.

$posts = get_posts(array('numberposts'=>-1)); // Получаем все опубликованные записи
foreach ($posts as $post){
    echo get_the_time('Y-m-d', $post->ID); // Выводим дату в формате Y-m-d
}

Рекомендуется заменить 'Y-m-d' в этом примере на get_option('date_format'), так как это будет выводить дату в соответствии с настройками формата даты в wp-admin.

19 июн. 2012 г. 15:13:02
Комментарии

Я также пробовал get_the_time, но он всё равно выдаёт неправильную дату.

dev-jim dev-jim
19 июн. 2012 г. 15:15:19

А вы передаёте в него ID записи? get_the_time — это правильная функция для данного случая.

Stephen Harris Stephen Harris
19 июн. 2012 г. 15:20:01

Также — вам не следует использовать кастомный SQL-запрос здесь. Используйте get_posts, а затем, если вам нужно извлечь только ID, примените wp_list_pluck

Stephen Harris Stephen Harris
19 июн. 2012 г. 15:22:00

Я пытаюсь обновить post_status на основе даты публикации, есть ли другие способы обновить статус? Пока что SQL-запрос кажется мне самым простым вариантом.

dev-jim dev-jim
19 июн. 2012 г. 17:04:54

Смотрите правки - вам почти никогда не следует обращаться к базе данных напрямую.

Stephen Harris Stephen Harris
19 июн. 2012 г. 17:27:59

Я понимаю вашу точку зрения. Попробовал ваш способ, и он отлично работает. Но мне хотелось бы узнать, почему не стоит делать запросы к базе данных напрямую? Из соображений безопасности?

dev-jim dev-jim
19 июн. 2012 г. 17:50:11

Безопасность (в некотором роде), производительность (вероятно), но в основном простота кода и совместимость с будущими версиями - т.е. использование предоставленного API (get_post) в данном случае.

Stephen Harris Stephen Harris
19 июн. 2012 г. 18:01:45

Спасибо, Stephen, я не знал, что можно передать ID> При использовании get_posts нет возможности отобразить дату публикации без этого.

Diana Diana
29 июн. 2013 г. 07:47:50

@StephenHarris хотя эта функция получает дату создания записи, можно ли получить дату/время изменения вне цикла?

Anagio Anagio
21 сент. 2013 г. 02:09:29

Согласно Codex, тег get_the_time должен использоваться внутри цикла (The Loop). http://codex.wordpress.org/Function_Reference/get_the_time

Maor Barazany Maor Barazany
15 янв. 2014 г. 00:29:28

@MaorBarazany, похоже codex ошибается, см. исходный код: https://core.trac.wordpress.org/browser/tags/3.8/src/wp-includes/general-template.php#L1497

Stephen Harris Stephen Harris
15 янв. 2014 г. 01:23:58

Вы сослались на get_post_time вместо get_the_time, что довольно запутывает. Они делают одно и то же, но имеют разные аргументы. Есть шанс, что вы сможете исправить ссылку? Спасибо!

David Hobs David Hobs
13 июн. 2014 г. 02:30:24

@DavidHobs Исправлено :)

Stephen Harris Stephen Harris
13 июн. 2014 г. 17:31:10
Показать остальные 9 комментариев
0

Вы можете использовать get_post() или get_post_field() для этого, обе функции работают вне цикла.

$post_object = get_post($id);
$post_date = date( 'F jS, Y', strtotime( $post_object->post_date ) );

Полный список значений, возвращаемых get_post:

WP_Post Object
(
    [ID] =>
    [post_author] =>
    [post_date] => 
    [post_date_gmt] => 
    [post_content] => 
    [post_title] => 
    [post_excerpt] => 
    [post_status] =>
    [comment_status] =>
    [ping_status] => 
    [post_password] => 
    [post_name] =>
    [to_ping] => 
    [pinged] => 
    [post_modified] => 
    [post_modified_gmt] =>
    [post_content_filtered] => 
    [post_parent] => 
    [guid] => 
    [menu_order] =>
    [post_type] =>
    [post_mime_type] => 
    [comment_count] =>
    [filter] =>
)
12 окт. 2018 г. 03:03:26
0

Некоторые современные решения

Решение первое

<?php echo get_the_date('j F Y', get_the_ID()) ?>

Решение второе

<?php the_time(get_option('date_format')) ?>
26 мар. 2018 г. 22:25:38
4
-2

Попробуйте так:

$getPosts = $wpdb->get_results( 
"
    SELECT ID, post_date,post_title
    FROM $wpdb->posts
    WHERE post_status = 'publish' 
        AND post_type = 'post'
        ORDER BY ID ASC
    "
);

foreach ( $getPosts as $myPost ) {
    $id = $myPost->post_date;
    echo $myPost->ID.' | '. $myPost->post_title.' | '. get_the_date("Y-m-d",$id ).'<br />';
}

редактировать

get_the_time Возвращает время текущей записи для использования в PHP. Не выводит время на экран. Для отображения времени записи используйте the_time(). Этот тег должен использоваться внутри цикла (The Loop).

get_the_date Шаблонный тег get_the_date получает дату написания текущего $post. В отличие от the_date() этот тег всегда возвращает дату. Вывод можно модифицировать с помощью фильтра 'get_the_date'.

Я что-то упускаю здесь?

19 июн. 2012 г. 15:12:02
Комментарии

Пожалуйста, объедините ваши ответы.

fuxia fuxia
19 июн. 2012 г. 16:17:24

Покажите, как объединить, пожалуйста?

Dazilio Dazilio
19 июн. 2012 г. 16:29:47

Отредактируйте первый ответ и скопируйте код из второго в него. Затем удалите второй.

fuxia fuxia
19 июн. 2012 г. 16:32:18

Я попробовал ваш код, и мне удалось получить значение из get_the_time, но не из get_the_date.

dev-jim dev-jim
19 июн. 2012 г. 17:06:26