Как сделать поиск по мета-полю в обычном поиске в админ-панели WordPress?
Здравствуйте, помогите пожалуйста решить задачу- я хочу расширить поиск админ-панели Wordpress по значениям мета-полей, используя этот код.
function add_search_query_meta( $query ) { if ( is_admin() || ! $query->is_main_query() || ! $query->is_search ) return; $s = get_search_query(); $query->set( 'meta_query', [ 'relation' => 'OR', [ 'meta_key' => '_company_inn', 'value' => $s, 'compare' => 'LIKE', ], [ 'meta_key' => '_company_phone', 'value' => $s, 'compare' => 'LIKE', ], ] ); $query->set( 'post_type', 'company' ); } add_filter( 'pre_get_posts', 'add_search_query_meta' ); function modify_where_search_request( $where ) { if ( is_admin() || ! is_main_query() || ! is_search() ) return $where; global $wpdb; $s = get_search_query(); $where = preg_replace( [ "~ OR ({$wpdb->posts}.post_[^s]+ (LIKE '(?:%|{[^}]+}){$s}(?:%|{[^}]+})'))~i", // убираем поиск по контенту и цитате "~ANDs+([s(]+{$wpdb->wp_pn_companymeta}.meta_key)~i" // меняем AND условие мета-запроса на OR ], [ '', 'OR $1' ], $where ); return $where; } add_action( 'posts_where_request', 'modify_where_search_request' ); |
function add_search_query_meta( $query ) { if ( is_admin() || ! $query->is_main_query() || ! $query->is_search ) return; $s = get_search_query(); $query->set( 'meta_query', [ 'relation' => 'OR', [ 'meta_key' => '_company_inn', 'value' => $s, 'compare' => 'LIKE', ], [ 'meta_key' => '_company_phone', 'value' => $s, 'compare' => 'LIKE', ], ] ); $query->set( 'post_type', 'company' ); } add_filter( 'pre_get_posts', 'add_search_query_meta' ); function modify_where_search_request( $where ) { if ( is_admin() || ! is_main_query() || ! is_search() ) return $where; global $wpdb; $s = get_search_query(); $where = preg_replace( [ "~ OR ({$wpdb->posts}.post_[^s]+ (LIKE '(?:%|{[^}]+}){$s}(?:%|{[^}]+})'))~i", // убираем поиск по контенту и цитате "~ANDs+([s(]+{$wpdb->wp_pn_companymeta}.meta_key)~i" // меняем AND условие мета-запроса на OR ], [ '', 'OR $1' ], $where ); return $where; } add_action( 'posts_where_request', 'modify_where_search_request' );
Структура моей базы данных:
Вот ключи, к которым я пытаюсь получить доступ и получить значение:
Плагин вакансий какой-то самопис. Я перепробовал уже все методы связанные с этой темой, но все безрезультатно.
Вот сам плагин
Дополнительно:
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос


В вашем коде основная проблема в условиях: Вы хотите менять поиск в админке, но сразу выходите из функции при
is_admin(). То есть нужный код в админке вообще не выполняется. Плюс$query->is_searchнаписан как свойство, а в WordPress обычно используется метод$query->is_search().Если речь именно про поиск в списке записей CPT в админке, делайте так:
add_action('pre_get_posts', function (WP_Query $query) { if (!is_admin() || !$query->is_main_query()) { return; } global $pagenow; if ($pagenow !== 'edit.php') { return; } if (($query->get('post_type') ?: 'post') !== 'company') { return; } $search = trim((string) $query->get('s')); if ($search === '') { return; } $query->set('meta_query', [ 'relation' => 'OR', [ 'key' => '_company_inn', 'value' => $search, 'compare' => 'LIKE', ], [ 'key' => '_company_phone', 'value' => $search, 'compare' => 'LIKE', ], ]); });
Но есть нюанс: стандартный параметр
sвсё равно добавляет поиск по заголовку и контенту. Если нужно искать только по мета-полям, проще убрать стандартный поиск через фильтрposts_searchтолько для вашего CPT:add_filter('posts_search', function ($search, WP_Query $query) { if (!is_admin() || !$query->is_main_query()) { return $search; } if (($query->get('post_type') ?: 'post') !== 'company') { return $search; } return ''; }, 10, 2);
Не обращайтесь к таблице как
{$wpdb->wp_pn_companymeta}, если это обычные мета-поля WordPress. Для записей используется$wpdb->postmeta. Если самописный плагин хранит данные в отдельной таблице, тогдаmeta_queryвообще не поможет: придётся писатьJOINк этой таблице черезposts_join,posts_whereи обязательно добавлятьDISTINCT, чтобы не получить дубли записей.Сначала проверьте, где реально лежат значения: в
wp_postmetaили в отдельной таблице плагина. Если вwp_postmeta, используйте код выше. Если в своей таблице, покажите её имя, поле связи с записью и названия колонок — тогда запрос нужно собирать через JOIN, а не черезmeta_query.