web-dev-qa-db-ja.com

ACFリレーションシップフィールド検索フィルタリング

ACFリレーションシップフィールドを使用して関連投稿を割り当てようとしています。投稿タイトルで検索する先行検索があります。

ACFリレーションシップ検索にmeta_data検索を追加したいです。

enter image description here

この質問 私のクエリは正しく機能していますが、検索フィールドにはまだ結果がないと表示されています。

enter image description here

先行入力はタイトルにのみ一致するため、先行入力は結果を削除していると思います。

検索結果にメタデータが返されるようにこれを編集する方法はありますか。

2
Bryan

最初に、私の答えを理解するためにこの記事を読んでください カスタムフィールド、記事のタイトル、記事の中身を探す検索

引数を追加するときは、acf/fields/relationship/query /を使用することをお勧めします。

$args['meta_query'] = array(array(
     'key' => 'your_meta',
     'value' => $args['s'],
     'compare' => 'LIKE',
));

そのクエリを使用して、Wordpressはタイトルとメタフィールドに検索文字列を含む投稿を検索します。

そのためには、これを機能させるためにいくつかのフィルタを追加する必要があります。

function search_custom_meta_acf_add_join($joins) {
    global $wpdb;
    remove_filter('posts_join','search_custom_meta_acf_add_join');
    return $joins . " INNER JOIN {$wpdb->postmeta} as CMS15 ON ({$wpdb->posts}.ID = CMS15.post_id)";
}

function search_custom_meta_acf_alter_search($search,$qry) {
    global $wpdb;
    remove_filter('posts_search','search_custom_meta_acf_alter_search',1,2);
    $add = $wpdb->prepare("(CMS15.meta_key = 'your_field_name' AND CAST(CMS15.meta_value AS CHAR) LIKE '%%%s%%')",$qry->get('s'));
    $pat = '|\(\((.+)\)\)|';
    $search = preg_replace($pat,'(($1 OR '.$add.'))',$search);
    return $search;
}
function modify_acf_relationship_search_query ($args, $field, $post ) {
    add_filter('posts_join','search_custom_meta_acf_add_join');
    add_filter('posts_search','search_custom_meta_acf_alter_search',1,2);
    return $args;
}
add_filter('acf/fields/relationship/query/name=your_field_name', 'modify_acf_relationship_search_query', 10, 3);

ACFはリレーションフィールドの検索にwordpressの組み込み検索機能を使用するため、このコードが行うことは基本的に投稿を検索するクエリを変更することです。検索クエリを変更するフィルタは、使用すると自動的に削除されるため、心配する必要はありません。

私が上で引用した 答えによれば 、彼は内部結合でカスタムテーブル名を使用していませんが、それでも$ args ['meta_query']を使用したい場合は問題ありませんより洗練されたフィルタリングのためのパラメータ。

1
javiertoledos