La recherche par défaut renvoie tous les types de publication, ce que je veux. Mais pour un type de publication personnalisé spécifique, je souhaite limiter le résultat à une valeur de clé méta spécifique (une date personnalisée qui doit être supérieure à celle d'aujourd'hui).
Utiliser le hook pre_get_posts et définir meta_query me permet d'obtenir le résultat correct pour ce type de publication, mais il filtre également tous les types de publication pour lesquels cette clé n'est pas définie.
Est-il possible d'utiliser la meta_query uniquement pour un cpt spécifique?
Cela devrait être assez clair mais voici néanmoins du code:
function searchExcludeOldMatches($query) {
if (!is_admin()&&$query->is_search) {
$query->set('meta_query', array(
array(
'key' => 'cpt-match-date'
,'value' => date('Y/m/d',time())
,'type' => 'DATE'
,'compare' => '>'
)
));
};
return $query;
};
add_filter('pre_get_posts','searchExcludeOldMatches');
Cela n’a peut-être pas fonctionné auparavant, mais les méta-requêtes de WordPress prennent désormais en charge le paramètre de relation. Pour compléter ce que @s_ha_dum cherchait à faire, ajoutez simplement le paramètre de relation (en tant que OR) et ajoutez une seconde méta requête pour NOT EXISTS. Exemple:
function searchExcludeOldMatches( $query ) {
//if we're on the admin panel, or it's a search, or it's not the post type we want to filter, return the original query
if( is_admin() || !$query->is_search() || $query->get( 'post_type' ) != 'yourposttype' )
return $query;
//this is the query we want to update
$query->set('meta_query', array(
'relation' => 'OR',
array(
'key' => 'cpt-match-date'
,'value' => date('Y/m/d',time())
,'type' => 'DATE'
,'compare' => '>'
),
array(
'key' => 'cpt-match-date'
,'value' => date('Y/m/d',time())
,'type' => 'DATE'
'compare' => 'NOT EXISTS'
),
));
return $query;
}
add_filter('pre_get_posts','searchExcludeOldMatches');
Pour en savoir plus, consultez la WP Page du Codex Meta Query: https://codex.wordpress.org/Class_Reference/WP_Meta_Query
Éditer 17 nov. 2015: Ajout du filtre pour le type d'article personnalisé et simplification de l'instruction conditionnelle.
Vous pouvez limiter votre requête encore plus loin ...
if (
!is_admin()
&& $query->is_search()
&& ($query->get('post_type') == 'yourposttype')
) {
// ...
Mais si vous souhaitez interroger tous les types de publication mais limiter les résultats à un seul type de publication dans la même requête , vous ne pouvez pas le faire. Vous auriez probablement besoin d'une instruction UNION
, et WP_Query
ne la prend pas en charge. Vous devrez utiliser plusieurs requêtes ou écrire votre propre SQL
.
La façon la plus simple de le faire est quelque chose comme ceci:
$post_ids = new WP_Query(array(
// query for one post type
'fields' => 'ids',
// other parameters
));
$post_ids_2 = new WP_Query(array(
// query for the others
'fields' => 'ids',
// other parameters
));
// join them
$post_ids = $post_ids->posts + $post_ids_2->posts;
$posts_qry = new WP_Query(array('post__in'=> $posts_ids));
Mais pas le plus efficace. C'est trois requêtes. Je mentionne d'autres possibilités dans un autre sujet: Requête personnalisée avec exclusion de catégorie et "liste blanche" post-méta