Je souhaite rechercher des publications avec WP_Query () et sélectionner uniquement les publications commençant par une lettre spécifique. J'ai trouvé un tas d'anciennes publications avec des filtres antérieurs à 4.4, mais depuis 4.4, une recherche de titre est ajoutée à la fonction WP_Query.
$q = new WP_Query( array('post_type'=>'post','title'=>'This Song Title') );
Cela ne renverra que les correspondances exactes des publications ayant pour titre "Titre de cette chanson".
Ce que je voudrais faire, c'est renvoyer tous les articles qui commencent par, dans cet exemple, la lettre 'T'
J'ai aussi trouvé ce post, qui n'a jamais vraiment été répondu. C'est la réponse acceptée, mais je ne vois pas comment cela répond à la question. Comment limiter la recherche à la première lettre du titre?
D'autres fonctionnalités de requête, telles que les commentaires et les méta-recherches, permettent d'effectuer une comparaison pour ajouter LIKE% aux requêtes, mais le titre ne semble pas l'être.
Ce n'est pas possible avec WP_Query
directement prêt à l'emploi, mais en utilisant le filtre posts_where
pour rechercher un argument personnalisé sur WP_Query
, il est possible d'ajouter cette fonctionnalité.
En supposant que starts_with
est le nom de l'argument que nous voulons utiliser, nous pouvons filtrer posts_where
pour ajouter une clause WHERE
limitant les résultats à ceux commençant par la valeur donnée si starts_with
a été défini sur la requête:
function wpse_298888_posts_where( $where, $query ) {
global $wpdb;
$starts_with = $query->get( 'starts_with' );
if ( $starts_with ) {
$where .= " AND $wpdb->posts.post_title LIKE '$starts_with%'";
}
return $where;
}
add_filter( 'posts_where', 'wpse_298888_posts_where', 10, 2 );
Avec ce filtre ajouté, nous pouvons interroger les publications comme ceci:
$query = new WP_Query( array(
'starts_with' => 'M',
) );
Cela renverra tous les messages commençant par "M".
Si vous voulez pouvoir filtrer la requête principale, vous pouvez également utiliser cet argument dans pre_get_posts
:
function wpse_298888_pre_get_posts( $query ) {
if ( $query->is_main_query() ) {
$query->set( 'starts_with', 'M' );
}
}
add_action( 'pre_get_posts', 'wpse_298888_pre_get_posts' );