WP_Query ordenado por un campo personalizado y luego otro en una consulta

4

¡Espero poder explicarlo correctamente, así que aquí vamos!

Tengo una página de listado de propiedades que debe ordenarse antes de la fecha en que se publicó (los datos provienen de una API, por lo que no es la fecha de publicación de WP) y luego todas las propiedades vendidas deberían estar en el último lugar en la lista ordenada por cuándo. vendido con los más vendidos recientemente apareciendo primero en esa sub lista. El primer campo personalizado se llama listing_date y el otro es agreement_date.

¿Alguien sabe si este tipo de pedido es posible? Estaba pensando que podría necesitar usar 2 consultas, pero eso significaría que no podría usar la paginación con esa solución. Aquí está mi intento fallido más reciente.

        <?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);

¡Gracias!

Código actualizado:

   $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'
            ),      
       );
    
pregunta Barry Walsh 15.05.2016 - 22:49

1 respuesta

5

Según enlace desea especificarlo similar al siguiente código de ejemplo:

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

Esto es compatible desde WordPress 4.0.

Para los campos personalizados (publicar meta) necesitará una meta consulta adicional, como se detalla en 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',
) );

Esto es compatible desde 4.2.

En su caso (editado de su pregunta) creo que necesitaría:

$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'
    ),      
);
    
respondido por el Pim Schaaf 15.05.2016 - 23:19

Lea otras preguntas en las etiquetas