web-dev-qa-db-ja.com

WP_Queryの順序がmeta_value_numおよびmenu_orderで機能しない

サイドバーに表示されるカスタム投稿タイプ(sidebar_element)を作成しました。各サイドバー要素で、管理者はサイドバーのどこにその要素を表示するかを選択できます。 'top'、 'middle'、または 'bottom'、および値がメタフィールドに保存されていること。これらのアライメントのメタ値は30、20、10です。

これで、同じ配置のサイドバー要素が複数ある場合、それらは与えられたmenu_order値によって配置されるはずです。

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

しかしこれはうまくいきません。要素は最初にmeta_value_numで昇順、次に正しくmenu_orderでソートされます。 orderbyからmenu_orderを削除すると、meta_valuesは正しい順番に並べられます。

このことは私を夢中にさせています!

助けてください。ありがとう。

EDIT
これは、var_dump($sidebarElems)の場合に生成されるSQLクエリです。

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

ANSWER
答えが見つかりました。下記を確認してください

1
micadelli

これに対する答えを見つけました。

どういうわけか、WordPress自身のorderbyは複数の値で並び替えようとすると完全には機能しません。

WP_QuerySQL Queryに変更し、_postmeta.meta_value+0の後に2番目のDESCを含めることでこれを解決しました。

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