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

Maor Barazany
fuente

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'
                                )
                            )
    )
);
Ján Bočínec
fuente
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.

Ryan Taylor
fuente
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'
) )
Evan Yeung
fuente
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

Jesus CMD
fuente
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

Brad Dalton
fuente
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'
      )
);
gegere
fuente
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);
}
recurse
fuente
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

pingle60
fuente