サポート » 使い方全般 » 管理画面・投稿一覧画面で複数タグでフィルタするには

  • 解決済 souyukiya

    (@souyukiya)



    お世話になっております。

    WPの管理画面の投稿一覧で、登録されている記事のうち数件をフィルタリングして表示するには、標準だと「投稿を検索」するか、日付かカテゴリ指定をしてフィルターボタンをクリックするしかありません。

    例えば100件ある記事に、それぞれタグを付けて(「HTML」・「Java」・「PHP」など種類別に)、投稿一覧画面から「Java」と「PHP」のタグがついている記事だけフィルタして表示するというのは可能でしょうか。

    標準だと一覧内の特定のタグをクリックして1種類でのフィルタは可能なようですが・・・。
    そういう機能拡張プラグインなどどなたかご存じでしたら教えて下さい。

    よろしくお願い申し上げます。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • モデレーター jim912

    (@jim912)

    souyukiyaさん、こんにちは。

    プラグインの有無は存じ上げませんが。。
    絞り込みの機能自体は備わっているので、簡単に言うと、あとは入力フォームを追加するだけでも可能です。
    投稿一覧のカテゴリー絞り込みの後には、 restrict_manage_posts というフックがあるので、ここで入力欄の表示を行います。
    1点注意は、restrict_manage_postsが、メディアライブラリの一覧でも使われているため、メディアライブラリでもタグの入力欄が出ないように注意しておく必要があります。

    function add_post_tag_restrict_filter() {
    	global $post_type;
    	if ( is_object_in_taxonomy( $post_type, 'post_tag' ) ) {
    ?>
    	<input name="tag" size="30" value="<?php echo esc_html( $_GET['tag'] ); ?>" />
    <?php
    	}
    }
    add_action( 'restrict_manage_posts', 'add_post_tag_restrict_filter' );

    一応、これでも動作はしますが、一覧内の特定のタグをクリックした際のURLのパラメータからも分かるとおり、タグのスラッグでの入力となります。
    (この方が、入力方法によって、AND検索 OR検索を選択できるので、自由度が高いのですが。)

    これをタグ名での入力とするには、入力されたタグ名をタグスラッグに変換する処理が必要となります。

    function add_post_tag_restrict_filter() {
    	global $post_type;
    	if ( is_object_in_taxonomy( $post_type, 'post_tag' ) ) {
    ?>
    	<input name="tag_name" size="30" value="<?php echo esc_html( $_GET['tag_name'] ); ?>" />
    <?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' );

    ※ 複数のタグを指定する場合は、半角カンマ繋ぎで入力してください。

    >jim912様

    ご返信ありがとうございました。
    なるほどそういうFOCKが存在したわけですね。

    一度試させて頂きます。
    本当にありがとうございました。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「管理画面・投稿一覧画面で複数タグでフィルタするには」には新たに返信することはできません。