如何在草稿中显示真实的发布日期

时间:2012-02-23 作者:supertrue

当看到选秀台时,get_the_date() 似乎只返回今天的日期,而不是发布日期,即使我在发布编辑屏幕上选择了另一个日期。

有没有办法显示我选择的“实际”发布日期?

我可以在MySQL数据库中看到,它保存在post\\u date列中。但是,像get\\u the\\u date,$post->post_date 不退回。如果帖子是草稿,则会显示当前日期和时间。

4 个回复
SO网友:kaiser

是的,因为到目前为止,您还没有发布日期。

你可以使用$post->post_modified, 始终是对post数据进行最新修改的日期。

<小时>

Debug:

尝试挂接到筛选器并转储两个变量:

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

SO网友:Evan Mattson

我不知道为什么它在显示时会这样修改数据,但您可以使用

$post->post_date_gmt
这将返回与DB中相同的计划发布日期,但它是GMT时间格式,因此您可能需要先将时间转换为本地时区(this blog post may help). 否则,如果您只是使用日期,则应该能够按原样使用它(&A);不是时间,但这取决于你在用它做什么。

Edit 2/29/12:

我想详细说明我的答案,使之更完整,并给你一些你可以实际使用的东西。

没错,发布日期存储在post_date 数据库中的字段。

例如,wordpress在wp-admin/includes/meta-boxes.php 要设置用于显示将来计划的草稿的投递日期的变量,请执行以下操作:

$date = date_i18n( $datef, strtotime( $post->post_date ) );
然而,当在前端使用相同的代码显示时,它会像您所说的那样返回当前时间。我认为我们可以得出结论$post 正在为前端准备不同的对象数据。

无论如何,可以输出您在管理中设置的相同计划日期。

因为我们似乎无法使用$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...

    }
}
当然,如果存在最常用的特定格式,您也可以更改参数定义中定义的默认时间格式。

如果这对你有用,请告诉我。我很好奇,你用这个日期干什么?

SO网友:iyrin

在我的草稿中,$post->post\\u date\\u gmt仅为0000-00-00 00:00:00–超级真实Jun 4 at 15:08

There is no way to edit the publish date of a draft that has not yet been published. The value for post_date_gmt will be 0000-00-00 00:00:00 until the post is published.

确保帖子至少发布过一次。如果不希望公开发布可见性,则可以将其设置为“私有”。发布后,您可以编辑日期,除非再次更改,否则应将其无限期保存为post\\u date和post\\u date\\u gmt的值。修改帖子时,post\\u modified和post\\u modified\\u gmt值将继续更改。

我已经对此进行了测试,发布文章时,post\\u date\\u gmt将设置为当前日期和时间,可见性设置为private。您也可以在此时编辑日期,并应进行更新。

如果您可以在草稿的编辑屏幕上修改并保存日期(您可以这样做)–supertrueFeb 29 \'12 at 1:36

不,您不能在草稿的编辑屏幕上修改和保存日期。在发布草稿之前,post editor上“Publish”(发布)元盒的这一相同区域用于安排将来发布帖子的日期。当然,您将无法为日程安排设置过去的日期或时间,在实际发布日期或时间之前,可能不会为post\\u date\\u gmt设置未来的日期。

SO网友:jounileander

您可以通过Worpdress提供的全局$wpdb变量(请参阅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 id或想在循环之外使用函数,可以向函数输入post id。

如果您需要更具体的说明,请在下面进行评论。

结束