8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[WordPress] 初回の記事公開日をカスタムフィールドに残す

Last updated at Posted at 2019-03-22

要件とか

  • 公開日時と更新日時を併記したいけど、軽微な修正程度では更新日時を変更したくない。
    • 手動で掲載用の更新日時の指定をしたい
  • 記事を更新したら一覧系(HOMEやアーカイブ)の並び順も更新日順にしたい。
    • 更新しない記事もあるのでその場合は公開日時も並び順の条件に加える

という要件で 手動で更新日時を変更するなら「公開日時」を変更すればOK となるが、公開日時と更新日時を併記する都合上、記事を 初めて公開した日時をカスタムフィールドに保存しておくようにする
(カスタムフィールドで掲載したい更新日時を保存する方法の場合、並び順のクエリが複雑になるのがよろしくないという事情もある)
なお、過去に投稿された記事にも対応。

保存のロジック

  • 初回の公開日時は1回だけ保存されればいい
  • 隠しのカスタムフィールドにすることで投稿編集画面から変更できないようにしておく。

なので

  1. save_post 実行時に
  2. 公開済み、予約投稿、非公開の投稿のみ
  3. 隠しのカスタムフィールド(_publish_date) がなかった場合
  4. 公開日時を保存
add_action( 'save_post', 'my_save_post' );
function my_save_post( $post_id ) {
	if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
		return;
	}
	if ( wp_doing_cron() ) {
		return;
	}

	if ( get_post_status ( $post_id ) == 'publish' || get_post_status ( $post_id ) == 'future' || get_post_status ( $post_id ) == 'private' ) {
		if ( empty( get_post_meta( $post_id, '_publish_date', true ) ) ) {
			$publish_date_u = get_the_date( 'U', $post_id );
			update_post_meta( $post_id, '_publish_date', $publish_date_u );
		}
	}
}

※過去の投稿は管理画面の投稿一覧の一括編集で投稿を選択して、何も変更せず保存すればOK。

表示

カスタムフィールド _publish_date をよしなに出力。上の例ではUNIXタイムで保存してるので日時フォーマットは適宜設定。

管理画面の投稿一覧

初回掲載日時を出しておきたい場合

参照:WordPress 管理画面の投稿一覧にカラムを追加してカスタムフィールドの値を出す

add_filter( 'manage_posts_columns' , 'add_publish_date_columns' );
function add_publish_date_columns( $columns ) {

	$new_columns = array();
	foreach ( $columns as $column_name => $column_display_name ) {
		if ( $column_name == 'date' ) {
			$new_columns['publish_date'] = '記事公開日時';
		}
		$new_columns[ $column_name ] = $column_display_name;
	}   
	return $new_columns;
}
add_action( 'manage_posts_custom_column' , 'custom_publish_date_column', 10, 2 );
function custom_publish_date_column( $column, $post_id ) {
	switch ( $column ) {
		case 'publish_date' :
			if ( ! empty( get_post_meta( $post_id, '_publish_date', true ) ) ) {
				echo date_i18n( get_option('date_format') . get_option('time_format'), get_post_meta( $post_id, '_publish_date', true ) ); 
			}
			break;

	}
}

現場からは以上です。

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?