web-dev-qa-db-ja.com

管理者検索投稿フィールドを変更するにはどうすればよいですか。

多くのカスタムフィールドを含むカスタム投稿タイプがあります。管理検索の検索対象として追加したい。

現在、管理者検索ではコンテンツとタイトルのみが検索されていますが、これらのカスタムフィールドも検索したいと思います。

それをする方法はありますか?

5
hannit cohen

可能ですが、実際のクエリで少し遊ぶ必要があります。いつものように、猛烈な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' );

ノート

  1. 検索可能にするためにいくつかの部分を非シリアル化する必要があるかもしれません。
  2. クエリを変更する前($piecesを受け取った直後)に、$search_stringをダンプしてそれらを調べてください。
5
kaiser

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 );
0
jordan314