WP_Query - Ordonarea rezultatelor după valoarea meta
Am verificat în jur și nu am văzut încă un răspuns care să funcționeze. Am o interogare WP_Query cu următoarele argumente:
$args = array(
'post_status' => 'publish',
'post_type' => 'listing',
'meta_key' => 'client_feedback_score',
'orderby' => 'client_feedback_score',
'order' => 'DESC'
);
$query = new WP_Query($args);
Vreau să ordonez rezultatele după câmpul personalizat client_feedback_score
, de la cel mai mic la cel mai mare. Dar acest lucru nu pare să funcționeze... poate cineva să mă îndrume în direcția corectă?
EDIT (REZOLVAT):
Mulțumită răspunsului lui Milo, iată codul funcțional pentru ordonarea după o valoare meta numerică:
$args = array(
'post_status' => 'publish',
'post_type' => 'listing',
'meta_key' => 'client_feedback_score',
'orderby' => 'meta_value_num',
'order' => 'DESC'
);

orderby
trebuie să fie meta_value_num
, sau meta_value
, nu numele cheii. Vezi Parametrii WP_Query orderby.

Mulțumesc! Mi-ai economisit timpul! Nicăieri în WPCodex nu este menționat despre 'meta_value_num'.

O mică observație, dacă meta_key
nu există încă pentru articol, articolul va fi ignorat.

este meta_value_num
un meta personalizat pentru postări pe care îl poți atribui tipurilor de postări? Am nevoie să pot edita această valoare pentru fiecare postare.

@RobBenz Vezi Câmpuri Personalizate pentru a afla mai multe despre meta pentru postări.

mulțumesc, sunt familiarizat cu meta personalizat pentru postări. Vreau să adaug o casetă meta la produsele WC, numită search_order
sau ceva similar. astfel încât atunci când sunt afișate rezultatele căutării: să am posibilitatea de a controla ordinea afișării lor. ar trebui să numesc meta personalizat pe care îl adaug meta_value_num

sau meta_value_num
doar ia valoarea oricărui 'meta_key' => 'search_order' bazat pe postare

@RobBenz meta_value_num
îi spune WP să ordoneze rezultatele după o valoare meta numerică. Nu este numele cheii.

cum pot schimba meta_value_num
astfel încât o anumită postare să fie "clasată" mai sus în rezultatele de căutare

@RobBenz Ar trebui să începi o nouă întrebare pe acest subiect. Pasul 1: Atribuie orice valoare dorești cheii tale meta, să o numim my_meta_key
, pentru fiecare postare pentru a genera ordinea dorită. Pasul 2: Setezi meta_key
în interogarea ta la my_meta_key
. Acest lucru îi spune WordPress să caute postările care au acea cheie. Pasul 3: Setează orderby
în interogarea ta la meta_value_num
. Acest lucru îi spune WordPress nu doar să interogheze postările cu my_meta_key
, ci și să le ordoneze numeric după acea cheie. Acest argument de interogare este singurul loc unde vei vedea sau folosi meta_value_num
.

@adamj există vreo soluție pentru asta? Am nevoie să sortez toate postările, indiferent dacă meta_key există pentru postare sau nu.

Dacă valoarea meta nu este numerică, de exemplu dacă este o valoare de tip dată, atunci poți adăuga parametrul meta_type => DATE
.
Valorile posibile sunt: 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'
.
Interogarea cu tip meta va arăta astfel:
$args = array(
'post_status' => 'publish',
'post_type' => 'listing',
'meta_key' => 'client_feedback_score',
'orderby' => 'meta_value_num',
'meta_type' => 'DATE',
'order' => 'DESC'
);

Pentru a răspunde punctului ridicat de @adamj în răspunsul acceptat
dacă meta_key nu există încă pentru postare, postarea va fi ignorată.
Iată o soluție care va include și postările care nu au o valoare pentru client_feedback_score
. Puteți configura o interogare simplă pentru a lista toate postările. Apoi, puteți face manual un left join cu tabelul postmeta
unde meta_value
este client_feedback_score
. Apoi, sortați rezultatele cu o clauză orderby
.
$args = array(
'post_status' => 'publish',
'post_type' => 'listing',
);
add_filter('post_clauses','post_meta_sort',10,1);
function post_meta_sort( $sql_clauses ) {
global $wpdb;
remove_filter( 'posts_clauses', 'post_meta_sort' ); // Opriți această funcție să ruleze pe alte interogări.
$sql_clauses['join'] .= "LEFT JOIN $wpdb->postmeta AS sort_score_postmeta ON $wpdb->posts.ID = sort_score_postmeta.post_id
AND sort_score_postmeta.meta_key = 'client_feedback_score'";
$sql_clauses['orderby'] = 'sort_score_postmeta.meta_value+0 DESC';
return $sql_clauses;
}
$query = new WP_Query($args);
