it-swarm.com.de

WP_Query orderby funktioniert nicht mit meta_value_num und menu_order

Ich habe einen benutzerdefinierten Beitragstyp (sidebar_element) erstellt, der in der Seitenleiste angezeigt wird. In jedem Seitenleistenelement kann der Administrator auswählen, wo in der Seitenleiste dieses Element angezeigt werden soll, d. H. 'top', 'middle' oder 'bottom' und dass der Wert im Metafeld gespeichert ist. Metawerte für diese Alignments sind 30, 20 und 10.

Wenn nun mehrere Sidebar-Elemente mit derselben Ausrichtung vorhanden sind, sollten sie nach dem angegebenen Wert für menu_order ausgerichtet werden.

So versuche ich das alles in meiner sidebar.php zu erreichen

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

Dies funktioniert jedoch nicht. Elemente werden zuerst nach meta_value_num aufsteigend und dann korrekt nach menu_order sortiert. Wenn ich den menu_order aus der orderby lösche, wird der meta_values richtig bestellt.

Dieses Ding macht mich verrückt!

Bitte helfen Sie. Vielen Dank.

EDIT
Hier ist die SQL-Abfrage, die generiert wird, wenn 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

ANTWORT
Antwort gefunden, siehe unten

1
micadelli

Habe eine Antwort darauf gefunden.

Irgendwie ist die eigene orderby von WordPress nicht voll funktionsfähig, wenn versucht wird, nach mehreren Werten zu sortieren.

Ich habe dieses Problem gelöst, indem ich WP_Query in SQL Query geändert und die zweite DESC nach _postmeta.meta_value+0 eingefügt habe.

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