WP_Query - Ordonarea rezultatelor după valoarea meta

4 oct. 2011, 18:10:50
Vizualizări: 202K
Voturi: 79

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'
);
0
Toate răspunsurile la întrebare 3
12
100

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

4 oct. 2011 18:25:38
Comentarii

A funcționat perfect, mulțumesc frate.

Adam Moss Adam Moss
4 oct. 2011 18:41:05

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

BasTaller BasTaller
21 iun. 2012 17:04:10

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

adamj adamj
2 dec. 2015 04:46:50

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 RobBenz
25 apr. 2017 19:50:22

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

Milo Milo
25 apr. 2017 19:52:22

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

RobBenz RobBenz
25 apr. 2017 19:58:42

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

RobBenz RobBenz
25 apr. 2017 20:02:38

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

Milo Milo
25 apr. 2017 20:09:38

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

RobBenz RobBenz
25 apr. 2017 21:07:50

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

Milo Milo
25 apr. 2017 21:21:47

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

unbreak unbreak
22 feb. 2018 09:46:45

@unbreak soluția simplă este să parcurgi toate postările și să adaugi meta_key lor înainte de a rula interogarea de ordonare

adamj adamj
23 feb. 2018 11:21:18
Arată celelalte 7 comentarii
0
11

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'
);
13 nov. 2020 00:09:13
0

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);
24 mai 2024 19:00:49