多くのカスタムフィールドを含むカスタム投稿タイプがあります。管理検索の検索対象として追加したい。
現在、管理者検索ではコンテンツとタイトルのみが検索されていますが、これらのカスタムフィールドも検索したいと思います。
それをする方法はありますか?
は可能ですが、実際のクエリで少し遊ぶ必要があります。いつものように、猛烈なposts_clauses
フィルタが有効になります。
function wpse_alter_posts_search( $pieces )
{
global $wpdb;
// Make the input save
$search_string = like_escape( $_GET['s'] );
// Your new WHERE clause
$where = $wpdb->prepare(
"$wpdb->postmeta.%s LIKE %s",
'YOUR_COLUMN', // Should match your col name 1)
"%{$search_string}%"
);
// Not sure if this exactly the same on your install 2)
$pieces['where'] = str_replace( 'AND (((', "AND ((({$where} ", $pieces['where'] );
return $pieces;
}
add_filter( 'posts_clauses', 'wpse_alter_posts_search' );
ノート
$pieces
を受け取った直後)に、$search_string
をダンプしてそれらを調べてください。kaiserの答えで私は正しい軌道に乗ったが、私はpostmeta
テーブルに参加してグループを追加しなければならなかった。
今like_escape
は$wpdb->esc_like
です。 [your_post_type]
をあなたの投稿タイプに、そして[your_postmeta_key]
をあなたのメタキーに置き換えてください。
//join postmeta for search
add_filter( 'posts_join' , function($join){
global $wpdb;
if(is_search() && is_admin() && $_GET['post_type'] == '[your_post_type]')
{
$join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
}
return $join;
});
//search [your_postmeta_key] for search string
add_filter( 'posts_where', function( $where )
{
global $wpdb;
if(is_search() && is_admin() && $_GET['post_type'] == '[your_post_type]')
{
$searchstring = '%' . $wpdb->esc_like( $_GET['s'] ) . '%';
//search [your_postmeta_key] as well
$where .= $wpdb->prepare(" OR ($wpdb->postmeta.meta_key = '[your_postmeta_key]' AND $wpdb->postmeta.meta_value LIKE %s) ", $searchstring);
}
return $where;
});
//group by post ID
add_filter( 'posts_groupby', function ($groupby, $query) {
global $wpdb;
if(is_search() && is_admin() && $_GET['post_type'] == '[your_post_type]')
{
$groupby = "{$wpdb->posts}.ID";
}
return $groupby;
}, 10, 2 );