フォーラムの管理画面・投稿一覧画面で複数タグでフィルタするにはに回答したネタ。
投稿の一覧画面で複数タグやカテゴリとの複合検索を実現するカスタマイズです。
絞り込み機能自体は、WordPressのwp-includes/query.phpにガッツリ実装されているので、投稿一覧では正しいパラメータでリクエストされるように、してあげれば良いことになります。
フィルターボタンの前には、restrict_manage_posts というフックがあるので、そこで入力欄の表示が可能となっています。ただし、メディアライブラリにおいても、同一のフック名が存在するため、投稿タイプがタグをサポートしているかどうかの分岐処理をしておく必要があります。
また、タグ名の入力では、そのまま絞り込み検索が行えないため、タグ名からタグスラッグへの変換を行う必要があります。
タグ名を複数指定する場合は、半角カンマでの区切りとしています。投稿タグの管理画面からであれば、半角カンマを含んだタグ名を追加することも可能ですが、投稿画面からの追加であれば、半角カンマを含むタグ名は入力できないため、最も一般的であろうという判断です。
CODE 1
function add_post_tag_restrict_filter() {
global $post_type;
if ( is_object_in_taxonomy( $post_type, 'post_tag' ) ) {
?>
<input name="tag_name" size="25" value="<?php echo esc_html( $_GET['tag_name'] ); ?>" class="postform" />
<?php
}
}
add_action( 'restrict_manage_posts', 'add_post_tag_restrict_filter' );
function convert_tag_name2tag_slug() {
if ( ! isset( $_GET['post_type'] ) ) {
$post_type = 'post';
} elseif ( in_array( $_GET['post_type'], get_post_types( array( 'show_ui' => true ) ) ) ) {
$post_type = $_GET['post_type'];
} else {
wp_die( __('Invalid post type') );
}
if ( ! is_object_in_taxonomy( $post_type, 'post_tag' ) || ! isset( $_GET['tag_name'] ) ) {
return;
}
if ( is_array( $_GET['tag_name'] ) ) {
$_GET['tag_name'] = implode( ',', $_GET['tag_name'] );
}
$tag_name = explode( ',', $_GET['tag_name'] );
$tag_name = array_map( 'trim', $tag_name );
if ( $tag_name ) {
$tags = get_tags( 'hide_empty=0&orderby=slug' );
$tags_arr = array();
if ( $tags ) {
foreach ( $tags as $tag ) {
$tags_arr[$tag->name] = $tag->slug;
}
} else {
unset( $_GET['tag_name'] );
return;
}
$searh_tags = array();
$matched_tags = array();
foreach ( $tag_name as $t_name ) {
if ( isset( $tags_arr[$t_name] ) ) {
$searh_tags[] = $tags_arr[$t_name];
$matched_tags[] = $t_name;
}
}
$searh_tags = implode( ' ', $searh_tags );
// OR 検索にしたい場合は、カンマ繋ぎにする
// $searh_tags = implode( ',', $searh_tags );
if ( $searh_tags ) {
$_GET['tag'] = $searh_tags;
$_GET['tag_name'] = implode( ',', $matched_tags );
} else {
unset( $_GET['tag_name'] );
}
}
}
add_action( 'load-edit.php', 'convert_tag_name2tag_slug' );
利用させていただきました。ありがとうございました。