ざっとしかみていないので、直感的ですが
[WordPress] 管理画面の投稿一覧にカスタムフィールドの値での絞り込み検索を追加する
とか
カスタムフィールドを検索対象に含める
あたりを参考にしたらいけるんじゃないかなーと思います。
参考になれば幸いです。
>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;
});
返信が大変遅くなりまして申し訳ありません。
カスタムフィールド名を「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);
なように、それぞれ必要な投稿タイプからゲットするようにしないといけませんねぇ。
これで動作はするはずです。
ありがとうございます。
提示情報が足りていませんでした、申し訳ありません。
カスタム投稿「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;
});