web-dev-qa-db-fra.com

filtrer les résultats de la recherche avec la clé méta de type de message personnalisé

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');
2
Sjeiti

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.

1
Elliott Post

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

En relation

https://wordpress.stackexchange.com/a/79977/21376

1
s_ha_dum