WP_Query orderby post__in rimane inefficace nel Loop

1 ago 2013, 12:23:09
Visualizzazioni: 30.3K
Voti: 11

Sto cercando di eseguire una query per un array personalizzato di post per la homepage, cercando di mantenere l'ordine specificato nell'array. In parte funziona, WordPress trova i post, ma nel Loop l'ordine risulta completamente mescolato.

Innanzitutto, sto usando l'hook pre_get_posts per modificare la query principale nella homepage, che appare così:

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

L'ordine nella homepage è completamente mescolato! Non segue né l'array specificato, né le date di pubblicazione (che è l'ordinamento predefinito). Invece, è 127, 103, 14, 115.

Ho fatto un var_dump del global $wp_query nella homepage, solo per controllare cosa fosse successo, e la query SQL generata era effettivamente

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

Quindi nessun problema lì! È esattamente quello che dovrebbe accadere. L'array di post in $wp_query->posts tuttavia, ha l'ordine sbagliato.

Potreste notare che c'è un custom post type 'product' incluso nella query. È questo il colpevole? Qualche idea su dove cercare?

4
Commenti

Non credo che post__in sia un parametro accettato per orderby.

helgatheviking helgatheviking
1 ago 2013 12:56:07

Sembra proprio di sì, a partire da WP 3.5. Io uso la versione 3.5.2. Controlla http://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters

Max Max
1 ago 2013 13:16:01

Hai ragione. Per me è una novità.

helgatheviking helgatheviking
1 ago 2013 16:14:22

Forse fuori tema, ma Google porta qui, e non ero a conoscenza di 'orderby' => 'post__in' quindi +1.

DomQ DomQ
11 apr 2018 15:40:41
Tutte le risposte alla domanda 2
1
43

Imposta orderby su post__in. Questo mantiene l'ordine degli ID dei post specificato nell'array post__in (disponibile dalla Versione 3.5).

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

Non hai idea di quanto sollievo mi abbia dato questa risposta.

Mark Mark
24 apr 2019 06:33:58
0

Colpa completamente mia, avevo una vecchia funzione collegata a the_posts che eseguiva un suo ordinamento. Vecchio codice che mi ero dimenticato di rimuovere. Ora funziona tutto perfettamente.

2 ago 2013 16:22:20