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."%'"
.
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 );