WP_Query orderby post__in rămâne ineficient în Loop

1 aug. 2013, 12:23:09
Vizualizări: 30.3K
Voturi: 11

Încerc să interoghez un array personalizat de postări pentru pagina principală, încercând să mențin ordinea dată în array. Într-o anumită măsură funcționează bine, WordPress găsește postările, dar în Loop ordinea este amestecată din nou.

În primul rând, folosesc hook-ul pre_get_posts pentru a modifica interogarea principală pe pagina de start, care arată cam așa:

if ( is_home() && $query->is_main_query() ) {
    $query->set( 'post_type', array( 'post', 'page', 'product' ) );
    $query->set( 'post__in', array( 103, 14, 127, 115 ) );
    $query->set( 'orderby', 'post__in' );
}

Ordinea pe pagina principală este complet amestecată! Nu urmează nici array-ul specificat, nici datele de publicare (care este implicit). În schimb, este 127, 103, 14, 115.

Am făcut var_dump la global $wp_query pe pagina principală, doar pentru a verifica ce s-a întâmplat, și SQL-ul interogat era într-adevăr

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID
FROM wp_posts
WHERE
    1=1 AND wp_posts.ID IN (103,14,127,115)
    AND wp_posts.post_type IN ('post', 'page', 'product')
    AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private')
ORDER BY FIELD( wp_posts.ID, 103,14,127,115 )
LIMIT 0, 10

Deci nicio problemă acolo! Exact asta ar trebui să se întâmple. Array-ul de postări din $wp_query->posts are totuși ordinea greșită.

Poate ați observat că există un tip de postare personalizat 'product' inclus în interogare. Acesta să fie problema? Aveți vreo idee unde să caut?

4
Comentarii

Nu cred că post__in este un parametru acceptat pentru orderby.

helgatheviking helgatheviking
1 aug. 2013 12:56:07

Da, se pare că este acceptat începând cu WP 3.5. Eu folosesc versiunea 3.5.2. Verifică http://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters

Max Max
1 aug. 2013 13:16:01

Ai dreptate. Asta e o noutate pentru mine.

helgatheviking helgatheviking
1 aug. 2013 16:14:22

Off-topic poate, dar Google mă aduce aici și nu știam anterior de 'orderby' => 'post__in', deci +1.

DomQ DomQ
11 apr. 2018 15:40:41
Toate răspunsurile la întrebare 2
1
43

Setează orderby la post__in. Acest lucru păstrează ordinea ID-urilor postărilor specificată în array-ul post__in (disponibil începând cu Versiunea 3.5).

$args = array (
    'posts_per_page' => -1,
    'post__in' => $ids,
    'orderby' => 'post__in' 
);
28 dec. 2013 18:52:20
Comentarii

Nu aveți idee câtă ușurare mi-a adus acest răspuns.

Mark Mark
24 apr. 2019 06:33:58
0

Este vina mea în întregime, aveam o funcție veche conectată la the_posts care făcea o sortare proprie. Cod vechi pe care am uitat să-l elimin. Acum funcționează perfect.

2 aug. 2013 16:22:20