Как искать (частичное совпадение) отображаемых имен пользователей WordPress?

3 июл. 2013 г., 13:17:26
Просмотры: 38.9K
Голосов: 15

Мне нужно создать страницу поиска, которая будет отображать все, что связано с введенным поисковым запросом. То есть comments содержащие его, events, posts, CPTs и users с таким именем.

Как я могу найти пользователей на сайте, чье имя или фамилия содержит искомую фразу?

0
Все ответы на вопрос 6
9
32

Поиск в основной таблице

Просто используйте WP_User_Query с аргументом поиска.

Например, если вам нужно найти пользователя по ключевому слову в его user_email или других колонках из таблицы {$wpdb->prefix}users, вы можете сделать следующее:

$users = new WP_User_Query( array(
    'search'         => '*'.esc_attr( $your_search_string ).'*',
    'search_columns' => array(
        'user_login',
        'user_nicename',
        'user_email',
        'user_url',
    ),
) );
$users_found = $users->get_results();

Учтите, что * является подстановочным символом. Например, чтобы ограничить поиск по user_email определенному домену, используйте строку поиска: *@example.com.

Аргумент search имеет несколько "волшебных" особенностей: search_columns по умолчанию включает...

  • user_email, если в аргументе search есть символ @
  • user_login и ID, если аргумент search числовой
  • user_url, если строка поиска содержит http:// или https://
  • или ... user_login и user_nicename для строковых значений.

Все эти значения по умолчанию устанавливаются только если аргумент search_columns не указан.

Поиск в таблице метаданных

Если вам нужно искать по полям вроде first_name или last_name, которые не входят в основную таблицу, используйте meta_query:

$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'first_name',
            'value'   => $search_string,
            'compare' => 'LIKE'
        ),
        array(
            'key'     => 'last_name',
            'value'   => $search_string,
            'compare' => 'LIKE'
        )
    )
) );
$users_found = $users->get_results();

Убедитесь, что вы получаете правильную строку поиска. Обычно это get_query_var('s');, но в зависимости от формы это может быть другой параметр, например $_GET['user_search']. Обязательно экранируйте его и удаляйте лишние пробелы в начале и конце строки.

Обратите внимание, что это array( array() ) из-за наличия ключа relation. Если вам нужно искать только по одному полю, можно использовать упрощенный вариант:

$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
    'meta_key'     => 'first_name',
    'meta_value'   => $search_string,
    'meta_compare' => 'LIKE',
) );
$users_found = $users->get_results();

Итоговый запрос

В результате запрос может выглядеть примерно так:

$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
    'search'         => "*{$search_string}*",
    'search_columns' => array(
        'user_login',
        'user_nicename',
        'user_email',
        'user_url',
    ),
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'first_name',
            'value'   => $search_string,
            'compare' => 'LIKE'
        ),
        array(
            'key'     => 'last_name',
            'value'   => $search_string,
            'compare' => 'LIKE'
        )
    )
) );
$users_found = $users->get_results();
3 июл. 2013 г. 14:22:05
Комментарии

В какой файл мне нужно добавить этот запрос?

Naveen Naveen
27 янв. 2014 г. 09:04:40

@Naveen Лучше всего добавить его либо в functions.php, либо в ваш шаблон, либо (что было бы оптимально) красиво упаковать в небольшой кастомный плагин, чтобы не потерять функциональность при смене темы.

kaiser kaiser
27 янв. 2014 г. 12:54:15

Kiaser, спасибо за ответ. Пожалуйста, помогите мне, как я могу интегрировать этот код в functions.php

Naveen Naveen
27 янв. 2014 г. 13:11:41

@Naveen Это выходит за рамки данного обсуждения. Вам нужно немного изучить код или найти разработчика, который сделает это за вас. Также прочитайте этот вопрос/ответ.

kaiser kaiser
27 янв. 2014 г. 13:17:20

display_name - это столбец в таблице wp_users. Возникает два вопроса. 1: Это недавнее изменение в схеме базы данных? 2: Можно ли использовать его как значение в search_columns вместо мета-запроса?

henrywright henrywright
13 авг. 2017 г. 12:08:03

@kaiser вместо user_email работает email, как указано в основном файле /var/www/html/rated_lettings/wp-includes/class-wp-user-query.php #163 $search_columns Массив имен столбцов для поиска. Принимает 'ID', 'login', 'nicename', 'email', 'url'. По умолчанию пустой массив.

<br/> что-то я упускаю?

inrsaurabh inrsaurabh
25 июн. 2018 г. 15:12:04

@inrsaurabh с момента того ответа прошло уже 5 лет. Не знаю, изменилось ли там что-то и если да, то что именно. :)

kaiser kaiser
25 июн. 2018 г. 15:34:10

@kaiser я думаю, что я прав и нам следует использовать email

https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-user-query.php#L162

inrsaurabh inrsaurabh
25 июн. 2018 г. 15:40:22

@inrsaurabh Посмотрите вот здесь.

kaiser kaiser
25 июн. 2018 г. 16:17:58
Показать остальные 4 комментариев
0

Это помогло мне вместо ответа kaiser: https://laubsterboy.com/blog/2015/07/search-wordpress-users-by-name/

Но в этом решении функция $wpdb->escape($usermeta_keys) вызывала ошибку, поэтому я просто использовал $usermeta_keys.

4 авг. 2017 г. 14:07:04
1

Пользовательское решение

Я знаю, что мой ответ запоздал, но я искал то же самое и реализовал это с некоторой помощью ответа @kaiser. Я буду отображать только заголовок, ссылку и краткое описание/email пользователя, но вы, конечно, можете расширить это по своему усмотрению.

Пользовательский массив

Я начал с создания пустого массива:

$search_results = array();

Поиск пользователей

Затем перешел к 'WP_User_Query', который использует пользовательский ввод ($search_results) для фильтрации.

$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
    'search'         => "*{$search_string}*",
    'search_columns' => array(
        'user_login',
        'user_nicename',
        'user_email',
        'user_url',
    ),
) );

Заполняем массив данными пользователей

Теперь мы заполним этот запрос в нашем пустом массиве ($search_results).

if (!empty($users->results)) :
    foreach ($users->results as $user => $value) :
        $tmp_array = array();
        $data = $value->data;
        $user_id = $data->ID;
        $tmp_array['link'] = get_the_author_link($user_id); 
        $tmp_array['text'] = $data->user_url;
        $tmp_array['title'] = $data->display_name;
        $search_results[] = $tmp_array;
    endforeach;
endif;

Заполняем массив данными записей/страниц

Мы также хотим, чтобы обычная форма поиска, которая ищет страницы и записи, продолжала работать, поэтому нам нужно также пройтись по этим данным. Пока мы это делаем, мы также заполним наш массив ($search_results) этими данными:

$query_string = esc_attr($query_string);
$search = new WP_Query($query_string);
if ( $search->have_posts() ) :
    while ( $search->have_posts() ) : $search->the_post();
        $tmp_array = array();
        $tmp_array['link'] = get_the_permalink();; 
        $tmp_array['title'] = get_the_title();
        $tmp_array['text'] = get_the_excerpt();
        $search_results[] = $tmp_array;
    endwhile;
endif;

Перебираем наш массив

Теперь у нас есть массив, содержащий информацию о пользователях и детали записей/страниц. Последнее, что нам нужно сделать, это перебрать его, чтобы пользователь увидел результаты своего поиска:

<?php if(!empty($search_results)): ?>
    <?php foreach ($search_results as $result) : ?>
        <a class="search-item" href="<?php echo $result['link']; ?>">
            <h2 class="search-title"><?php echo $result['title']; ?></h2>
            <span class="search-text"><?php echo $result['text']; ?></span>
        </a>
    <?php endforeach; ?>
<?php else: ?>
<div class="nothing-found">
    <h3><?php echo 'Ничего не найдено.'; ?></h3>
</div>
<?php endif; ?>

Готово!

26 авг. 2020 г. 17:27:23
Комментарии

Думаю, это может быть хорошей идеей для небольшой коллекции пользователей...

Sagive Sagive
6 нояб. 2021 г. 23:20:06
2

Недавно, работая над крупным проектом, мои клиенты столкнулись с проблемами при поиске пользователей по имени, фамилии или названию компании/бизнеса.

Тогда я подумал: почему бы не создать плагин, объединив свои навыки фронтенд-разработки с PHP. Для реализации я выбрал VueJs и Axios.

https://wordpress.org/plugins/robust-user-search/

Этот плагин позволяет искать пользователей по: Имени пользователя, Имени, Фамилии, Email или Названию компании.

Интерфейс плагина Robust User Search

11 сент. 2020 г. 09:51:27
Комментарии

Добро пожаловать на WPSE. Обратите внимание, что вы должны раскрывать свою аффилированность при продвижении материалов, https://wordpress.stackexchange.com/help/promotion

Antti Koskinen Antti Koskinen
11 сент. 2020 г. 16:23:38

@AnttiKoskinen Эй, так лучше?

primegxy primegxy
12 сент. 2020 г. 00:09:02
0

Если вы используете более простую функцию get_user(), вы можете применить следующий код:

$users = get_users(array('search' => '*'.esc_attr( $search_string).'*'));
9 мая 2022 г. 16:50:35
0
-1
$search_string = esc_attr( trim( get_query_var('s') ) ); // Получаем и очищаем поисковую строку
$users = new WP_User_Query( array(
    'search'         => "*{$search_string}*", // Ищем пользователей по строке с подстановочными символами
    'search_columns' => array( // Колонки для поиска в таблице пользователей
        'user_login',    // Логин пользователя
        'user_nicename', // Красивое имя пользователя
        'user_email',    // Email пользователя
        'user_url',      // URL пользователя
    ),
    'meta_query' => array( // Дополнительный поиск по метаполям
        'relation' => 'OR', // Используем логическое ИЛИ для условий
        array(
            'key'     => 'first_name', // Ищем по имени
            'value'   => $search_string,
            'compare' => 'LIKE'
        ),
        array(
            'key'     => 'last_name', // Ищем по фамилии
            'value'   => $search_string,
            'compare' => 'LIKE'
        )
    )
) );
$users_found = $users->get_results(); // Получаем результаты поиска
25 июн. 2021 г. 17:52:17