Zapytanie niestandardowe z kolejnością według wartości_meta niestandardowego pola

37

Wiesz, od wersji WP3.0 dostępne są opcje niestandardowych zaawansowanych zapytań, co jest świetne. W związku z tym niektóre parametry zapytań pól niestandardowych, takie jak meta_key, meta_value, były przestarzałe dla nowego parametru meta_query ( patrz tutaj )

Staram się mieć dość proste zapytanie z nową składnią, zapytania do postów określonego typu post_type (usługi), które zawierają określony klucz meta (order_in_archive) - wszystko idzie zgodnie z oczekiwaniami. Ale - chcę zamówić według zapytania według meta_value i bez powodzenia.

To jest moje zapytanie -

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

Próbowałem uporządkować także według meta_value_numeric i meta_value, ale w każdym razie wyniki są sortowane według daty publikacji (jak robią to zwykłe posty). Czy ktoś wie, jak to zrobić?

Dzięki

Maor Barazany
źródło

Odpowiedzi:

35

Możesz zdefiniować klucz meta dla parametru sortuj według starej metody (testowałem na 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
źródło
15

Ten problem został ogólnie rozwiązany w WordPress 4.2 za pomocą nazwanych zapytań. na przykład

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

Dla mnie chciałem zamówić według pola numerycznego i musiałem użyć 'type' => 'NUMERIC'wewnątrz kwerendy meta.

Ryan Taylor
źródło
1
Niesamowite znalezisko w nazwanych zapytaniach!
Kaji
Tak, nazwane zapytania również odpowiedziały na pytanie.
Dalton,
Doskonały. Nie jestem pewien znaczenia „wartości” w tej klauzuli order_clause, ponieważ nie jest ona wymagana, ponieważ uporządkuje ją według najwyższej do najniższej wartości „order_in_archive”.
Andrew Schultz,
10

Kodeks WP jest dezorientujący, gdy rozwiązuje ten problem.

W rzeczywistości nie potrzebujesz parametru meta_query, aby korzystać z orderby, zamiast tego używa parametru meta_key, który wprawdzie w WP Codex jest przestarzały, ale ustalono tutaj: Jak korzystać z orderby z meta_query w Wordpress 3.1? ta orderyby nadal potrzebuje meta_key.

tak powinno być

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )
Evan Yeung
źródło
2
Cóż, tak, jest to stara metoda wykonywania tego zapytania i wydaje się, że działa dla tego określonego. W każdym razie, w przypadku bardziej złożonych zapytań, to nie zadziała. Znalazłem, że jest to znany problem, który jest rozwiązywany , szczegóły można znaleźć w biletach trac # 15031 i # 17065
Maor Barazany
2

To łatwe:

Oto mój kod:

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

Główny szczegół to: uwzględnij meta_key, mój kod nie zamówił, chyba żemeta_key jest dołączony, i to wszystko:

Oto pełny kod listy directorszdjęć uporządkowanych według 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 custom fiel wordpress

Jesus CMD
źródło
1

Nie używaj postów 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'
)));

Użyj parametrów WP_Meta_Query

Brad Dalton
źródło
0

Uważam, że działa całkiem dobrze.

<?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
źródło
3
Pytanie dotyczy nowego meta_queryparametru i rozpoczęcia orderbypracy z nim, a nie starszych, ale wciąż funkcjonalnych meta_key/ meta_valueparametrów. Nie zachęcajmy też do używania query_posts.
s_ha_dum
Ta odpowiedź zawiera wiele złych praktyk: użycie -1, przekazanie jej jako ciągu, użycie zapytania_posts. Powinien zostać usunięty.
Ihor Worotnov
0

Miałem zestaw niestandardowych dat wydarzeń, które musiałem sortować według daty malejącej. Ponieważ moja niestandardowa data zdarzenia była zapisana w mojej tabeli wp_postmeta i zazwyczaj różniła się od daty post_date lub daty modyfikacji, działało to dla mnie:

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

Następnie możesz przechodzić między $ postami w taki sposób:

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);
}
powrócić
źródło
0

Ta praca dla mnie

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

Potrzebne tylko do podania klucza dla klauzuli order_clause

pingle60
źródło