Intereting Posts
Проблема с AJAX в плагине wordpress Google (и другие поисковые системы?), Получая мой сайт с неправильной wp-темой Категория липкая последняя Изменение результатов архива на основе запроса GET Многопользовательская установка – это все тот же сайт Как отображать сообщения текущего пользователя / автора в шаблоне пользовательской страницы? проблема безопасности в WordPress? получать данные из wp-запроса, вне цикла & без изменения URL-адреса Как настроить параметры настройки только при загрузке изображения? Потяните последний стабильный релиз через git Отключить новый WP3.5 Media Picker Добавить контент по умолчанию для сообщений в определенной категории? Должны ли пользовательские мета-ящики выводить короткие коды так же, как редактор почтовых сообщений WordPress? Объединить функцию с контентом Штрих-код списка воспроизведения, предотвратить повтор

orderby meta_value нарушает таксономические термины

У меня есть почтовый тип People с таксономией типа Person (например, «Staff»). На страницах архива типа типа лица я хочу сортировать по настраиваемому полю «Сортировка имени». Для этого я использую вызов pre_get_posts :

 <?php function my_query_tweaks( $query ) { // stop immediately if we're in the admin or not working with the main query if( is_admin() || !$query->is_main_query() ) return; // order people by sortname if( is_post_type_archive( 'ciswa_people' ) || is_tax( 'ciswa_person_type' ) ) { $query->set( 'meta_key', 'cis_sort_name' ); $query->set( 'orderby', 'meta_value' ); $query->set( 'order', 'ASC' ); } } add_action( 'pre_get_posts', 'my_query_tweaks' ); 

Однако, когда я это делаю, термин архивные страницы не возвращают результатов! Комментирование строки meta_key вызывает правильные сообщения, но, конечно, неупорядоченные.

Когда я смотрю на запрос, который создает WordPress, я думаю, что проблема в том, что WordPress пытается также запрашивать сообщения на основе meta_key, а не просто заказывать их. Из $wp_query на $wp_query с $wp_query о сохраненной таксономии:

 ["tax_query"]=> object(WP_Tax_Query)#343 (2) { ["queries"]=> array(1) { [0]=> array(5) { ["taxonomy"]=> string(17) "ciswa_person_type" ["terms"]=> array(1) { [0]=> string(5) "staff" } ["include_children"]=> bool(true) ["field"]=> string(4) "slug" ["operator"]=> string(2) "IN" } } ["relation"]=> string(3) "AND" } ["meta_query"]=> object(WP_Meta_Query)#344 (2) { ["queries"]=> array(1) { [0]=> array(1) { ["key"]=> string(13) "cis_sort_name" } } ["relation"]=> string(3) "AND" } 

…а также…

 ["request"]=> string(498) "SELECT SQL_CALC_FOUND_ROWS fi_posts.ID FROM fi_posts INNER JOIN fi_term_relationships ON (fi_posts.ID = fi_term_relationships.object_id) INNER JOIN fi_postmeta ON (fi_posts.ID = fi_postmeta.post_id) WHERE 1=1 AND ( fi_term_relationships.term_taxonomy_id IN (6,10) ) AND fi_posts.post_type = 'ciswa_people' AND (fi_posts.post_status = 'publish' OR fi_posts.post_status = 'private') AND (fi_postmeta.meta_key = 'cis_sort_name' ) GROUP BY fi_posts.ID ORDER BY fi_postmeta.meta_value ASC LIMIT 0, 10" 

Solutions Collecting From Web of "orderby meta_value нарушает таксономические термины"

'meta_key' => 'keyname' должно быть частью запроса, чтобы иметь возможность сортировать по его значению.
К сожалению, это немедленно приведет к тому, что запрос будет ограничен сообщениями, где установлен ключ (его значение может быть пустым, но оно должно существовать).

Следовательно, либо рассмотрите метод s_ha_dum, связанный с комментарием вопроса , либо выберите сортировку после запроса.

Позвольте мне предложить подход к этой (непроверенной, просто концепции):

 function wpse105899_sort_posts_by_cis_sort_name( $a, $b ) { $a_cis_sort_name = get_post_meta( $a->ID, 'cis_sort_name', true ); $b_cis_sort_name = get_post_meta( $b->ID, 'cis_sort_name', true ); if ( $a_cis_sort_name === $b_cis_sort_name ) { return 0; } else if ( $a_cis_sort_name > $b_cis_sort_name ) { return 1; } else { return -1; } } usort( $query->posts, 'wpse105899_sort_posts_by_cis_sort_name' ); 

Примечание. Вышеуказанный формат условного usort в usort служит для удобства чтения. В производстве это может быть однострочный:

 function wpse105899_sort_posts_by_cis_sort_name( $a, $b ) { $a_cis_sort_name = get_post_meta( $a->ID, 'cis_sort_name', true ); $b_cis_sort_name = get_post_meta( $b->ID, 'cis_sort_name', true ); return $a_cis_sort_name === $b_cis_sort_name ? 0 : ( $a_cis_sort_name > $b_cis_sort_name ) ? 1 : -1; } 

Головной стол

У меня была meta_key . Ответ @Johannes Pille был ключевым в том, что он указал мне на то, что если бы ключ был там, это не должно было быть проблемой. Он был там, но я не использовал его.