• 頻出する質問のようで検索するといろいろ出てくるのですが、どうもうまくいかないのでこちらに質問させていただきます。

    現在
    管理画面の投稿ページに作成者による絞り込み項目を追加する方法

    add_action('restrict_manage_posts', function() {
    	$selected = ( is_author() ) ? get_query_var( 'author' ) : 0;
    	$authors  = get_users(array('fields' => 'ids'));
    
    	printf('<label class="screen-reader-text" for="author">%s</label>', __( 'Filter by author' ));
    	printf('<select id="filter-by-author" name="author">');
    	printf('<option value="0">%s</option>', __('All author'));
    	foreach ( $authors as $author_id ) {
    		$author = get_userdata( $author_id );
    		if($selected == $author->ID){
    			printf("<option value='%s' selected>%s</option>", $author->ID, $author->display_name);					}else{
    			printf("<option value='%s'>%s</option>", $author->ID, $author->display_name);
    		}
    	}
    	printf('</selece>');
    });

    をそのまま使用して記事作成者での絞り込み機能はついているのですが、特定のカスタムフィールドの入力値による絞り込み検索も追加したいと思っています。

    カスタムフィールドの中身は数種類のパターンしかないのですが、このパターンは今後多少増えていきます。
    よろしければアドバイスをお願いいたします。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • ざっとしかみていないので、直感的ですが

    [WordPress] 管理画面の投稿一覧にカスタムフィールドの値での絞り込み検索を追加する

    とか

    カスタムフィールドを検索対象に含める

    あたりを参考にしたらいけるんじゃないかなーと思います。
    参考になれば幸いです。

    トピック投稿者 d.w.c

    (@dwc-1)

    >kimipoohさん
    ありがとうございます。

    管理画面の投稿一覧にカスタムフィールドの値での絞り込み検索を追加する
    の方ですが、使用すると一応検索はできるようにはなるのですが、まずい点が2つ出てきます。

    1つは、検索窓の位置が「絞り込み検索」のボタンの後ろに来てしまう点です。
    [日付] [投稿者] 【絞り込み検索(ボタン)】 [カスタムフィールド]
    わかりにくいですが、上記のような配置になります。

    2つめは、候補がプルダウンで出てこない点です。
    管理画面の投稿ページに作成者による絞り込み項目を追加する方法
    ではforeachで取得した検索対象の項目がプルダウンで表示されるようになっているのですが、参考にさせていただいた方法の場合はinput形式になってしまっています。
    これをどのように書き換えてforeachを組み込んでいいのかよくわかりません・・・

    カスタムフィールドを検索対象に含める
    については、プラグインのSearch Everythingを載せているのでここに書かれていることはすでに対応できているはずです。

    調べた中では
    WordPress管理画面の絞り込み検索をカスタマイズする
    の中の
    カスタムフィールドで絞り込み検索する場合の例

    カスタム投稿を {my-post-type} 、カスタムフィールドを {gender} とすると、
    
    add_action('restrict_manage_posts', 'restrict_listings_by_gender');
    function restrict_listings_by_gender() {
     global $typenow;
     $selected = array();
     if ($typenow == '{my-post-type}') {
      echo '<select name="filter_gender">';
      echo '<option value="">すべての性別</option>';
      $selected[$_GET['filter_gender']] = 'selected';
      echo '<option value="male" '. $selected["male"] . '>男</option>';
      echo '<option value="female" '. $selected["female"] . '>女</option>';
      echo '</select>';
     }
    }
    add_filter('parse_query', 'gender_query');
    function gender_query($query) {
     global $pagenow;
     global $typenow;
     if ($pagenow == 'edit.php' && $typenow == '{my-post-type}' && $_GET['filter_gender']) {
      $query->query_vars[ 'meta_key' ] = '{gender}';
      $query->query_vars[ 'meta_value' ] = $_GET['filter_gender'];
     }
     return $query;
    }

    が近いのかなとは思うのですが、うまいこと使える形に修正できませんでした。

    超適当で洗練された書き方から程遠いですが、「管理画面の投稿一覧にカスタムフィールドの値での絞り込み検索を追加する」を書き換えるなら次の通りになります。

    下記はカスタムフィールドの名前として「answer」を使っています。
    そこは適宜変更してみてください。

    add_filter('query_vars', function($vars){
        array_push($vars, 'answer');
        return $vars;
    });
    
    add_action('restrict_manage_posts', function(){
       $posts = get_posts(array('meta_key'=>'answer'));
        $selected = array();
        $selected[esc_attr($_GET['answer'])] = 'selected';
        printf('<label class="screen-reader-text" for="answer">%s</label>', __( 'Filter by answer (Custom Field)' ));
        printf('<select id="filter-by-answer" name="answer">');
        printf('<option value="0">%s</option>', __('All'));
    
        global $post;
        foreach ($posts as $post){
            setup_postdata($post);
            $value = get_post_meta($post->ID, 'answer', true);
    	printf("<option value='%s' %s>%s</option>", esc_html($value), $selected[$value], esc_html($value));
        }
    
       wp_reset_postdata();
    
        printf('</select>');
    
    });
    
    add_filter('posts_where', function( $where ) {
        global $wpdb;
        if ( !is_admin() )
            return $where;
        $value = get_query_var('answer');
        if ( !empty($value) ) {
            $where .= $wpdb->prepare("
                 AND EXISTS (
                 SELECT 'x'
                 FROM {$wpdb->postmeta} as m
                 WHERE m.post_id = {$wpdb->posts}.ID
                 AND m.meta_key = 'answer'
                 AND m.meta_value like %s
                )",
                "%{$value}%"
            );
        }
        return $where;
    });
    トピック投稿者 d.w.c

    (@dwc-1)

    返信が大変遅くなりまして申し訳ありません。
    カスタムフィールド名を「acf-send-name」というものに差し替えました。

    プルダウンのボックスが出るところまではできたのですが、中身が「全ての送信先」だけで、foreach文がうまく機能していないようです。

    add_filter('query_vars', function($vars){
        array_push($vars, 'acf-send-name');
        return $vars;
    });
    
    add_action('restrict_manage_posts', function(){
       $posts = get_posts(array('meta_key'=>'acf-send-name'));
        $selected = array();
        $selected[esc_attr($_GET['acf-send-name'])] = 'selected';
        printf('<label class="screen-reader-text" for="acf-send-name">%s</label>', __( 'Filter by acf-send-name (Custom Field)' ));
        printf('<select id="filter-by-acf-send-name" name="acf-send-name">');
        printf('<option value="0">%s</option>', __('すべての送信先'));
    
        global $post;
        foreach ($posts as $post){
            setup_postdata($post);
            $value = get_post_meta($post->ID, 'acf-send-name', true);
    	printf("<option value='%s' %s>%s</option>", esc_html($value), $selected[$value], esc_html($value));
        }
    
       wp_reset_postdata();
    
        printf('</select>');
    
    });
    
    add_filter('posts_where', function( $where ) {
        global $wpdb;
        if ( !is_admin() )
            return $where;
        $value = get_query_var('acf-send-name');
        if ( !empty($value) ) {
            $where .= $wpdb->prepare("
                 AND EXISTS (
                 SELECT 'x'
                 FROM {$wpdb->postmeta} as m
                 WHERE m.post_id = {$wpdb->posts}.ID
                 AND m.meta_key = 'acf-send-name'
                 AND m.meta_value like %s
                )",
                "%{$value}%"
            );
        }
        return $where;
    });

    カスタムフィールド名にハイフンがあるのがダメなのかと思って「answer」というカスタムフィールドを作ってみたんですが、それでもだめでした。

    カスタム投稿には対応してませんでしたね。
    get_posts は指定しなければ、投稿からしかデータを取ってきません。
    ので、get_postsの部分を

       $args = array(
    	'meta_key'=>'acf-send-name',
    	'post_type'=> get_post_type()
       );
       $posts = get_posts($args);

    なように、それぞれ必要な投稿タイプからゲットするようにしないといけませんねぇ。

    これで動作はするはずです。

    トピック投稿者 d.w.c

    (@dwc-1)

    ありがとうございます。
    提示情報が足りていませんでした、申し訳ありません。

    カスタム投稿「contact_form」
    カスタムフィールド「acf-send-name」
    で以下のように書き換えてみましたが、動作結果は変わりませんでした。

    add_filter('query_vars', function($vars){
        array_push($vars, 'acf-send-name');
        return $vars;
    });
    
    add_action('restrict_manage_posts', function(){
     $args = array(
    	'meta_key'=>'acf-send-name',
    	'post_type'=> get_post_type('contact_form')
       );
       $posts = get_posts($args);
        $selected = array();
        $selected[esc_attr($_GET['acf-send-name'])] = 'selected';
        printf('<label class="screen-reader-text" for="acf-send-name">%s</label>', __( 'Filter by acf-send-name (Custom Field)' ));
        printf('<select id="filter-by-acf-send-name" name="acf-send-name">');
        printf('<option value="0">%s</option>', __('すべての送信先'));
    
        global $post;
        foreach ($posts as $post){
            setup_postdata($post);
            $value = get_post_meta($post->ID, 'acf-send-name', true);
    	printf("<option value='%s' %s>%s</option>", esc_html($value), $selected[$value], esc_html($value));
        }
    
       wp_reset_postdata();
    
        printf('</select>');
    
    });
    
    add_filter('posts_where', function( $where ) {
        global $wpdb;
        if ( !is_admin() )
            return $where;
        $value = get_query_var('acf-send-name');
        if ( !empty($value) ) {
            $where .= $wpdb->prepare("
                 AND EXISTS (
                 SELECT 'x'
                 FROM {$wpdb->postmeta} as m
                 WHERE m.post_id = {$wpdb->posts}.ID
                 AND m.meta_key = 'acf-send-name'
                 AND m.meta_value like %s
                )",
                "%{$value}%"
            );
        }
        return $where;
    });
6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「カスタム投稿一覧の管理画面にカスタムフィールドでの絞り込み検索を実」には新たに返信することはできません。