Как сделать поиск по мета-полю в обычном поиске в админ-панели WordPress?

Ссылка скопирована
1 ответ

Здравствуйте, помогите пожалуйста решить задачу- я хочу расширить поиск админ-панели 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' );

Структура моей базы данных:

Как сделать поиск по мета-полю в обычном поиске в админ-панели WordPress?

Вот ключи, к которым я пытаюсь получить доступ и получить значение:

Как сделать поиск по мета-полю в обычном поиске в админ-панели WordPress?

Плагин вакансий какой-то самопис. Я перепробовал уже все методы связанные с этой темой, но все безрезультатно.
Вот сам плагин

Дополнительно:

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ирина WP Ответ

В вашем коде основная проблема в условиях: Вы хотите менять поиск в админке, но сразу выходите из функции при 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',
        ],
    ]);
});

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

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.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно