J'essaie de faire une recherche personnalisée pour les groupes BuddyPress.
Voici ma méthode:
public function search_groups($string){
global $wpdb;
$results = $wpdb->get_results($wpdb->prepare(
"
SELECT *
FROM {$wpdb->prefix}bp_groups
WHERE `name` LIKE '%%s%'
AND `description` LIKE '%%s%'
AND `status` = 'public'
ORDER BY `name` ASC
",
$string,
$string
));
if(!empty($results)){
$return = $results;
} else{
$return = false;
}
return $return;
}
Cependant, je reçois une erreur de base de données WordPress. Je suis à peu près sûr que c'est dû au fait que j'utilise $wpdb->prepare();
, car il utilise les signes% pour remplacer les variables.
Jetons un coup d'oeil à cette partie de ma requête:
WHERE `name` LIKE '%%s%'
AND `description` LIKE '%%s%'
Cela ressemble à un problème. Est-il possible que je puisse accomplir quelque chose dans le sens de ...
WHERE `name` LIKE '%{$string}%'
AND `description` LIKE '%{$string}%'
et toujours utiliser la méthode $wpdb->prepare();
?
J'ai trouvé une solution à ma question.
Tout d'abord, dans ma requête initiale, j'aurais dû spécifier OR au lieu de AND pour la recherche entre les noms de groupes et les descriptions de groupes. (Il faussait les résultats.)
Et j'avais besoin de double échapper à mon '%' dans les déclarations LIKE.
Voici la requête mise à jour qui fonctionne correctement:
SELECT *
FROM {$wpdb->prefix}bp_groups
WHERE `name` LIKE '%%%s%%'
OR `description` LIKE '%%%s%%'
AND `status` = 'public'
ORDER BY `name` ASC
Exemple utilisant $wpdb->query
et $wpdb->prepare
:
global $wpdb;
$wpdb->query( $wpdb->prepare(
'DELETE FROM %s WHERE `option_name` LIKE %s',
$wpdb->options,
$wpdb->esc_like(PLUGIN_SLUG . '%%')
) );