¿Cómo buscar (coincidencia parcial) nombres mostrados de usuarios de WordPress?

3 jul 2013, 13:17:26
Vistas: 38.9K
Votos: 15

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?

0
Todas las respuestas a la pregunta 6
9
32

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 argumento search.
  • user_login y ID si el argumento search es numérico
  • user_url si la cadena search contiene http:// o https://
  • o ... user_login y user_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();
3 jul 2013 14:22:05
Comentarios

¿En qué archivo debo agregar esta consulta?

Naveen Naveen
27 ene 2014 09:04:40

@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 kaiser
27 ene 2014 12:54:15

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

Naveen Naveen
27 ene 2014 13:11:41

@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 kaiser
27 ene 2014 13:17:20

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 henrywright
13 ago 2017 12:08:03

@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
25 jun 2018 15:12:04

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

kaiser kaiser
25 jun 2018 15:34:10

@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
25 jun 2018 15:40:22

@inrsaurabh Echa un vistazo aquí.

kaiser kaiser
25 jun 2018 16:17:58
Mostrar los 4 comentarios restantes
0

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.

4 ago 2017 14:07:04
1

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!

26 ago 2020 17:27:23
Comentarios

Supongo que podría ser una buena idea para una colección pequeña de usuarios...

Sagive Sagive
6 nov 2021 23:20:06
2

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.

Interfaz del plugin de búsqueda de usuarios robusta

11 sept 2020 09:51:27
Comentarios

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

Antti Koskinen Antti Koskinen
11 sept 2020 16:23:38

@AnttiKoskinen Oye, ¿está mejor así ahora?

primegxy primegxy
12 sept 2020 00:09:02
0

Si estás utilizando la función más simple get_user(), puedes usar el siguiente código:

$users = get_users(array('search' => '*'.esc_attr( $search_string).'*'));
9 may 2022 16:50:35
0
-1
$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
25 jun 2021 17:52:17