Consulta personalizada con orderby meta_value of custom field

33

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 fueron desaprobados para el nuevo parámetro meta_query ( vea aquí )

Intento tener una consulta bastante simple con la nueva sintaxis, consultar publicaciones de un determinado tipo de publicación (servicios) que contiene una meta_key específica (order_in_archive) - esto va 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'))
    )
);

También intenté orderby 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

    
pregunta Maor Barazany 24.04.2011 - 01:33

7 respuestas

34

Puede 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', //or 'meta_value_num'
            'meta_query' => array(
                                array('key' => 'order_in_archive',
                                      'value' => 'some_value'
                                )
                            )
    )
);
    
respondido por el Ján Bočínec 24.04.2011 - 11:31
9

El Códice WP 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 estableció aquí: ¿Cómo usa orderby con meta_query en Wordpress 3.1? que orderyby todavía necesita la meta_key.

por lo que debería ser

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )
    
respondido por el Evan Yeung 24.04.2011 - 02:07
9

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

Este problema en general se resuelve en WordPress 4.2 mediante consultas con nombre. 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' // unless the field is not a number
)));
    
respondido por el Ryan Taylor 15.11.2016 - 02:07
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 se incluyó meta_key , y eso es todo:

Aquí está el código completo de una lista de directors fotos 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();
?>

    
respondido por el Jesus CMD 06.07.2017 - 23:29
1

No utilice 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'
)));

Utilice los parámetros WP_Meta_Query

    
respondido por el Brad Dalton 07.08.2015 - 13:32
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'
      )
);
    
respondido por el gegere 28.12.2012 - 20:07
0

Tenía un conjunto de fechas de eventos personalizadas que necesitaba ordenar por fecha descendente. Como la fecha de mi evento personalizado se almacenó en mi tabla wp_postmeta, y fue típicamente 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);

A continuación, puede recorrer $ publicaciones como:

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);
}
    
respondido por el recurse 19.01.2017 - 21:00

Lea otras preguntas en las etiquetas