¿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, CPTs 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_emailsi@está presente en el argumentosearch.user_loginyIDsi el argumentosearches numéricouser_urlsi la cadenasearchcontienehttp://ohttps://- o ...
user_loginyuser_nicenamesi 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.
kaiser
Kiaser gracias por tu respuesta. Por favor ayúdame a integrar este código en functions.php
Naveen
@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.
kaiser
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?
henrywright
@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
@inrsaurabh han pasado 5 años desde esa respuesta. No tengo idea si algo ha cambiado allí o qué. :)
kaiser
@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
@inrsaurabh Echa un vistazo aquí.
kaiser
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
Antti Koskinen
$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