WP_Query order by un champ personnalisé, puis un autre dans une requête

4

J'espère que je pourrai l'expliquer correctement alors allons-y!

J'ai une page de liste de propriétés qui doit être classée en fonction de la date de publication de la liste (les données proviennent d'une API et ne correspondent donc pas à la date de publication du WP), puis toutes les propriétés vendues doivent figurer en dernier dans la liste commandée par le moment où elles ont été vendu avec le plus récemment vendu apparaissant en premier dans cette sous-liste. Le premier champ personnalisé s'appelle listing_date et le second, agreement_date.

Est-ce que quelqu'un sait si ce type de commande est possible? Je pensais que je pourrais avoir besoin d'utiliser 2 requêtes mais cela signifierait que je ne serais pas capable d'utiliser la pagination avec cette solution. Voici ma dernière tentative infructueuse.

        <?php

       $args = array(
        'post_type' => 'listing',
        'posts_per_page' => 10,
        'paged' => $paged,
        'tax_query' => array(
            array(
                'taxonomy' => 'listingcategory',
                'field'    => 'slug',
                'terms'    => 'commercial',
            ),
        ),
        'orderby' => array(
            'agreed_date' => 'ASC',
            'listing_date' => 'DESC'
        ),      
       );
       $listing_posts = new WP_Query($args);

Merci!

Code mis à jour:

   $args = array(
    'post_type' => 'listing',
    'posts_per_page' => 10,
        'paged' => $paged,
        'tax_query' => array(
            array(
                'taxonomy' => 'listingcategory',
                'field'    => 'slug',
                'terms'    => 'commercial',
            ),
        'meta_query' => array(
            'relation' => 'AND',
            'listing_date_clause' => array(
                'key' => 'listing_date',
                'compare' => 'EXISTS',
            ),
            'agreed_date_clause' => array(
                'key' => 'agreed_date',
                'compare' => 'EXISTS',
            ), 
        ),
            ),
            'orderby' => array(
                'listing_date_clause' => 'DESC',
                'agreed_date_clause' => 'DESC'
            ),      
       );
    
posée Barry Walsh 15.05.2016 - 22:49

1 réponse

5

Selon enlace , vous souhaitez le spécifier, comme dans l'exemple de code suivant:

$args = array(  
     'orderby' => array( 
        'title' => 'DESC', 
        'menu_order' => 'ASC' 
    ) 
); 
$query = new WP_Query( $args );

Ceci est supporté par WordPress 4.0.

Pour les champs personnalisés (post-méta), vous aurez besoin d'une méta-requête supplémentaire, comme détaillé sur enlace

E.g:

$q = new WP_Query( array(
'meta_query' => array(
    'relation' => 'AND',
    'state_clause' => array(
        'key' => 'state',
        'value' => 'Wisconsin',
    ),
    'city_clause' => array(
        'key' => 'city',
        'compare' => 'EXISTS',
    ), 
),
'orderby' => 'city_clause',
) );

Ceci est pris en charge depuis la version 4.2.

Dans votre cas (corrigé à partir de votre question), je pense que vous auriez besoin de:

$args = array(
    'post_type' => 'listing',
    'posts_per_page' => 10,
    'paged' => $paged,
    'tax_query' => array(
        array(
            'taxonomy' => 'listingcategory',
            'field'    => 'slug',
            'terms'    => 'commercial',
        )
    ),
    'meta_query' => array(
        'relation' => 'AND',
        'listing_date_clause' => array(
            'key' => 'listing_date',
            'compare' => 'EXISTS',
        ),
        'agreed_date_clause' => array(
            'key' => 'agreed_date',
            'compare' => 'EXISTS',
        ), 
    ),
    'orderby' => array(
        'listing_date_clause' => 'DESC',
        'agreed_date_clause' => 'DESC'
    ),      
);
    
réponse donnée Pim Schaaf 15.05.2016 - 23:19

Lire d'autres questions sur les étiquettes