web-dev-qa-db-fra.com

Comment effectuer une recherche dans la colonne display_name lors de l'utilisation de WP_User_Query

J'utilise WP_User_Query pour ramener une liste d'utilisateurs. Selon cet article , je peux concentrer la requête sur des colonnes particulières (je suppose dans la table wp_users) à l’aide du paramètre search_columns.

Ma requête:

$args = array(
    'search' => 'Rami',
    'search_columns' => array( 'user_login', 'user_email', 'display_name' ),
);
$user_query = new WP_User_Query( $args );

Mon objectif est que ma requête soit examinée dans la colonne display_name, mais cela ne semble pas fonctionner. Fait intéressant, display_name n'est pas une colonne mentionnée dans l'exemple de article mais c'est définitivement une colonne de la table wp_users.

Comment puis-je rechercher la colonne display_name lorsque j'utilise WP_User_Query?

3
henrywright

Vous pouvez essayer ceci:

/**
 * Add support for the "display_name" search column in WP_User_Query
 * 
 * @see http://wordpress.stackexchange.com/a/166369/26350
 */
add_filter( 'user_search_columns', function( $search_columns ) {
    $search_columns[] = 'display_name';
    return $search_columns;
} );

où nous utilisons le filtre user_search_columns pour modifier les colonnes de recherche disponibles.

Alors, quels champs pouvons-nous utiliser avec ce filtre? Voici la liste de tous les champs de la table wp_users:

x ID
x user_login
  user_pass
x user_nicename
x user_email
x user_url
  user_registered
  user_activation_key
  user_status
  display_name

où j'ai marqué les colonnes de recherche par défaut avec une x.

12
birgire

Selon le codex , display_name n'est pas supporté.

Vous pouvez utiliser le filtre pre_user_query.

function henry_display_name_find( $query ) {
    global $wpdb;

    /* you don't say where the name comes from - this assumes a $_POST field */
    $display_name = $_POST['display_name'];

    $use_like_syntax = false;

    if ( $use_like_syntax = true ) {
        $query->query_where .= $wpdb->prepare( " AND $wpdb->users.display_name LIKE %s", '%' . like_escape( $display_name ) . '%' );
    } else {
        $query->query_where .= $wpdb->prepare( " AND $wpdb->users.display_name = %s", $display_name );
    }
}
add_action( 'pre_user_query', 'henry_display_name_find' );

Vous voudrez probablement ajouter et supprimer le filtre dans une fonction.

3
shanebp