Consulta personalizada con orderby meta_value del campo personalizado


37

Aa ya sabes, a partir de WP3.0 hay 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 quedaron en desuso para el nuevo parámetro meta_query ( ver aquí )

Intento tener una consulta bastante simple con la nueva sintaxis, consultar publicaciones de cierto post_type (servicios) que contiene una meta_key específica (order_in_archive), esto está yendo bien como se esperaba. Pero, quiero ordenar por la consulta por el meta_valor, y sin éxito.

Esta es mi consulta

   query_posts(
    array(  'post_type' => 'services',
        'order' => 'ASC',
        'orderby' => 'meta_value',
        'meta_query' => array(
            array('key' => 'order_in_archive'))
    )
);

Intenté ordenar por meta_value_numeric y meta_value, pero en cualquier caso los resultados están ordenados por la fecha de publicación (como lo hacen las publicaciones regulares). Alguien sabe cómo se puede hacer esto?

Gracias

Respuestas:


35

Puede definir la meta clave para el parámetro orderby utilizando el método anterior (probé en WP 3.1.1) ...

query_posts(
    array(  'post_type' => 'services',
            'order'     => 'ASC',
            'meta_key' => 'some_key',
            'orderby'   => 'meta_value', //or 'meta_value_num'
            'meta_query' => array(
                                array('key' => 'order_in_archive',
                                      'value' => 'some_value'
                                )
                            )
    )
);

15

Este problema en general se soluciona en WordPress 4.2 mediante consultas con nombre. p.ej

$args = array(
  'post_type' => 'services',
  'orderby'   => 'order_clause',
  'meta_query' => array(
       'order_clause' => array(
            'key' => 'order_in_archive',
            'value' => 'some_value',
            'type' => 'NUMERIC' // unless the field is not a number
)));

Para mí, quería ordenar por un campo numérico y tuve que usar 'type' => 'NUMERIC'dentro de la meta consulta.


1
Impresionante encontrar en las consultas con nombre!
— Kaji

Sí, las consultas con nombre también me respondieron la pregunta.
— Dalton

Excelente. No estoy seguro de la importancia de 'valor' en esa cláusula order_clause porque no es obligatorio, ya que lo ordenará por el valor más alto a más bajo de 'order_in_archive'.
— Andrew Schultz

10

El WP Codex es realmente confuso al abordar este problema.

En realidad, no necesita el parámetro meta_query para usar orderby, sino que utiliza el parámetro meta_key, que aunque WP Codex está en desuso, se ha establecido aquí: ¿Cómo se usa orderby con meta_query en Wordpress 3.1? ese orden todavía necesita la meta_key.

entonces debería ser

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )

2
Bueno, sí, este es el método antiguo para hacer esta consulta y parece estar funcionando para esta especificada. De todos modos, para consultas más complejas, no funcionará. Encontré que este es un problema conocido que se está solucionando , los detalles se pueden encontrar en los boletos de tránsito # 15031 y # 17065
— Maor Barazany

2

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 ordenó a menos que meta_keyesté incluido, y eso es todo:

Aquí está el código completo de una lista de directorsimágenes 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') ?>">
    </li>
<?php
    endwhile;
    wp_reset_query();
?>

orden_por encargo fiel wordpress


1

No use query_posts.

$meta_query = new WP_Meta_Query( $meta_query_args );

$meta_query_args = array(
   'post_type' => 'services',
    'order'     => 'ASC',
    'meta_key' => 'your_key',
    'orderby'   => 'meta_value', //or 'meta_value_num'
    'meta_query' => array(
                    array('key' => 'order_in_archive',
                        'value' => 'some_value'
)));

Use los parámetros WP_Meta_Query


0

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', //or 'meta_value_num'
      )
);

3
La pregunta es sobre el meta_queryparámetro new-ish y conseguir orderbyque funcione con él, y no sobre los parámetros meta_key/ meta_valueparámetros más antiguos pero funcionales . Además, no fomentemos el uso de query_posts.
— s_ha_dum

Esta respuesta contiene múltiples malas prácticas: usar -1, pasarlo como una cadena, usar query_posts. Debería ser eliminado.
— Ihor Vorotnov

0

Tenía un conjunto de fechas de eventos personalizados que necesitaba ordenar por fecha descendente. Dado que la fecha de mi evento personalizado se almacenó en mi tabla wp_postmeta, y normalmente era diferente a la fecha post_date o modificada, esto funcionó para mí:

  $args = array(
    'post_type' => 'events', // my post type - yours can be 'posts'
    'post_status' => 'publish', // only get posts with this status
    'orderby' => 'meta_value', // orderby the meta_value of the following meta_key
    'meta_key' => 'my_custom_eventdate', // the custom meta_key name
    'order'=> 'DESC' // sort descending
  );

  $posts = new WP_Query($args);

Luego puede recorrer $ posts de esta manera:

foreach($posts->posts as $p){

    $post_id = $p->ID;
    // and so on ...

    // # example of how I retrieve my event date
    $event = get_post_meta($post_id, 'my_custom_eventdate', true);
}

0

Este trabajo para mi

    $args = array(
        'post_type' => 'services',
        'order' => 'ASC',
        'orderby'   => 'order_clause',   
        'meta_query' => array(
        'order_clause' => array(
        'key' => 'order_in_archive'
    )));

Solo se necesita para proporcionar la clave para la orden_clause

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.