Как искать (частичное совпадение) отображаемых имен пользователей WordPress?
Мне нужно создать страницу поиска, которая будет отображать все, что связано с введенным поисковым запросом.
То есть comments
содержащие его, events
, posts
, CPT
s и users
с таким именем.
Как я могу найти пользователей на сайте, чье имя или фамилия содержит искомую фразу?

Поиск в основной таблице
Просто используйте 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();

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

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

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

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

@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 с момента того ответа прошло уже 5 лет. Не знаю, изменилось ли там что-то и если да, то что именно. :)

@kaiser я думаю, что я прав и нам следует использовать email
https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-user-query.php#L162

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

Это помогло мне вместо ответа kaiser: https://laubsterboy.com/blog/2015/07/search-wordpress-users-by-name/
Но в этом решении функция $wpdb->escape($usermeta_keys)
вызывала ошибку, поэтому я просто использовал $usermeta_keys
.

Пользовательское решение
Я знаю, что мой ответ запоздал, но я искал то же самое и реализовал это с некоторой помощью ответа @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; ?>
Готово!

Недавно, работая над крупным проектом, мои клиенты столкнулись с проблемами при поиске пользователей по имени, фамилии или названию компании/бизнеса.
Тогда я подумал: почему бы не создать плагин, объединив свои навыки фронтенд-разработки с PHP. Для реализации я выбрал VueJs и Axios.
https://wordpress.org/plugins/robust-user-search/
Этот плагин позволяет искать пользователей по: Имени пользователя, Имени, Фамилии, Email или Названию компании.

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

$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(); // Получаем результаты поиска
