Consulta personalizada con orderby meta_value de campo personalizado

24 abr 2011, 02:33:13
Vistas: 165K
Votos: 47

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

0
Todas las respuestas a la pregunta 8
0
40

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'
                                )
                            )
    )
);
24 abr 2011 12:31:24
3
32

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.

15 nov 2016 03:07:52
Comentarios

¡Excelente hallazgo sobre las consultas nombradas!

Kaji Kaji
30 jul 2017 08:15:49

Sí, las consultas nombradas también respondieron mi pregunta.

Dalton Rooney Dalton Rooney
1 ago 2017 02:18:22

Excelente. No estoy seguro del significado de 'value' en esa order_clause porque no es necesario, ya que ordenará de mayor a menor valor de 'order_in_archive'.

Andrew Schultz Andrew Schultz
7 dic 2018 05:34:47
2
12

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'
) )
24 abr 2011 03:07:14
Comentarios

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

Maor Barazany Maor Barazany
24 abr 2011 03:14:09

Estaba usando el plugin Toolset para crear atributos personalizados, para usar el 'slug' de un atributo personalizado como filtro tuve que agregarle el prefijo wpcf-. Por ejemplo: 'meta_key' => 'wpcf-order_in_archive'

johnsnails johnsnails
19 jul 2021 05:23:56
0

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

Ordenar por campo personalizado en WordPress

7 jul 2017 00:29:22
0

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

7 ago 2015 14:32:13
0

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);
}
19 ene 2017 22:00:51
0

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.

17 mar 2019 13:55:48
2

Encontré que esto funciona bastante bien.

<?php 
query_posts(
array(  'posts_per_page' => '-1',
        'post_type' => 'services',
        'order'     => 'DESC',
        'meta_key' => '_order',
        'orderby'   => 'meta_value_num', // o 'meta_value_num'
      )
);
28 dic 2012 21:07:37
Comentarios

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.

s_ha_dum s_ha_dum
28 dic 2012 21:55:19

Esta respuesta contiene múltiples malas prácticas: usar -1, pasarlo como cadena, usar query_posts. Debería eliminarse.

Ihor Vorotnov Ihor Vorotnov
1 mar 2019 11:18:12