Interogare personalizată cu orderby meta_value pentru câmp personalizat
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

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

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.

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

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'
) )

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

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();
?>

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

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

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
.

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

Î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
.
