親ドロップダウンに下書きも表示、更新日順に並べるカスタマイズ

投稿を「階層あり」にして頻繁に親子関係をつくるような運用をしてみると、ステータスが「下書き」の投稿が “親”ドロップダウンに表示されないのが微妙に不便に感じます。下書きのままで親子関係を設定可能にしたいと思って調べたら、簡単に実現可能でした。

表示内容のカスタマイズ

“親”ドロップダウンにトップレベルの記事のみ表示されるようにする」で使った page_attributes_dropdown_pages_args と quick_edit_dropdown_pages_args の 2つのフィルターフックを使います。

ドロップダウンには、デフォルトの公開済 (publish)、下書き (draft)、予約済 (future)、承認待ち (pending)、非公開 (private) の 5 種類の投稿ステータスのものを表示させるものとすると、下記のようになります。

// 属性メタボックス用
add_filter( 'page_attributes_dropdown_pages_args', function( $dropdown_args, $post ) {
	$dropdown_args['post_status'] = array( 'publish', 'future', 'draft', 'pending', 'private' );
	return $dropdown_args;
}, 10, 2 );

// クイック編集パネル用
add_filter( 'quick_edit_dropdown_pages_args', function( $dropdown_args ) {
	$dropdown_args['post_status'] = array( 'publish', 'future', 'draft', 'pending', 'private' );
	return $dropdown_args;
} );

$dropdown_args は、これらのフィルターの適用後に wp_dropdown_pages() の引数になり、wp_dropdown_pages() 中でデフォルト値とマージされた後、get_pages() に引数として渡されます。なので、get_pages() で使えるパラメータをフィルターで与えることで、ドロップダウンの中身をいろいろカスタマイズできるわけですね。

並び順のカスタマイズ

get_pages() で得られるページの一覧の並び順は「タイトルのアルファベット順」(文字コード順) ですが、投稿の親を設定するときは「更新日」が新しい順に並んでいる方が選択操作がしやすいのではないかと思います。そこで、次のようにしてみます。

// 属性メタボックス用
add_filter( 'page_attributes_dropdown_pages_args', function( $dropdown_args, $post ) {
	$dropdown_args['post_status'] = array( 'publish', 'future', 'draft', 'pending', 'private' );
	$dropdown_args['sort_column'] = 'post_modified';
	$dropdown_args['sort_order'] = 'DESC';
	return $dropdown_args;
}, 10, 2 );

// クイック編集パネル用
add_filter( 'quick_edit_dropdown_pages_args', function( $dropdown_args ) {
	$dropdown_args['post_status'] = array( 'publish', 'future', 'draft', 'pending', 'private' );
	$dropdown_args['sort_column'] = 'post_modified';
	$dropdown_args['sort_order'] = 'DESC';
	return $dropdown_args;
} );

タイトルの文字コード順って、英語ならアルファベット順になるのでいいですが、日本語の漢字かな混じり文が文字コード順に並ばれても、目的のタイトルがリストのどの辺りにありそうかを予想するのは難しいですよね。WordPress デフォルトでも、公開日 (post_date) や更新日 (post_modified) 順になっている方がいいのでは、と思うのですが、いかがでしょうか。あ、でも、投稿を階層構造にしている今回のようなケースは別として、標準で階層構造を持つ固定ページが大量に存在することはないので、普通は特に困らないのかな。