Je dois faire un WP_Query
avec un LIKE
sur le post_title
.
J'ai commencé avec cette habituée WP_Query
:
$wp_query = new WP_Query(
array (
'post_type' => 'wp_exposants',
'posts_per_page' => '1',
'post_status' => 'publish',
'orderby' => 'title',
'order' => 'ASC',
'paged' => $paged
)
);
Mais ce que je veux réellement faire ressemble à ceci en SQL:
$query = "
SELECT *
FROM $wpdb->posts
WHERE $wpdb->posts.post_title LIKE '$param2%'
AND $wpdb->posts.post_type = 'wp_exposants'
ORDER BY $wpdb->posts.post_title
";
$wpdb->get_results($query);
La sortie imprime les résultats que je m'attendais, mais j'utilise la normale <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
pour afficher les résultats.
Et cela ne fonctionne pas avec $wpdb->get_results()
.
Comment puis-je atteindre ce que j'ai décrit ici?
$wpdb->prepare()
.prepare()
.$wpdb->prepare('LIKE "%s%%"', 'banana')
reviendrait"LIKE ''banana'%'"
, alors nous devons construire la requête nous-mêmes et faire la fuite aussi.prepare()
. Ouais, c'est délicat et j'ai dû essayer cela plusieurs fois avant de le contourner. De quelque chose que je viens de faire:$wpdb->prepare( ' AND {$wpdb->posts}.post_title LIKE %s ', esc_sql( '%'.like_escape( trim( $term ) ).'%' ) )
. Et je suis à peu près sûr queesc_sql()
c'est inutile et simplement paranoïaque.'
(apostrophe) à l'intérieur. Je suppose que c'est à cause de s'échapper? Je n'ai pas encore trouvé la solutionSimplifié:
la source
Je voulais mettre à jour ce code sur lequel vous avez travaillé pour wordpress 4.0 et versions supérieures, car esc_sql () est obsolète dans la version 4.0.
Le reste est pareil.
De plus, je tiens à souligner que vous pouvez utiliser la variable s dans les arguments WP_Query pour transmettre les termes de recherche, ce qui permettra également de rechercher le titre de l'article, je crois.
Comme ça:
la source
search_prod_title
? Devrais-je changer cela en quelque chose d'autre?esc_sql
dépris? Ce n'est pas.$wpdb->escape
est si ... developer.wordpress.org/reference/functions/esc_sqlAvec une solution vulnérable publiée ici, je viens avec une version un peu simplifiée et assainie.
Tout d'abord, nous créons une fonction pour le
posts_where
filtre qui vous permet d'afficher uniquement les publications correspondant à des conditions spécifiques:Maintenant, nous ajoutons
cc_search_post_title
dans nos arguments de requête:Et enfin, enroulez le filtre autour de la requête:
Utiliser get_posts ()
Certaines fonctions qui récupèrent des publications n'utilisent pas de filtres. Par conséquent, les fonctions de filtre posts_where que vous attachez ne modifieront pas la requête. Si vous envisagez d’
get_posts()
interroger vos publications, vous devez définir la valeursuppress_filters
false dans votre tableau d’arguments:Maintenant vous pouvez utiliser
get_posts()
:Qu'en est-il du
s
paramètre?Le
s
paramètre est disponible:Lors de l'ajout de votre terme de recherche dans les
s
paramètres de travail, le titre de la recherche sera également recherché , mais également le contenu de la publication.Qu'en est-il du
title
paramètre ajouté avec WP 4.4?Passer un terme de recherche dans le
title
paramètre:Est sensible à la casse et
LIKE
non%LIKE%
. Cette recherche moyennehello
ne renverra pas de message avec le titreHello World
ouHello
.la source
En me basant sur d’autres réponses que j’ai eues avant, pour offrir une certaine flexibilité dans les situations où vous souhaitez rechercher un article qui contient un mot dans un champ méta OU dans le titre de l’article, je donne cette option via l’argument "title_filter_relation". Dans cette implémentation, je n'autorise que les entrées "OU" ou "ET" avec la valeur par défaut de "ET".
Voici un exemple de code en action pour un type de message très simple "faq" où la question est le titre du message lui-même:
la source
WP_Query
afin de pouvoir y accéder dans leposts_where
filtre.