Как получить дату публикации записи вне цикла?
Мне нужно получить дату публикации записи, чтобы сделать автоматическое истечение срока действия записи. Проблема в том, что я не могу получить правильную дату публикации.
Вот мой код:
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.
Как получить дату корректно?

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.

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

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

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

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

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

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

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

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

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

@Anagio - см. http://wordpress.stackexchange.com/questions/95769/get-date-of-last-update-outside-of-loop/115044#115044

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

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

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

Вы можете использовать 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] =>
)

Попробуйте так:
$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'.
Я что-то упускаю здесь?

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