Intereting Posts

Лучшая практика – Meta Query и post_clauses для упорядочения «левого соединения»

Moreso – вопрос с псевдонимом, чем действительный код. У меня есть специальная мета-запись, прикрепленная к вложениям, и созданная столбец таблицы списков для этой мета. Мета – либо 1, либо null (не задано), но я пытаюсь включить сортировку для указанного столбца.

Есть ли способ использовать meta_query для WP_Query по существу LEFT JOIN, где я получаю все значения (1 или null), а затем я могу использовать orderby=meta_value_num для заказа?

Очевидным способом работы будет подключение к posts_clauses, добавление JOIN и выполнение orderby – просто любопытно, возможно ли это при использовании прямых функций WP_Query!

Благодарю.

Solutions Collecting From Web of "Лучшая практика – Meta Query и post_clauses для упорядочения «левого соединения»"

Вы можете использовать pre_get_posts с обратным вызовом:

 <?php defined( 'ABSPATH' ) OR exit; /** Plugin Name: (#102854) Order Posts by Foo */ add_filter( 'pre_get_posts', 'wpse_102854_orderby_foo' ); function wpse_102854_orderby_foo( $query ) { if ( ! $query->is_main_query() OR ! is_admin() OR 'edit.php?post_type=YOUR_POST_TYPE' !== $GLOBALS['parent_file'] // Other conditions that force an abort, Example: // OR 'foo' !== $query->get( 'some_query_var' ) ) return $query; $query->set( 'orderby', 'meta_value_num' ); // etc. return $query; } 

Вы можете сделать это в любом случае!

Используя posts_clauses , вручную напишите инструкцию JOIN (используя $ wpdb-> prepare () – будьте в безопасности!) И добавьте / настройте предложение orderby .

Используя meta_query , необходимо несколько вещей. Во-первых, как упоминает кайзер, вы должны использовать relation внутри meta_query чтобы оно работало. Во-вторых, хотя meta_query определен, вам все равно нужно указать аргумент meta_key , иначе orderby = meta_value не будет работать. Я предполагаю, что это связано с тем, что вы можете одновременно использовать несколько объединений, которые могут использовать разные мета-ключи.

Вот как я это сделал:

 function handle_my_sortable_column( $query ) { global $pagenow; if( is_admin() && 'upload.php' == $pagenow && 'my_meta_key' == get_query_var( 'orderby' ) ) { $query->set( 'meta_query', array( 'relation' => 'OR', array( 'key' => my_meta_key', 'value' => null, 'compare' => 'EXISTS' ), array( 'key' => 'my_meta_key', 'value' => '', // must be '' value, null does not work 'compare' => 'NOT EXISTS' ) ) ); $query->set( 'meta_key', 'my_meta_key' ); // required for orderby $query->set( 'orderby', 'meta_value_num' ); } }