web-dev-qa-db-fra.com

Utilisation de plusieurs méta_key dans pre_posts_query

Je filtre déjà certains messages personnalisés en fonction d'une chaîne de caractères dans pre_get_posts:

if( $query->is_main_query() ) {
    if( is_post_type_archive( 'events' ) ) {
        if ($_GET['status']) {
            $retrieved_status = $_GET['status'];
            $query->set('meta_key', 'event_status');
            $query->set('meta_value', $retrieved_status);
        }
    }
}

Je voudrais ensuite aussi trier par un champ personnalisé différent, mais je ne peux pas utiliser quelque chose comme ci-dessous car cela réécrit la méta_key:

$query->set('orderby', 'meta_value');   
$query->set('meta_key', 'event_date');   
$query->set('order', 'DESC');

Comment pourrais-je structurer cela pour obtenir l'effet souhaité? Merci!

1
Joseph186

Utilisez WP_Query pour sélectionner une publication en fonction de la clé et de la valeur méta. Vous pouvez également trier les messages Ex:

$args = array(
    'post_type'  => 'events',
    'orderby'   => 'meta_value_num', //probably you will need this because the value is date
    'meta_key'  => 'event_date',
    'meta_query' => array(
        'relation'  => 'AND',
        array(
            'key'     => 'event_status',
            'value'   => $retrieved_status, 
            'compare' => '=',
        ),
        array(
            'key' => 'other_key',
            'value'   => 'other_value',
            'type'    => 'numeric', //for example
            'compare' => 'BETWEEN', //for example
        ),
    ),
);
$query = new WP_Query( $args );

Voir Order & Orderby Parameters & pour meta_value_num voir Paramètres de champ personnalisé

3
Yamona

WP_Query a un cas pour cela appelé une méta-requête où vous pouvez passer autant d'arguments complexes que nécessaire:

$query = new WP_Query array(
    'meta_query'    => array(
        'relation'  => 'AND',       // OR is the default relation parameter, if this is excluded
        array(
            'key'       => 'meta_key_one',
            'value'     => 'meta_value_one',
            'compare'   => '<=',
        ),
        array(
            'key'       => 'meta_key_two',
            'value'     => 'meta_value_two',
            'compare'   => '<=',
        ),
    ),
) );

Ce qui précède dit:

SELECT
    All Posts
    WHERE
    Meta Keys Value One is Less Than or Equal to Passed Value One
    AND
    Meta Keys Value Two is Less Than or Equal to Passed Value Two
2
Howdy_McGee