この記事は最後に更新してから1年以上経過しています。

メディアライブラリに絞り込み用の「投稿タグ」を追加する

説明

この記事は、先月投稿したコラム「メディア(attachment)を拡張してより便利に活用する」の続編。メディアで「投稿タグ」を追加するだけで「メディアライブラリ」ページの投稿一覧の中には「タグ」カラムが追加されるが、今回はその「投稿タグ」で絞り込み検索に対応してみる。

「メディアライブラリ」ページは/wp-admin/upload.phpである。そのファイルの中身をトレースしていくと、/wp-admin/includes/class-wp-media-list-table.phpに行き着く。

do_action( 'restrict_manage_posts' );
submit_button( __( 'Filter' ), 'button', false, false, array( 'id' => 'post-query-submit' ) );

ということで、restrict_manage_postsアクションを利用すれば今回の目的は達成できそうである。ただ、このアクション。「メディアライブラリ」ページだけでなく、「投稿一覧」ページなどでも実行されるので、その点は注意が必要だろう。

パラメータ名はquery_posts関数に合わせるのが「吉」

ソースコードは次のような感じになる。

add_action( 'restrict_manage_posts', 'my_restrict_manage_posts' );

function my_restrict_manage_posts() {
	global $wp_list_table, $tag__in;

	if ( empty( $wp_list_table->screen->post_type ) &&
		isset( $wp_list_table->screen->parent_file ) &&
		$wp_list_table->screen->parent_file == 'upload.php' )
		$wp_list_table->screen->post_type = 'attachment';

	if ( is_object_in_taxonomy( $wp_list_table->screen->post_type, 'post_tag' ) ) {
		$tag = isset( $tag__in[0] )? $tag__in[0]: 0;
		$dropdown_options = array(
				'show_option_all' => __( 'All Tags' ),
				'hide_empty' => 0,
				'hierarchical' => 1,
				'show_count' => 0,
				'orderby' => 'name',
				'name' => 'tag__in',
				'taxonomy' => 'post_tag',
				'selected' => $tag
		);
		wp_dropdown_categories( $dropdown_options );
	}
}

こちらの元ネタは、投稿一覧の同等箇所においてカテゴリーのプルダウンを表示している/wp-admin/includes/class-wp-post-list-table.php。 wp_dropdown_categories関数はそのままのネーミングでカテゴリーのプルダウン(select要素)を出力するものだが、連想配列パラメータ'taxonomy'の値を変更することで投稿タグやカスタムタクソノミーにも対応する優れものである。

連想配列パラメータ'name'の値は、そのままクエリーパラメータとなるので、ここでは'tag__in'を指定している。この'name'の値には、 query_posts関数(WP_Queryクラス)のパラメータと合わせることで、他に手を加えることなく絞り込み検索に対応できる。投稿タグ用のパラメータ名はいくつかあるが、wp_dropdown_categories関数のoption要素のvalue属性はIDになっていることから、スラッグを値とする'tag'ではなく'tag__in'を指定している。

さてソースコードとしては順序が前後してしまうが、restrict_manage_postsアクションはメディアライブラリ以外でも実行されるアクションなので、その点に配慮しているのが青字のif文の箇所である。$wp_list_tableは投稿一覧を表示するクラスのオブジェクトで、メディアライブラリだけっでなく、投稿一覧などの各種一覧ページにおいても$wp_list_tableを利用している。$wp_list_table->screen->post_typeには、そのページの投稿タイプ名が格納されているようだが、メディアライブラリの場合はなぜか格納されていないので、ここでは'attachment'を格納し、次のif文で利用している。

上記のコードの場合、投稿タグを利用できるようにしたメディアライブラリだけでなく、投稿一覧でも投稿タグのプルダウンが表示され、絞り込み検索できるようになる。ページを限定する場合は、$wp_list_table->screen->parent_fileの値で適宜判別してほしい。


最終更新 : 2014年06月24日 10:19


お勧め

is_blog_admin(2011年6月23日 更新)

bool is_blog_admin( )
リクエストページがブログ管理者ページ(/wp-admin/内)か調べる。

post_class(2018年5月27日 更新)

void post_class( [ string $class = '' [ , int $post_id = null ] ] )
投稿情報の種別に応じたクラス属性(class="post-?? post ...")を表示する。具体的なクラス名は、投稿ID(post-番号)、投稿種別(postやpage)、カテゴリー(category-名前)、タグ(tag-名前)などがある。これらクラス名に合わせたCSSを準備することで、投稿ページのユニークなデザインが表現可能になる。

get_the_password_form(2014年3月3日 更新)

string get_the_password_form( [ mixed $post = 0 ] )
パスワード保護されている投稿のパスワード入力フォームを取得する。

get_template_directory_uri(2018年5月27日 更新)

string get_template_directory_uri( )
現在のテンプレートのパス名(URI)を取得する。

wp_get_single_post(2014年11月16日 更新)

mixed wp_get_single_post( [ int $post_id = 0 [ , string $mode = OBJECT ] ] )
投稿情報を取得する。取得する情報には、標準の投稿情報に区分けカテゴリーIDと投稿タグ名の配列が含まれる。