要件とか
- 公開日時と更新日時を併記したいけど、軽微な修正程度では更新日時を変更したくない。
- 手動で掲載用の更新日時の指定をしたい
- 記事を更新したら一覧系(HOMEやアーカイブ)の並び順も更新日順にしたい。
- 更新しない記事もあるのでその場合は公開日時も並び順の条件に加える
という要件で 手動で更新日時を変更するなら「公開日時」を変更すればOK となるが、公開日時と更新日時を併記する都合上、記事を 初めて公開した日時をカスタムフィールドに保存しておくようにする。
(カスタムフィールドで掲載したい更新日時を保存する方法の場合、並び順のクエリが複雑になるのがよろしくないという事情もある)
なお、過去に投稿された記事にも対応。
保存のロジック
- 初回の公開日時は1回だけ保存されればいい
- 隠しのカスタムフィールドにすることで投稿編集画面から変更できないようにしておく。
なので
-
save_post
実行時に - 公開済み、予約投稿、非公開の投稿のみ
- 隠しのカスタムフィールド(
_publish_date
) がなかった場合 - 公開日時を保存
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;
}
}
現場からは以上です。