Пользовательский запрос с сортировкой по meta_value произвольного поля

24 апр. 2011 г., 02:33:13
Просмотры: 165K
Голосов: 47

Как известно, начиная с WP3.0 появились возможности для расширенных пользовательских запросов, что замечательно. В связи с этим некоторые параметры запросов для произвольных полей, такие как meta_key, meta_value, были объявлены устаревшими в пользу нового параметра meta_query (смотрите здесь)

Я пытаюсь создать довольно простой запрос с новым синтаксисом, запрашивая записи определенного типа (services), которые содержат указанный meta_key (order_in_archive) - это работает как ожидалось. Но - я хочу отсортировать результаты запроса по meta_value, и это не получается.

Вот мой запрос -

   query_posts(
    array(  'post_type' => 'services',
        'order' => 'ASC',
        'orderby' => 'meta_value',
        'meta_query' => array(
            array('key' => 'order_in_archive'))
    )
);

Я пробовал сортировать также по meta_value_numeric и meta_value, но в любом случае результаты сортируются по дате публикации (как обычные записи). Кто-нибудь знает, как это можно сделать?

Спасибо

0
Все ответы на вопрос 8
0
40

Вы можете определить мета-ключ для параметра orderby с использованием старого метода (я тестировал на WP 3.1.1)...

query_posts(
    array(  'post_type' => 'services',
            'order'     => 'ASC',
            'meta_key' => 'some_key',
            'orderby'   => 'meta_value', //или 'meta_value_num'
            'meta_query' => array(
                                array('key' => 'order_in_archive',
                                      'value' => 'some_value'
                                )
                            )
    )
);
24 апр. 2011 г. 12:31:24
3
32

Эта проблема в целом решена начиная с WordPress 4.2 благодаря использованию именованных запросов. Например:

$args = array(
  'post_type' => 'services',
  'orderby'   => 'order_clause',
  'meta_query' => array(
       'order_clause' => array(
            'key' => 'order_in_archive',
            'value' => 'some_value',
            'type' => 'NUMERIC' // если поле не является числовым
)));

В моём случае мне нужно было сортировать по числовому полю, и пришлось использовать 'type' => 'NUMERIC' внутри meta_query.

15 нояб. 2016 г. 03:07:52
Комментарии

Отличная находка с именованными запросами!

Kaji Kaji
30 июл. 2017 г. 08:15:49

Да, именованные запросы также ответили на мой вопрос.

Dalton Rooney Dalton Rooney
1 авг. 2017 г. 02:18:22

Отлично. Я не уверен в значении 'value' в этом order_clause, так как это не обязательно, поскольку сортировка будет происходить от наибольшего к наименьшему значению 'order_in_archive'.

Andrew Schultz Andrew Schultz
7 дек. 2018 г. 05:34:47
2
12

WP Codex действительно вводит в заблуждение при рассмотрении этой проблемы.

Вам на самом деле не нужен параметр meta_query для использования orderby, вместо этого используется параметр meta_key, который, хотя согласно WP Codex устарел, было установлено здесь: Как использовать orderby с meta_query в Wordpress 3.1? что orderby все еще требует meta_key.

Поэтому должно быть так:

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )
24 апр. 2011 г. 03:07:14
Комментарии

Ну да, это старый метод выполнения такого запроса, и он, похоже, работает для данного конкретного случая. Однако для более сложных запросов он не подойдет. Я выяснил, что это известная проблема, над которой ведется работа, подробности можно найти в тикетах trac #15031 и #17065

Maor Barazany Maor Barazany
24 апр. 2011 г. 03:14:09

Я использовал плагин Toolset для создания пользовательских атрибутов, и чтобы использовать 'slug' пользовательского атрибута для фильтрации, мне пришлось добавлять префикс wpcf-. Например: 'meta_key' => 'wpcf-order_in_archive'

johnsnails johnsnails
19 июл. 2021 г. 05:23:56
0

Это просто:

Вот мой код:

query_posts(array( 
        'post_type' => 'directors',
        'posts_per_page' => -1,
        'order'    => 'ASC',
        'orderby'  => 'director_weight',
        'meta_key' => 'director_weight'
) );

Главная деталь: обязательно включите параметр meta_key, мой код не сортировал записи, пока я не добавил meta_key, и вот как это выглядит:

Полный код для вывода списка изображений directors, отсортированных по полю director_weight:

<?php 
    query_posts(array( 
        'post_type' => 'directors',
        'posts_per_page' => -1,
        'order'    => 'ASC',
        'orderby'  => 'director_weight',
        'meta_key' => 'director_weight'
    ) );
    while (have_posts()) : the_post();
?>  
    <li <?php echo get_field('director_weight') ?>>
        <img src="<?php echo get_field('director_imagen') ?>">
    </li>
<?php
    endwhile;
    wp_reset_query();
?>

сортировка по произвольному полю в WordPress

7 июл. 2017 г. 00:29:22
0

Не используйте query_posts.

$meta_query = new WP_Meta_Query( $meta_query_args );

$meta_query_args = array(
   'post_type' => 'services', // Тип записи
    'order'     => 'ASC', // Порядок сортировки (по возрастанию)
    'meta_key' => 'your_key', // Мета-ключ
    'orderby'   => 'meta_value', //или 'meta_value_num' - сортировка по мета-значению или числовому мета-значению
    'meta_query' => array(
                    array('key' => 'order_in_archive', // Ключ для мета-запроса
                        'value' => 'some_value' // Значение для сравнения
)));

Используйте параметры WP_Meta_Query

7 авг. 2015 г. 14:32:13
0

Мне нужно было отсортировать набор пользовательских дат событий по убыванию. Поскольку мои пользовательские даты событий хранились в таблице wp_postmeta и обычно отличались от post_date или modified, мне подошло следующее решение:

  $args = array(
    'post_type' => 'events', // мой тип записи - у вас может быть 'posts'
    'post_status' => 'publish', // получать только записи с этим статусом
    'orderby' => 'meta_value', // сортировать по значению meta_value следующего meta_key
    'meta_key' => 'my_custom_eventdate', // название пользовательского meta_key
    'order'=> 'DESC' // сортировка по убыванию
  );

  $posts = new WP_Query($args);

Затем можно пройтись по $posts следующим образом:

foreach($posts->posts as $p){

    $post_id = $p->ID;
    // и так далее...

    // # пример получения моей даты события
    $event = get_post_meta($post_id, 'my_custom_eventdate', true);
}
19 янв. 2017 г. 22:00:51
0

Следующее решение работает:

$args = array(
    'post_type' => 'services',
    'order' => 'ASC',
    'orderby'   => 'order_clause',   
    'meta_query' => array(
        'order_clause' => array(
            'key' => 'order_in_archive'
        )
    )
);

Необходимо было указать ключ подмассива meta_query order_clause для значения orderby.

17 мар. 2019 г. 13:55:48
2

Я обнаружил, что это работает довольно хорошо.

<?php 
query_posts(
array(  'posts_per_page' => '-1',
        'post_type' => 'services',
        'order'     => 'DESC',
        'meta_key' => '_order',
        'orderby'   => 'meta_value_num', // или 'meta_value_num'
      )
);
28 дек. 2012 г. 21:07:37
Комментарии

Вопрос касается относительно нового параметра meta_query и настройки orderby для работы с ним, а не о более старых, но всё ещё рабочих параметрах meta_key/meta_value. Также давайте не поощрять использование query_posts.

s_ha_dum s_ha_dum
28 дек. 2012 г. 21:55:19

Этот ответ содержит несколько плохих практик: использование -1, передача его как строки, использование query_posts. Его следует удалить.

Ihor Vorotnov Ihor Vorotnov
1 мар. 2019 г. 11:18:12