it-roy-ru.com

Фильтрация поиска поля отношений ACF

Я пытаюсь назначить соответствующие сообщения, используя поле отношения ACF. Он имеет поиск по заголовкам для поиска по заголовкам.

Я хотел бы добавить поиск метаданных в поиск отношений ACF.

enter image description here

Этот вопрос заставил мой запрос работать должным образом, но поле поиска все еще говорит, что нет никаких результатов.

enter image description here

Я думаю, что typeahead удаляет результаты, потому что typeahead соответствует только заголовку.

Любые идеи, как отредактировать это, чтобы метаданные возвращались в результатах поиска?

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