web-dev-qa-db-fra.com

WP_Query orderby ne fonctionne pas avec meta_value_num et menu_order

J'ai créé un type de message personnalisé (sidebar_element) qui apparaît dans l'encadré. Sur chaque élément de la barre latérale, l’administrateur peut choisir où il doit être affiché, c’est-à-dire. 'top', 'middle' ou 'bottom', et que la valeur est enregistrée dans le champ méta. Les méta-valeurs pour ces alignements sont 30, 20 et 10.

Maintenant, s'il y a plusieurs éléments de la barre latérale avec le même alignement, ils doivent être alignés avec la valeur donnée par menu_order.

C'est comme ça que j'essaye de réaliser tout ça, dans mon sidebar.php

$sidebarElems   = new WP_Query( array (
                        'post_type'         => 'sidebar_element',
                        'posts_per_page'    => -1,
                        'meta_key'          => 'sidebar_element_meta_alignment',
                        'orderby'           => 'meta_value_num menu_order',
                        'order'             => 'DESC' ) );

Cela ne fonctionne cependant pas. Les éléments sont d'abord triés par meta_value_num croissant , puis correctement par menu_order. Si je supprime le menu_order de orderby, meta_values est correctement commandé.

Cette chose me rend fou!

S'il vous plaît aider. Merci.

EDIT
Voici la requête SQL générée, lorsque var_dump($sidebarElems)

SELECT XXX_posts.* FROM XXX_posts
INNER JOIN XXX_postmeta ON (XXX_posts.ID = XXX_postmeta.post_id)
WHERE 1=1 AND XXX_posts.post_type = 'sidebar_element' AND (XXX_posts.post_status = 'publish') AND (XXX_postmeta.meta_key = 'sidebar_element_meta_alignment' )
GROUP BY XXX_posts.ID
ORDER BY XXX_postmeta.meta_value+0,XXX_posts.menu_order DESC

RÉPONSE
Vous avez trouvé une réponse, vérifiez ci-dessous

1
micadelli

Trouvé une réponse à cela.

D'une manière ou d'une autre, la propre variable orderby de WordPress n'est pas totalement fonctionnelle lorsque vous essayez de classer par plusieurs valeurs.

J'ai résolu ce problème en remplaçant WP_Query par SQL Query et en incluant la seconde DESC après _postmeta.meta_value+0

SELECT XXX_posts.* FROM XXX_posts
INNER JOIN XXX_postmeta ON (XXX_posts.ID = XXX_postmeta.post_id)
WHERE 1=1 AND XXX_posts.post_type = 'sidebar_element' AND (XXX_posts.post_status = 'publish') AND (XXX_postmeta.meta_key = 'sidebar_element_meta_alignment' )
GROUP BY XXX_posts.ID
ORDER BY XXX_postmeta.meta_value+0 DESC,XXX_posts.menu_order DESC
1
micadelli