サイドバーに表示されるカスタム投稿タイプ(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
答えが見つかりました。下記を確認してください
これに対する答えを見つけました。
どういうわけか、WordPress自身のorderby
は複数の値で並び替えようとすると完全には機能しません。
WP_Query
をSQL 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