Intereting Posts
Таксономическая структура спортивного сайта get_attachment_id () получает только идентификатор первого прикрепленного изображения после сообщения обновления Разрешить посетителям загружать изображение и выбирать изображение водяного знака Не выполнять функцию на определенных сообщениях get_post_meta всегда пуст, когда я использую wp_mail Могу ли я динамически создать ссылку на мою страницу настроек / параметров плагина из моего описания плагина? Показывать все сообщения на одной странице? плагины ломаются после перемещения папки wp-content рейтинг статей для внутренних целей Почему некоторые основные функции получают wp_, а другие – нет? Каково правило? Изменение CPT slug и таксономии, уже зарегистрированной в родительской теме Область переменной в WordPress functions.php Проблема Get_template_part () с the_content () the_excerpt () в content.php и get_template_part () в single.php Запросить список всех галерей под родительским сообщением?

meta_query сортировка по 2 клавишам

Мне нужно сортировать (настраиваемые) сообщения по 2 настраиваемым значениям поля …

имя настраиваемого поля 1: is_sponsored [значение может быть 1 или 0 ]

имя настраиваемого поля 2: sfp_date [ timestamp aka текущая дата публикации в секундах]

Сообщения, чье « is_sponsored » значение равно 1, должны быть сверху, отсортированы по « sfp_date » в DESC заканчивающемся порядком. Все остальные записи, значение « is_sponsored » равно 0, должны быть перечислены ниже – в порядке убывания (по « sfp_date »).

У меня есть что-то вроде:

 $sfp_query_args = array( 'tax_query' => array( array( 'taxonomy' => 'sfp_posts', 'terms' => array( 1, 5, 8 ) ) ), 'post_type' => 'sfpposts', 'post_status' => 'publish', 'showposts' => 15, 'paged' => $paged, 'meta_key' => 'sfp_date', 'orderby' => 'meta_value_num', 'order' => 'DESC', 'meta_query' => array( 'key' => 'is_sponsored', 'value' => 2, 'type' => 'NUMERIC', 'compare' => '<=' ) ); $wp_q = new WP_Query( $sfp_query_args ); 

… но не работает. Есть идеи?


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

 <?php /** Plugin Name: (#67600) Dump Query parts */ function wpse67600_dump_query_parts( $pieces ) { echo '<pre>'.var_export( $pieces, true ).'</pre>'; return $pieces; } add_filter( 'posts_clauses', 'wpse67600_dump_query_parts' ); 

OP ПОЖАЛУЙСТА, ДОБАВЛЯЙТЕ ВЫХОД ИЗ ПЛАСТИНЫ ЗДЕСЬ – используйте ссылку «Изменить» .

РЕДАКТИРОВАТЬ Dameer

Хорошо, после запроса трассировки и многочисленных обходных решений я придумал следующее …

Если я упрощу «$ sfp_query_args», результат будет близок к тому, что требуется, однако неспособность сортировать сообщения остается как есть. Вот:

 $sfp_query_args1 = array( 'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ), 'post_type' => 'sfpposts', 'post_status' => 'publish', 'showposts' => (int)$per_page, 'paged' => $paged, 'meta_key' => 'is_sponsored', 'orderby' => 'meta_value date' ); 
  • * orderby принимает два атрибута: meta_value и date *

Таким образом, запрос $ wpdb-> с указанными выше аргументами выглядит следующим образом:

 SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID FROM $wpdb->posts INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) WHERE 1=1 AND $wpdb->posts.post_type = 'sfpposts' AND ($wpdb->posts.post_status = 'publish') AND ($wpdb->postmeta.meta_key = 'is_sponsored' ) GROUP BY $wpdb->posts.ID ORDER BY $wpdb->postmeta.meta_value, $wpdb->posts.post_date DESC LIMIT 0, $per_page 

И, наконец, для того, чтобы иметь возможность сортировать по meta_value, запрос должен быть задан только с одной незначительной разницей:

 SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID FROM $wpdb->posts INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) WHERE 1=1 AND $wpdb->posts.post_type = 'sfpposts' AND ($wpdb->posts.post_status = 'publish') AND ($wpdb->postmeta.meta_key = 'is_sponsored' ) GROUP BY $wpdb->posts.ID ORDER BY $wpdb->postmeta.meta_value [!ORDER MISSING!], $wpdb->posts.post_date DESC LIMIT 0, $per_page 

Пожалуйста, отметьте место [! ЗАКАЗАТЬ!]. Я предполагаю, что приведенное выше должно объяснить, где именно происходит эта проблема.

ОК, окончательным обходным решением будет разделение запроса:

 $sfp_query_args = array( 'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ), 'meta_key' => 'is_sponsored', 'post_type' => 'sfpposts', 'post_status' => 'publish', 'showposts' => (int)$per_page, 'paged' => $paged ); 

… и использовать фильтр «posts_orderby» для изменения части ORDER:

 add_filter( 'posts_orderby', 'sfp_modify_orderby' ); function sfp_modify_orderby( $orderby ) { if( !is_admin() && is_tax( 'sfp_post_category' ) ) { global $wpdb; $orderby = " $wpdb->postmeta.meta_value DESC, $wpdb->posts.post_date DESC "; } return $orderby; } 

Скорее всего, вам понадобится удалить фильтр после цикла на странице, чтобы предотвратить «posts_orderby» влиять на любой другой запрос (боковая панель или нижний колонтитул). Итак, вот еще одна функция: «functions.php»:

 function sfp_remove_orderby_filter() { remove_filter( 'posts_orderby', 'sfp_modify_orderby' ); } 

… и на странице, используя наш фильтр отбрасывания запроса:

 if( have_posts() ) : while( have_posts() ) : the_post(); // code endwhile; else : // code endif; sfp_remove_orderby_filter(); 

Надеюсь, это имеет смысл!

Я немного изменяю ваш запрос. Надеюсь, это поможет.

 $sfp_query_args = array( 'tax_query' => array( array( 'taxonomy' => 'sfp_posts', 'terms' => array( 1, 5, 8) ) ), 'post_type' => 'sfpposts', 'post_status' => 'publish', 'showposts' => 15, 'paged' => $paged, 'meta_key'=>'sfp_date', 'meta_query' => array( array( 'key' => 'sfp_date', 'type' => 'NUMERIC', ), array( 'key' => 'is_sponsored', 'value' => '2', 'compare' => '<=' ) ), 'orderby' => 'meta_value_num', 'order' => 'DESC', ); $wp_q = new WP_Query( $sfp_query_args ); 

Пожалуйста, дайте мне знать, работает ли это или нет 🙂