Если посмотреть на черновик сообщения, get_the_date()
похоже, возвращает сегодняшнюю дату, а не дату публикации, даже если я выбрал другую дату на экране редактирования сообщений.
Есть ли способ показать «фактическую» дату публикации, которую я выбрал?
Я вижу в базе данных MySQL, что он сохраняется в столбце post_date. Но, как и get_the_date, $post->post_date
не возвращает его. Если сообщение представляет собой черновик, оно показывает текущую дату и время.
Да, поскольку вы – до сих пор – не публикуете дату.
Вы можете использовать $post->post_modified
, который всегда будет датой последней модификации данных сообщения.
Отлаживать:
Попробуйте подключиться к фильтру и сбросить оба vars:
function date_dump_callback( $date, $d ) { echo '<pre>'; print_r( $date ); print_r( $d ); echo '</pre>'; return $date; } add_filter( 'get_the_date', 'date_dump_callback', 20, 2 );
Я не уверен, почему он изменяет данные, подобные этому при показе, но вы можете использовать
$post->post_date_gmt
Это вернет запланированную дату публикации так же, как и в БД, за исключением того, что она находится в формате GMT, поэтому вам может потребоваться сначала преобразовать время в локальный часовой пояс ( это сообщение в блоге может помочь ). В противном случае вы сможете использовать его, как если бы вы использовали дату, а не время, но это зависит от того, что вы делаете с ней.
Редактировать 2/29/12:
Я хотел уточнить свой ответ, чтобы сделать его более полным и дать вам то, что вы действительно можете использовать.
Вы правы, дата публикации хранится в поле post_date
в базе данных.
Например, wordpress использует эту строку кода в wp-admin/includes/meta-boxes.php
чтобы установить переменную, которая используется для отображения даты публикации для запланированных на будущее проектов:
$date = date_i18n( $datef, strtotime( $post->post_date ) );
Однако при использовании того же кода для отображения на лицевой панели он возвращает текущее время, как вы сказали. Я думаю, мы можем заключить, что данные объекта $post
создаются по-разному для передней части.
В любом случае вы можете указать ту же запланированную дату, которую вы установили в admin.
Поскольку кажется, что мы не можем использовать $post->post_date
, мы можем использовать $post->post_date_gmt
как я уже говорил, – единственный недостаток заключается в том, что ваш часовой пояс, вероятно, не совпадает с GMT. Итак, все, что вам нужно сделать, это вытащить значение GMT и преобразовать его в ваш часовой пояс.
Вы можете добавить эту функцию в свой файл functions.php
и вызвать ее там, где хотите:
<?php /** *@param string $datef (optional) to pass the format you want for the returned date string *@return string */ function get_the_real_post_date($datef = 'M j, Y @ G:i') { global $post; if ( !empty( $timezone_string = get_option( 'timezone_string' ) ) ) { $timezone_object = timezone_open( $timezone_string ); $datetime_object = date_create( $post->post_date_gmt ); $offset_sec = round( timezone_offset_get( $timezone_object, $datetime_object ) ); // if you want $offset_hrs = round( $offset_sec / 3600 ); return date_i18n( $datef, strtotime( $post->post_date_gmt ) + $offset_sec ); } elseif (!empty( $offset_hrs = get_option('gmt_offset') ) ) { // this option shows empty for me so I believe it's only used by WP pre 3.0 // the option stores an integer value for the time offset in hours $offset_sec = $offset_hrs * 3600; return date_i18n( $datef, strtotime( $post->post_date_gmt ) + $offset_sec ); } else { return; // shouldn't happen but... } }
Конечно, вы также можете изменить формат времени по умолчанию, который определен в определении параметра, если есть конкретный формат, который вы использовали бы больше всего.
Дайте мне знать, если это сработает для вас. Мне любопытно, для чего вы используете дату?
Вы можете вывести запланированную дату для черновика сообщения, прочитав базу данных с помощью класса wpdb через глобальную переменную $ wpdb, предоставленную Worpdress (см. http://codex.wordpress.org/Class_Reference/wpdb).
Добавьте это в свои функции. Php:
// function to get scheduled date for draft post function unpublished_draft_date(){ global $wpdb; global $post; $post_id = $post->ID; $draft_date_array = $wpdb->get_results( 'SELECT post_date FROM wp_posts WHERE ID = '.$post_id ); $draft_date = $draft_date_array[0]->post_date; return $draft_date; }
И это внутри вашего цикла сообщений:
echo unpublished_draft_date();
Я предоставил только базовый код для получения нужной вам даты. Легко сформировать дату, если вам нужно, и ввести идентификатор сообщения в функцию, если вы не хотите использовать текущий идентификатор сообщения или хотите использовать функцию вне цикла.
Пожалуйста, прокомментируйте ниже, если вам нужны более конкретные инструкции.
В моих проектах, $ post-> post_date_gmt только 0000-00-00 00:00:00 – supertrue 4 июня в 15:08
Невозможно изменить дату публикации проекта, который еще не опубликован. Значение post_date_gmt будет 0000-00-00 00:00:00 до публикации публикации.
Убедитесь, что сообщение опубликовано хотя бы один раз. Доступность видимости может быть закрытой, если вы не хотите публиковать ее публично. После публикации вы можете отредактировать дату и сохранить ее как значение для post_date и post_date_gmt на неопределенный срок, если вы не измените ее еще раз. Значения post_modified и post_modified_gmt будут продолжать изменяться при каждом изменении сообщения.
Я протестировал это, и post_date_gmt будет настроен на текущую дату и время после публикации сообщения с видимостью, установленной как конфиденциальная. Вы также можете изменить дату на этом этапе, и ее необходимо обновить.
Если вы можете изменить и сохранить дату на экране редактирования черновика (что вы можете) – supertrue 29/02/12 в 1:36
Нет, вы не можете изменять и сохранять дату на экране редактирования черновика. Перед публикацией проекта эта же область «Publish» exchangeox в редакторе сообщений используется для планирования даты публикации публикации в будущем. Конечно, вы не сможете установить дату или время для планирования, и будущая дата, вероятно, не будет установлена для post_date_gmt, пока она не будет опубликована.