Consulta personalizada com orderby meta_value do campo personalizado

37

Você sabe, a partir do WP3.0, existem opções para consultas avançadas personalizadas, o que é ótimo. Assim, alguns parâmetros de consulta de campos personalizados como meta_key, meta_value foram descontinuados para o novo parâmetro meta_query ( veja aqui )

Eu tento ter uma consulta bastante simples com a nova sintaxe, postagens de consulta de um determinado post_type (services) que contém uma meta_key especificada (order_in_archive) - isso está indo bem como esperado. Mas - quero ordenar pela consulta pelo meta_value, e sem sucesso.

Esta é a minha consulta -

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

Tentei fazer o pedido também por meta_value_numeric e meta_value, mas, em qualquer caso, os resultados estão sendo ordenados pela data de publicação (como fazem as postagens regulares). Alguém sabe como isso pode ser feito?

obrigado

Maor Barazany
fonte

Respostas:

35

Você pode definir a meta-chave para o parâmetro orderby usando o método antigo (testei no 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
fonte
15

Esse problema em geral é resolvido no WordPress 4.2 usando consultas nomeadas. por exemplo

$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 mim, eu queria ordenar por um campo numérico e tive que usar 'type' => 'NUMERIC'dentro da meta consulta.

Ryan Taylor
fonte
11
Achado impressionante nas perguntas nomeadas!
Kaji
Sim, as consultas nomeadas também responderam à minha pergunta.
Dalton
Excelente. Não tenho certeza do significado de 'value' nessa cláusula order_ porque não é necessário, pois o ordenará pelo valor mais alto para o mais baixo de 'order_in_archive'.
Andrew Schultz
10

O WP Codex é realmente confuso ao solucionar esse problema.

Na verdade, você não precisa do parâmetro meta_query para usar o orderby, em vez disso, usa o parâmetro meta_key, que embora tenha sido preterido pelo WP Codex, foi estabelecido aqui: Como você usa o orderby com meta_query no Wordpress 3.1? esse ordenado ainda precisa da meta_key.

então deveria ser

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )
Evan Yeung
fonte
2
Bem, sim, esse é o método antigo para fazer essa consulta e parece estar funcionando para esse especificado. De qualquer forma, para consultas mais complexas, não funcionará. Eu encontrei este é um problema conhecido que está sendo cuidado, os detalhes podem ser encontrados em bilhetes trac # 15031 e # 17065
Maor Barazany
2

É fácil:

Aqui está o meu código:

query_posts(array( 
        'post_type' => 'directors',
        'posts_per_page' => -1,
        'order'    => 'ASC',
        'orderby'  => 'director_weight',
        'meta_key' => 'director_weight'
) );

O detalhe principal é: include meta_key, meu código não solicitou, a menos que meta_keyesteja incluído, e isso é tudo:

Aqui está o código completo de uma lista de directorsimagens, 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();
?>

order_by personalizado fiel wordpress

Jesus CMD
fonte
1

Não 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 os parâmetros WP_Meta_Query

Brad Dalton
fonte
0

Eu achei que isso funcionava muito bem.

<?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
fonte
3
A pergunta é sobre o novo-ish meta_queryparâmetro e obter uma orderbypara trabalhar com ele, e não sobre os mais velhos, mas ainda funcionais meta_key/ meta_valueparâmetros. Além disso, não vamos incentivar o uso de query_posts.
s_ha_dum
Esta resposta contém várias práticas ruins: usando -1, passando como uma string, usando query_posts. Deve ser removido.
Ihor Vorotnov 01 de
0

Eu tinha um conjunto de datas de eventos personalizados que precisava ordenar por data decrescente. Como a data do meu evento personalizado foi armazenada na minha tabela wp_postmeta e era tipicamente diferente das datas post_date ou modificadas, isso funcionou para mim:

  $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);

Você pode percorrer $ posts da seguinte maneira:

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);
}
recurso
fonte
0

Este trabalho para mim,

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

Necessário apenas para fornecer a chave para a order_clause

pingle60
fonte