web-dev-qa-db-fra.com

WP La requête utilisateur obtient tous les auteurs dont le nom commence par une lettre spécifique

Je dois programmer une page à laquelle je passe une initiale par l’URL et elle montrera tous les utilisateurs auteurs dont le nom de famille commence par cette lettre. Je souhaite effectuer cette opération via WP User Query afin de pouvoir parcourir en boucle les résultats.

En ce moment j'ai ceci:

<?php $letter = $_GET['p'] ?>
<?php
  $sql = "SELECT umfirst.meta_value AS first_name, umlast.meta_value AS last_name
          FROM $wpdb->usermeta umfirst, $wpdb->usermeta umlast, $wpdb->users user
          WHERE umlast.meta_key = 'last_name'
          AND umfirst.meta_key = 'first_name'
          AND umfirst.user_id = umlast.user_id
          AND user.id = umfirst.user_id
          AND umlast.meta_value LIKE '".$letter."%'";

  $rows = $wpdb->get_results($sql);
  foreach ($rows as $row) {
    // Do stuff with the results
  }
?>

Cependant, je préférerais que l'utilisateur WP Query, car il est plus facile d'ajouter d'autres contraintes, mais je ne parviens pas à utiliser celui-ci avec WP Query umlast.meta_value LIKE '".$letter."%'".

1
Juan Fuentes

Le problème est que vous ne pouvez pas utiliser la valeur pour la comparaison LIKE comme vous l'avez mentionné. La SQL générée ressemblera à quelque chose comme:

AND CAST(wp_usermeta.meta_value AS CHAR) LIKE '%B%'

ce qui signifie que la requête est configurée pour rechercher chaque occurrence de la lettre B dans notre cas. Bien sûr, ce n’est pas ce que vous voulez, vous auriez besoin de quelque chose comme ceci:

AND CAST(wp_usermeta.meta_value AS CHAR) LIKE 'B%'

afin que la recherche soit effectuée uniquement en commençant par par la lettre B.

La bonne nouvelle est que vous pouvez toujours obtenir ce dont vous avez besoin, mais avec le coût de ressembler un peu à un hack. :)

Le WP_User_Query:

$args = array(
    'meta_key'      => 'last_name',
    'meta_value'    => 'B########', // The '########' sequence acts sort of like an unique identifier
    'meta_compare'  => 'LIKE',
);

$wt_user_query = new WP_User_Query( $args );

Et dans functions.php, nous raccrochons au filtre get_meta_sql et modifions la clause WHERE:

function wt_custom_meta_sql( $sql ) {
    /* 
        Search for that funky so called unique identifier
        that we used to initialize our `WP_User_Query' object    
    */
    $uid = '########';
    preg_match( "/'(%[^']+{$uid}%)'/", $sql['where'], $matches );

    if ( ! empty( $matches ) ) {
        /* 
            We've found it and now we get rid of the
            extra '%' character as well as our identifier               
        */
        $val = str_replace( "{$uid}%", "%", ltrim( $matches[1], '%' ) );
        $sql['where'] = str_replace( $matches[0], "'{$val}'", $sql['where'] );
    }

    return $sql;
}
add_filter( 'get_meta_sql' , 'wt_custom_meta_sql', 40 );
3
webtoure