¿Cómo buscar (coincidencia parcial) nombres mostrados de usuarios de WordPress?
Necesito crear una página de búsqueda que muestre cualquier cosa relacionada con la búsqueda proporcionada.
Por ejemplo, comentarios
que lo contengan, eventos
, entradas
, CPT
s y usuarios
con ese nombre.
¿Cómo puedo buscar usuarios en el sitio cuyo nombre o apellido contenga la frase de búsqueda?

Buscando en la tabla principal
Simplemente usa WP_User_Query
con un argumento de búsqueda.
Así que si quieres buscar, por ejemplo, un usuario con una palabra clave en su user_email
o columnas similares de la tabla {$wpdb->prefix}users
, puedes hacer lo siguiente:
$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();
Ten en cuenta que *
es un comodín. Así que restringir, por ejemplo, el user_email
a un solo dominio te daría la siguiente cadena de búsqueda: *@example.com
.
La cadena search
tiene algunas características "mágicas": Los search_columns
por defecto son...
user_email
si@
está presente en el argumentosearch
.user_login
yID
si el argumentosearch
es numéricouser_url
si la cadenasearch
contienehttp://
ohttps://
- o ...
user_login
yuser_nicename
si hay una cadena presente.
Todos estos valores por defecto solo se establecen si no se especificó ningún argumento search_columns
.
Buscando en la tabla de metadatos
Si quieres buscar por ejemplo first_name
o last_name
, entonces tendrás que hacer un meta_query
ya que no son parte de la tabla principal:
$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();
Asegúrate de recuperar la cadena de búsqueda correcta. Normalmente sería get_query_var('s');
, pero podría - dependiendo del name/id
de tu formulario - ser algo diferente que quizás quieras recuperar usando $_GET['user_search']
por ejemplo. Asegúrate de escaparla correctamente y eliminar espacios en blanco no deseados al principio y al final de la cadena.
Ten en cuenta que esto es un array( array() )
ya que está la clave relation
. Si solo quieres buscar una sola clave, podría ser más fácil ir con lo siguiente:
$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();
Consulta final
El resultado podría verse similar a lo siguiente:
$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 Lo más adecuado sería agregarlo en el archivo functions.php
, en tu plantilla o (lo que sería mejor) empaquetado correctamente en un mini-plugin personalizado para no perder la funcionalidad al cambiar de temas.

Kiaser gracias por tu respuesta. Por favor ayúdame a integrar este código en functions.php

@Naveen Eso está fuera del alcance aquí. Tendrás que aprender un poco sobre código o encontrar un desarrollador que haga eso por ti. Y lee ese Q/A.

display_name
es una columna en wp_users
. Dos preguntas vienen a la mente. 1: ¿Es este un cambio reciente en el esquema de la base de datos? 2: ¿Se puede usar como valor en search_columns
en lugar de la meta query?

@kaiser en lugar de user_email
email
funciona, como en el archivo core /var/www/html/rated_lettings/wp-includes/class-wp-user-query.php #163 $search_columns Array de nombres de columnas a buscar. Acepta 'ID', 'login', 'nicename', 'email', 'url'. Por defecto array vacío.
<br/> ¿me estoy perdiendo algo?

@inrsaurabh han pasado 5 años desde esa respuesta. No tengo idea si algo ha cambiado allí o qué. :)

@kaiser creo que tengo razón, deberíamos usar email
https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-user-query.php#L162

@inrsaurabh Echa un vistazo aquí.

Esto me ayudó en lugar de la respuesta de Kaiser: https://laubsterboy.com/blog/2015/07/search-wordpress-users-by-name/
Pero en esta solución la función $wpdb->escape($usermeta_keys)
generaba un error, así que simplemente usé $usermeta_keys
.

Solución personalizada
Sé que mi respuesta llega tarde, pero estaba buscando lo mismo y lo construí con algo de ayuda de la respuesta de @kaiser. Solo voy a mostrar el título, enlace y extracto/correo del usuario, pero puedes expandirlo como quieras, por supuesto.
Array personalizado
Empecé creando un array vacío:
$search_results = array();
Búsqueda de usuarios
Luego continué con 'WP_User_Query' que utiliza la entrada del usuario ($search_results) para filtrar.
$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',
),
) );
Llenar nuestro array con datos de usuario
Ahora vamos a llenar esta consulta en nuestro array vacío ($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;
Llenar nuestro array con datos de publicaciones/páginas
También queremos que el formulario de búsqueda 'normal' que busca páginas y publicaciones siga funcionando, así que necesitamos iterar sobre esto también. Mientras hacemos esto, también vamos a llenar nuestro array ($search_results) con estos datos:
$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;
Iterar sobre nuestro array
Ahora tenemos un array que contiene información de usuario y detalles de publicaciones/páginas. Lo último que necesitamos hacer ahora es iterar sobre él, para que el usuario vea los resultados que buscó:
<?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 'No se encontraron resultados.'; ?></h3>
</div>
<?php endif; ?>
¡Listo!

Recientemente, mientras trabajaba en un proyecto a gran escala, mis clientes enfrentaban problemas al buscar usuarios por su nombre, apellido o nombre de empresa/negocio.
Así que pensé, creemos un plugin y combinemos mis habilidades de front-end con PHP. Decidí utilizar VueJs y Axios para cumplir mi misión.
https://wordpress.org/plugins/robust-user-search/
Este plugin permite a los usuarios buscar por: Nombre de usuario, Nombre, Apellido, Email o Nombre de Empresa.

Bienvenido a WPSE. Ten en cuenta que debes revelar tu afiliación cuando promociones algo, https://wordpress.stackexchange.com/help/promotion

$search_string = esc_attr( trim( get_query_var('s') ) ); // Obtener y limpiar el término de búsqueda
$users = new WP_User_Query( array(
'search' => "*{$search_string}*", // Buscar el término en cualquier parte del campo
'search_columns' => array( // Columnas donde buscar
'user_login', // Nombre de usuario
'user_nicename',// Nombre para mostrar
'user_email', // Correo electrónico
'user_url', // URL del usuario
),
'meta_query' => array( // Búsqueda en metadatos
'relation' => 'OR', // Relación OR entre condiciones
array(
'key' => 'first_name', // Meta clave: nombre
'value' => $search_string, // Valor a buscar
'compare' => 'LIKE' // Comparación tipo LIKE
),
array(
'key' => 'last_name', // Meta clave: apellido
'value' => $search_string, // Valor a buscar
'compare' => 'LIKE' // Comparación tipo LIKE
)
)
) );
$users_found = $users->get_results(); // Obtener resultados de usuarios encontrados
