WP_Query avansat cu meta_query și orderby

4 feb. 2016, 23:03:25
Vizualizări: 30.9K
Voturi: 2

Mă întreb dacă mă poate ajuta cineva cu acest query complex pentru ACF.

Până acum am următoarea structură care ar trebui să afișeze:

  • Pagini,

  • Articole de Știri,

  • Articole Despre și

  • Articole Implicate.

  • Afișează: doar 4.

Afișează doar dacă: câmpul ACF/Meta Key 'home_page' este setat pe 'yes'

ȘI

Ordonează după valoarea numerică a câmpului ACF/Meta Key 'home_order' adică 1,2,3 primul, al doilea, al treilea etc

      $args = array(
                // Tipurile de postări
                'post_type' => array( 'page', 'news-articles', 'about-articles','involved-articles' ),
                'showposts' => 4,
                'meta_query' => array(
                         'relation' => 'AND',
                             array(
                                                 'key' => 'home_page',
                                                 'value' => 'yes',
                                                 'compare' => 'IN',
                             ),
                                         array(
                                                 'orderby'   => 'meta_value_num',
                                                 'meta_key'  => 'home_order',
                            ),
                 ),
            );

Cred că ceva nu este în regulă cu 'compare' și 'relation'

0
Toate răspunsurile la întrebare 2
2

Ar trebui să citești cu adevărat documentația despre meta_query

Iată ce este permis într-un meta_query

  • key (string) - Cheia câmpului personalizat.

  • value (string|array) - Valoarea câmpului personalizat. Poate fi un array doar când compare este 'IN', 'NOT IN', 'BETWEEN' sau 'NOT BETWEEN'. Nu este necesar să specificați o valoare când utilizați comparațiile 'EXISTS' sau 'NOT EXISTS' în WordPress 3.9 și versiuni ulterioare.

    (Notă: Din cauza bug-ului #23268, valoarea este necesară pentru ca comparațiile NOT EXISTS să funcționeze corect înainte de versiunea 3.9. Trebuie să furnizați un șir de caractere pentru parametrul value. Un șir gol sau NULL NU va funcționa. Cu toate acestea, orice alt șir de caractere va funcționa și NU va apărea în interogarea SQL atunci când utilizați NOT EXISTS. Ai nevoie de inspirație? Ce zici de 'bug #23268'.)

  • compare (string) - Operatorul de testat. Valorile posibile sunt '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' și 'NOT EXISTS'. Valoarea implicită este '='.

  • type (string) - Tipul câmpului personalizat. Valorile posibile sunt 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'. Valoarea implicită este 'CHAR'.

Ordonarea trebuie să aibă loc în afara meta_query-ului tău. Poți încerca următoarele

$args = [
    'post_type'      => ['page', 'news-articles', 'about-articles', 'involved-articles'],
    'posts_per_page' => 4,
    'meta_key'       => 'home_order',
    'orderby'        => 'meta_value_num',
    'meta_query'     => [
        [
            'key'      => 'home_page',
            'value'    => 'yes',
        ]
    ],
];

Note adiționale:

  • Începând cu PHP 5.4 poți folosi sintaxa scurtă pentru array, adică poți folosi [] în loc de array(). Dacă încă rulezi orice versiune anterioară PHP 5.6, ar trebui să iei în serios în considerare actualizarea.

  • showposts a fost înlocuit cu posts_per_page, așa că este mai bine să folosești posts_per_page

5 feb. 2016 06:36:14
Comentarii

@birgire mulțumesc, da, a fost o greșeală rapidă de copy-paste ;-)

Pieter Goosen Pieter Goosen
5 feb. 2016 08:46:44

Da, am citit toate acele lucruri, dar nu le-am înțeles pe deplin pentru a le pune în ordinea corectă. Am reușit să înțeleg cu ajutorul altcuiva, folosind următoarele...

user4630 user4630
5 feb. 2016 11:52:48
1
$args = array(
                'posts_per_page'    => 4,
                'post_type'         => array( 'page', 'news-articles', 'about-gorilla','involved' ),
                'orderby'           => 'meta_value_num',
                'meta_key'          => 'home_order',
                'order'             => 'ASC',
                'meta_query'        => array(
                    array(
                        'key'       => 'home_page',
                        'value'     => 'yes',
                        'compare'   => '=',
                    ),
                ),
            );
5 feb. 2016 11:53:32
Comentarii

Vă rugăm să nu postați cod fără explicații ca răspuns, adăugați și câteva clarificări, mulțumesc. Totuși, acesta arată aproape la fel ca răspunsul lui @PieterGoosen, cu excepția ordonării. Rețineți că compare este implicit =

birgire birgire
5 feb. 2016 11:59:02