Je sens que je manque quelque chose de vraiment évident, mais j'ai regardé et ne peux pas comprendre cela. J'ai un CPT (request_form
) et je dois effectuer des recherches sur les méta-requêtes (wp_postmeta) plutôt que sur le titre de l'article. Le problème, c'est que je dois le faire depuis le tableau de bord de l'administrateur et que mon code ne fonctionne pas. J'ai effectué des types de recherche similaires du côté de l'utilisateur, mais pas du côté de l'administrateur auparavant. Je pensais que pre_get_posts
était le bon crochet à utiliser, mais je n'arrive à rien.
Deux choses étranges que j'ai remarquées.
meta_query
est présent deux fois dans l'objet $query
. Une fois à $query->query_vars['meta_query']
et une fois à $query->meta_query
.Lorsque j'active SAVEQUERIES
dans wp-config.php
et dump $wpdb->queries
, ma requête ne s'exécute pas du tout.
function my_search($query) {
if (!is_admin()) {
return;
}
if ($query->query['post_type'] !== 'request_form') {
return;
}
if (!$query->is_search) {
return $query;
}
$search = $query->query_vars['s'];
$meta_query = array(
'relation' => 'OR',
array(
'key' => 'request_details',
'value' => $search,
'compare' => 'LIKE'
),
array(
'key' => 'request_subject',
'value' => $search,
'compare' => 'LIKE'
)
);
$query->set('meta_query', $meta_query);
echo "<pre>";
var_dump($query);
echo "</pre>";
return $query;
}
add_action('pre_get_posts', 'my_search');
Si j'interroge directement dans la base de données en utilisant sequelpro avec les éléments suivants, je reçois exactement les messages auxquels je m'attendais (désolé, je sais que ce n'est pas exactement la même chose).
SELECT * FROM wp_postmeta WHERE meta_value LIKE "%basketball%"
Merci pour toute l'aide que vous pouvez nous apporter!
Vous pouvez installer le plug-in Query Monitor pour voir quelle requête est en cours d'exécution lorsque vous effectuez une recherche.
Je soupçonne que le problème que vous rencontrez est que vous ne supprimez pas les vars de requête initiaux. Vous ajoutez la méta-requête, mais vous n'avez pas supprimé le paramètre s =, qui recherche uniquement votre mot-clé dans le titre, le contenu et l'extrait.
Au-dessous de $query->set('meta_query', $meta_query);
, essayez d’ajouter l’un de ces choix: $query->set('s', '');
pour définir 's' sur une chaîne vide ou $query->__unset('s');
pour le désélectionner.