Intereting Posts
Как я могу интегрировать страницы, написанные в чем-то, кроме PHP? Исключить сообщения по почтовому метазначению Как сделать кнопку / меню администратора WP похожей на уведомления Jetpack? Как уменьшить размер изображений, которые присутствуют в папке uploads? Поиск пользователя WP admin не возвращает всех пользователей Как вставить уже загруженный видеофайл в свою медиа-библиотеку? Массовая проверка определенного окна в панели параметров для более 3000 продуктов WooCommerce? Пользовательский способ доставки: нужны параметры без экземпляра и неглобальные настройки Как отобразить метаописание Yoast SEO в шаблоне архива для каждого сообщения вместо the_excerpt ()? Рабочий процесс для нескольких разработчиков Как скрыть «Комментарии отключены» если условно в плагине боковой панели как обновить или обновить объект пользователя wp? Избранные сообщения / Избранные сообщения со случайным порядком Как я могу переместить данные из формы 1 в форму 2

Лучшая практика – 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!

Благодарю.

Вы можете использовать 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' ); } }