Interogare personalizată cu orderby meta_value pentru câmp personalizat

24 apr. 2011, 02:33:13
Vizualizări: 165K
Voturi: 47

După cum știți, începând cu WP3.0 există opțiuni pentru interogări personalizate avansate, ceea ce este excelent. Din acest motiv, unii parametri de interogare pentru câmpuri personalizate precum meta_key, meta_value au fost depreciate în favoarea noului parametru meta_query (vezi aici)

Încerc să fac o interogare destul de simplă cu noua sintaxă, să interoghez postări după un anumit post_type (services) care conține un meta_key specificat (order_in_archive) - acest lucru funcționează cum mă așteptam. Dar - vreau să ordonez rezultatele interogării după meta_value, și nu reușesc.

Aceasta este interogarea mea -

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

Am încercat orderby și cu meta_value_numeric și meta_value, dar în orice caz rezultatele sunt ordonate după data publicării (ca la postările obișnuite). Știe cineva cum poate fi realizat acest lucru?

Mulțumesc

0
Toate răspunsurile la întrebare 8
0
40

Poți defini cheia meta pentru parametrul orderby folosind metoda veche (am testat pe WP 3.1.1)...

query_posts(
    array(  'post_type' => 'services',
            'order'     => 'ASC',
            'meta_key' => 'some_key',
            'orderby'   => 'meta_value', //sau 'meta_value_num'
            'meta_query' => array(
                                array('key' => 'order_in_archive',
                                      'value' => 'some_value'
                                )
                            )
    )
);
24 apr. 2011 12:31:24
3
32

Această problemă în general a fost rezolvată începând cu WordPress 4.2 prin utilizarea interogărilor denumite. De exemplu:

$args = array(
  'post_type' => 'services',
  'orderby'   => 'order_clause',
  'meta_query' => array(
       'order_clause' => array(
            'key' => 'order_in_archive',
            'value' => 'some_value',
            'type' => 'NUMERIC' // dacă câmpul nu este un număr
)));

În cazul meu, am dorit să ordonez după un câmp numeric și a trebuit să folosesc 'type' => 'NUMERIC' în interiorul interogării meta.

15 nov. 2016 03:07:52
Comentarii

Descoperire excelentă legată de interogările denumite!

Kaji Kaji
30 iul. 2017 08:15:49

Da, și pentru mine interogările denumite au răspuns la întrebare.

Dalton Rooney Dalton Rooney
1 aug. 2017 02:18:22

Excelent. Nu sunt sigur de semnificația lui 'value' în acea clauză de ordonare deoarece nu este necesar, întrucât va ordona de la cea mai mare la cea mai mică valoare a 'order_in_archive'.

Andrew Schultz Andrew Schultz
7 dec. 2018 05:34:47
2
12

WP Codex este de fapt confuz când abordează această problemă.

Nu ai nevoie de parametrul meta_query pentru a utiliza orderby, în schimb se folosește parametrul meta_key, care deși conform WP Codex este învechit, s-a stabilit aici: Cum folosești orderby cu meta_query în Wordpress 3.1? că orderby are în continuare nevoie de meta_key.

Deci ar trebui să fie

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )
24 apr. 2011 03:07:14
Comentarii

Da, aceasta este metoda veche de a face această interogare și se pare că funcționează pentru cea specificată. Cu toate acestea, pentru interogări mai complexe, nu va funcționa. Am aflat că aceasta este o problemă cunoscută care este rezolvată, detalii pot fi găsite în tichetele trac #15031 și #17065

Maor Barazany Maor Barazany
24 apr. 2011 03:14:09

Foloseam pluginul Toolset pentru a crea atribute personalizate, iar pentru a folosi 'slug'-ul unui atribut personalizat pentru filtru, a trebuit să îi adaug prefixul wpcf-. De exemplu: 'meta_key' => 'wpcf-order_in_archive'

johnsnails johnsnails
19 iul. 2021 05:23:56
0

Este simplu:

Iată codul meu:

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

Detaliul principal este: include meta_key, codul meu nu ordona decât dacă meta_key este inclus, și asta e tot:

Iată codul complet pentru o listă de imagini directors ordonate după 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') ?>" alt="Director" title="Director">
    </li>
<?php
    endwhile;
    wp_reset_query();
?>

Ordonare după câmp personalizat WordPress

7 iul. 2017 00:29:22
0

Nu utilizați 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', //sau 'meta_value_num'
    'meta_query' => array(
                    array('key' => 'order_in_archive',
                        'value' => 'some_value'
)));

Folosiți parametrii WP_Meta_Query

7 aug. 2015 14:32:13
0

Aveam o listă de date personalizate pentru evenimente pe care trebuia să le sortez în ordine descrescătoare după dată. Deoarece data personalizată a evenimentului era stocată în tabelul wp_postmeta și de obicei diferită de post_date sau modified_date, am folosit următoarea soluție:

  $args = array(
    'post_type' => 'events', // tipul meu de postare - poate fi 'posts' pentru tine
    'post_status' => 'publish', // obține doar postări cu acest status
    'orderby' => 'meta_value', // sortează după meta_value din următorul meta_key
    'meta_key' => 'my_custom_eventdate', // numele personalizat al meta_key
    'order'=> 'DESC' // sortează descrescător
  );

  $posts = new WP_Query($args);

Poți apoi să parcurgi $posts astfel:

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

    $post_id = $p->ID;
    // și așa mai departe...

    // # exemplu cum obțin data evenimentului meu
    $event = get_post_meta($post_id, 'my_custom_eventdate', true);
}
19 ian. 2017 22:00:51
0

Următoarea soluție funcționează:

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

Era necesar să specifici cheia sub-array-ului order_clause din meta_query pentru valoarea orderby.

17 mar. 2019 13:55:48
2

Am găsit că această soluție funcționează destul de bine.

<?php 
query_posts(
array(  'posts_per_page' => '-1', // numărul de articole pe pagină (-1 pentru toate)
        'post_type' => 'services', // tipul de postare
        'order'     => 'DESC', // ordonare descrescătoare
        'meta_key' => '_order', // cheia meta pentru sortare
        'orderby'   => 'meta_value_num', //sau 'meta_value_num' pentru valori numerice
      )
);
28 dec. 2012 21:07:37
Comentarii

Întrebarea este despre parametrul relativ nou meta_query și despre cum să funcționeze orderby împreună cu acesta, și nu despre parametrii mai vechi dar încă funcționali meta_key/meta_value. De asemenea, să nu încurajăm utilizarea query_posts.

s_ha_dum s_ha_dum
28 dec. 2012 21:55:19

Acest răspuns conține mai multe practici necorespunzătoare: utilizarea valorii -1, transmiterea acesteia ca șir de caractere, folosirea lui query_posts. Ar trebui eliminat.

Ihor Vorotnov Ihor Vorotnov
1 mar. 2019 11:18:12