web-dev-qa-db-ja.com

ドラフトに実際の投稿日を表示する方法

ドラフト投稿を見ると、投稿編集画面で別の日付を選択した場合でも、get_the_date()は投稿日ではなく、今日の日付のみを返すようです。

選択した「実際の」投稿日を表示する方法はありますか?

MySQLデータベースのpost_date列に保存されていることがわかります。しかし、get_the_dateのように、$post->post_dateはそれを返しません。投稿が下書きの場合は、現在の日時が表示されます。

3
supertrue

はい、あなたとして - これまでのところ - 公開日はありません。

$post->post_modifiedを使用することができます。これは常に投稿データが最後に変更された日になります。


デバッグ:

フィルタにフックして両方の変数をダンプしてみてください。

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

表示時にそのようにデータが変更されている理由はわかりませんが、使用できます。

$post->post_date_gmt

これは、GMT時間形式であることを除けば、DBにあるのと同じ投稿予定日を返すので、最初に現地のタイムゾーンに時間を変換する必要があるかもしれません( 助けてください )。それ以外の場合は、日付と時刻を使用しているだけで、使用している内容によって異なりますが、そのまま使用できます。

編集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...

    }
}

もちろん、使用する特定のフォーマットがある場合は、パラメータ定義で定義されているデフォルトの時刻フォーマットを変更することもできます。

これがあなたのために働くかどうか私に知らせてください。私は興味があります、あなたは何のために日付を使っていますか?

3
Evan Mattson

Worpdressによって提供されるグローバル$ wpdb変数を通してwpdbクラスを使用してデータベースを読むことによってドラフト投稿の予定日を出力することができます( http://codex.wordpress.org/Class_Reference/wpdbを参照) ).

これをあなたのfunctions.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();

欲しい日付を取得するための基本コードだけを提供しました。現在の投稿IDを使用したくない場合、またはループ外で関数を使用する場合は、必要に応じて日付を作成し、投稿IDを関数に入力します。

より具体的な指示が必要な場合は、以下にコメントしてください。

0
jounileander

私の下書きでは、$ post-> post_date_gmtはちょうど0000-00-00 00:00:00です - スーパーラン 6月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 12年2月29日1時36分

いいえ、ドラフトの編集画面で日付を変更して保存することはできません。ドラフトを公開する前は、投稿エディタ上の "Publish"メタボックスの同じ領域が、今後投稿される投稿の日付のスケジューリングに使用されます。もちろん、過去の日付や時間をスケジュールに設定することはできませんし、実際に公開されるまで将来の日付はおそらくpost_date_gmtに設定されません。

0
iyrin