Consulta personalizada con orderby meta_value de campo personalizado
Como sabes, desde WP3.0 existen opciones para consultas avanzadas personalizadas, lo cual es genial. A partir de esto, algunos parámetros de consulta de campos personalizados como meta_key, meta_value fueron deprecados por el nuevo parámetro meta_query (ver aquí)
Estoy tratando de hacer una consulta bastante simple con la nueva sintaxis, consultando posts por un cierto post_type (services) que contiene una meta_key específica (order_in_archive) - esto funciona bien como se esperaba. Pero - quiero ordenar la consulta por el meta_value, y no lo consigo.
Esta es mi consulta -
query_posts(
array( 'post_type' => 'services',
'order' => 'ASC',
'orderby' => 'meta_value',
'meta_query' => array(
array('key' => 'order_in_archive'))
)
);
He intentado orderby también con meta_value_numeric y meta_value, pero en cualquier caso los resultados se están ordenando por la fecha de publicación (como lo hacen los posts regulares). ¿Alguien sabe cómo se puede hacer esto?
Gracias

Puedes definir la clave meta para el parámetro orderby usando el método antiguo (lo probé en WP 3.1.1)...
query_posts(
array( 'post_type' => 'services',
'order' => 'ASC',
'meta_key' => 'some_key',
'orderby' => 'meta_value', //o 'meta_value_num'
'meta_query' => array(
array('key' => 'order_in_archive',
'value' => 'some_value'
)
)
)
);

Este problema en general está resuelto a partir de WordPress 4.2 mediante el uso de consultas nombradas. Por ejemplo:
$args = array(
'post_type' => 'services',
'orderby' => 'order_clause',
'meta_query' => array(
'order_clause' => array(
'key' => 'order_in_archive',
'value' => 'some_value',
'type' => 'NUMERIC' // a menos que el campo no sea numérico
)));
En mi caso, quería ordenar por un campo numérico y tuve que usar 'type' => 'NUMERIC'
dentro de la meta consulta.

El WP Codex es realmente confuso al abordar este problema.
En realidad no necesitas el parámetro meta_query para usar orderby, en su lugar utiliza el parámetro meta_key, que aunque según el WP Codex está obsoleto, se ha establecido aquí: ¿Cómo se usa orderby con meta_query en Wordpress 3.1? que orderby todavía necesita el meta_key.
así que debería ser
query_posts( array(
'post_type' => 'services',
'order' => 'ASC',
'orderby' => 'meta_value',
'meta_key' => 'order_in_archive'
) )

Bueno, sí, este es el método antiguo para hacer esta consulta y parece que funciona para esta en particular. Sin embargo, para consultas más complejas, no funcionará. Descubrí que este es un problema conocido que se está solucionando, los detalles se pueden encontrar en los tickets de trac #15031 y #17065

Es fácil:
Aquí está mi código:
query_posts(array(
'post_type' => 'directors',
'posts_per_page' => -1,
'order' => 'ASC',
'orderby' => 'director_weight',
'meta_key' => 'director_weight'
) );
El detalle principal es: incluir meta_key
, mi código no ordenaba a menos que se incluyera meta_key
, y eso es todo:
Aquí está el código completo de una lista de imágenes de directors
ordenadas por director_weight
:
<?php
query_posts(array(
'post_type' => 'directors',
'posts_per_page' => -1,
'order' => 'ASC',
'orderby' => 'director_weight',
'meta_key' => 'director_weight'
) );
while (have_posts()) : the_post();
?>
<li <?php echo get_field('director_weight') ?>>
<img src="<?php echo get_field('director_imagen') ?>" alt="Imagen del director" title="Foto del director">
</li>
<?php
endwhile;
wp_reset_query();
?>

No utilices query_posts.
$meta_query = new WP_Meta_Query( $meta_query_args );
$meta_query_args = array(
'post_type' => 'servicios',
'order' => 'ASC',
'meta_key' => 'tu_clave',
'orderby' => 'meta_value', //o 'meta_value_num'
'meta_query' => array(
array('key' => 'orden_en_archivo',
'value' => 'algún_valor'
)));
Utiliza los parámetros de WP_Meta_Query

Tenía un conjunto de fechas de eventos personalizados que necesitaba ordenar por fecha descendente. Como mi fecha de evento personalizada estaba almacenada en la tabla wp_postmeta, y normalmente era diferente a las fechas post_date o modified, esto funcionó para mí:
$args = array(
'post_type' => 'events', // mi tipo de post - el tuyo puede ser 'posts'
'post_status' => 'publish', // solo obtener posts con este estado
'orderby' => 'meta_value', // ordenar por el meta_value de la siguiente meta_key
'meta_key' => 'my_custom_eventdate', // el nombre personalizado de la meta_key
'order'=> 'DESC' // orden descendente
);
$posts = new WP_Query($args);
Luego puedes iterar a través de $posts así:
foreach($posts->posts as $p){
$post_id = $p->ID;
// y así sucesivamente...
// # ejemplo de cómo recupero mi fecha de evento
$event = get_post_meta($post_id, 'my_custom_eventdate', true);
}

La siguiente solución funciona:
$args = array(
'post_type' => 'services',
'order' => 'ASC',
'orderby' => 'order_clause',
'meta_query' => array(
'order_clause' => array(
'key' => 'order_in_archive'
)
)
);
Necesitabas proporcionar la clave del subarray meta_query order_clause
para tu valor orderby
.

La pregunta es sobre el parámetro relativamente nuevo meta_query
y cómo hacer que funcione con orderby
, y no sobre los parámetros más antiguos pero aún funcionales meta_key
/meta_value
. Además, no fomentemos el uso de query_posts
.
