¿Cómo query_posts usando meta_query para ordenar por meta_key Y tener un orden secundario por fecha?


8

He estado solucionando un problema en los últimos días y sigo avanzando en círculos. Realmente podría usar un par de ojos nuevos para ayudarme a responder esta pregunta ...

Así que estoy trabajando con un sitio de WordPress donde las publicaciones tienen algunos campos personalizados relevantes para la consulta que necesito ejecutar: "post-expired" y "my-sort-order". Cuando ejecuto mis query_posts, quiero que los resultados sean publicaciones donde el "post-expired" NO es "yes" (esta parte funciona en mi código). También quiero que los resultados se ordenen por el valor del número DESC de "my-sort-order" (también funciona) Y si hay un vínculo en "my-sort-order", me gustaría un orden secundario por fecha con las publicaciones más recientes primero.

El orden secundario por fecha es donde tengo problemas.

Aquí está el código que tengo ahora:

<?php               
$args = array(
    'paged' => $paged,
    'meta_query'=> array(
        array(
            'key'=>'post-expired',
            'value'=> 'yes',
            'compare' => '!='
        )
    ),
    'meta_key'=>'my-sort-order',
    'orderby'=>'meta_value_num', 
    'order'=>'DESC'
);

$args = array_merge( $args , $wp_query->query );

query_posts( $args );
?>

Usando el código anterior, recupero correctamente las publicaciones no caducadas y están ordenadas por mi orden de clasificación descendente (es decir, 100 aparecen antes de 99, etc.). Pero si ambas publicaciones tienen el mismo valor de orden de clasificación, hay algún tipo de clasificación secundaria que parece que no puedo controlar (y no puedo entender en qué se está clasificando realmente).

Mi primera idea para resolver esto fue agregar solo valores a "my-sort-order" si quería establecer un orden de clasificación específico para esa publicación. Pensé que si el valor de este campo se dejaba en blanco para el resto de las publicaciones, simplemente se devolverían en la clasificación predeterminada por fecha DESC (después de las publicaciones con un orden de clasificación establecido). Sin embargo, lo que realmente sucedió fue que las publicaciones que no tenían un valor de orden de clasificación NO se devolvieron en absoluto ...

A continuación, intenté agregar varios valores en el campo de orden de esta manera:

('orderby'=>'meta_value_num date')

Eso explotó por completo las dos órdenes de clasificación que estaba buscando y devolvió las publicaciones de una manera inesperada. Tenía la impresión de que se permitían múltiples valores de orden, pero por alguna razón no está funcionando aquí.

En este momento, no estoy seguro de cómo hacer que cualquiera de estas soluciones potenciales funcione. ¿Alguien sabe cómo puedo 1) Ordenar primero las publicaciones por el campo "my-sort-order", luego hacer que las publicaciones restantes sin valor en ese campo se devuelvan con la clasificación de fecha predeterminada; o 2) Averigua cómo controlar el orden secundario por orden para que cualquier publicación que tenga un vínculo en "my-sort-order" se clasifique por fecha (la más reciente primero).

Respuestas:


2

Espero que ya lo hayas resuelto, pero si no lo has hecho, deberías poder usar el filtro "posts_orderby" para marcar en un orden específico para tu consulta. No voy a dar una solución completa aquí, pero puede consultar esta publicación para obtener más información: http://mitcho.com/blog/how-to/external-orders-in-wordpress-queries/

EDITAR:

Aquí está la documentación: básicamente, puede anular la cláusula ORDER BY del SQL: http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_orderby

Y aquí está el código de ejemplo de los documentos:

add_filter('posts_orderby', 'edit_posts_orderby');
add_filter('posts_join_paged','edit_posts_join_paged');

function edit_posts_join_paged($join_paged_statement) {
$join_paged_statement = "LEFT JOIN wp_gdsr_data_article gdsra ON gdsra.post_id = wp_posts.ID";
return $join_paged_statement;   
}

function edit_posts_orderby($orderby_statement) {
$orderby_statement = "(gdsra.user_votes_total_sum/gdsra.user_votes_count) DESC";
return $orderby_statement;
}

Sí, el filtro posts_orderby es lo que estás buscando.
Editaré
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.