Intereting Posts

query_posts сортируются по нескольким направлениям

Я пытаюсь улучшить сортировку сообщений, используя несколько критериев, но мне нужны конкретные заказы для разных значений. Например, у меня есть meta_key с названием «featured», что я хочу переместить любое сообщение вверх. Для соответствия «признакам» он должен сортироваться по названию.

Проблема в том, что я могу определить только один «порядок» в функции query_posts.

$args=array( 'post_type' => 'portfolio-item', 'post_status' => 'publish', 'caller_get_posts' => 1, 'paged' => $paged, 'meta_key' => 'featured', 'orderby' => 'meta_value title', 'order' => 'desc asc', ); 

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

Solutions Collecting From Web of "query_posts сортируются по нескольким направлениям"

Сортировать по

Функции запроса, такие как get_posts() , query_posts() вызывают new WP_Query внутри – они просто обертки.

Более важно то, что происходит в class WP_Query . В частности, внутри WP_Query -> get_posts() . Когда вы добавляете аргумент orderby , происходит следующее:

  1. WP проверяет, установлен ли он. Если нет, то он использует $wpdb->posts.post_date и добавляет к нему значение `order.
  2. Если вы установите его на 'none' , то приказ не применяется.
  3. В любом другом случае заказ будет использоваться.

Но … есть допустимые значения порядка:

 $allowed_keys = array('name', 'author', 'date', 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand', 'comment_count'); 

Для пар meta key / value есть специальный случай: если мета-ключ не пуст, значение meta_key добавляется к разрешенным клавишам, а также meta_value и meta_value_num .

Функция, чем взрывает строку orderby в массив и проходит через нее. Все, что соответствует, добавляется в новый массив, который затем вставляется (разделяется запятой) после цикла и добавляется в строку запроса SQL. Если результирующий массив был пуст, то снова – "$wpdb->posts.post_date" за которым следует order . Если это тоже пусто, тогда вы увидите тот же результат, что и при none .

Поэтому, если вы добавляете что-либо наподобие мета-ключа и мета-значения, вы должны добавить в свой запрос следующее:

 "$wpdb->postmeta.meta_value,$wpdb->postmeta.meta_value,$wpdb->posts.post_title" 

Тип сообщения (ов)

Аргумент типа post добавляется в WHERE следующим образом:

  AND $wpdb->posts.post_type = 'portfolio-item' 

Я думаю, что здесь неправильно:

  1. Вы не можете добавить asc desc качестве инструкции order . Заказ должен быть либо ASC либо DESC (верхний / нижний регистр не имеет значения). Это не сработает и, скорее всего, сломается.
  2. Я уверен, что 'portfolio-item' не является фактическим именем типа сообщения. Думаю, это просто portfolio . Обязательно вызовите все, что называется типом сообщения.

     var_dump( array_keys( (array) $GLOBALS['wp_post_types'] ) ); 
  3. caller_get_posts – это аргумент до 3.1. Вы должны уже получить заметку в начале / начале вашего кода, так как _deprecated_argument() следующий _deprecated_argument() до того, как будет построена любая строка запроса:

     "caller_get_posts" is deprecated. Use "ignore_sticky_posts" instead.