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

37

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

Я пытаюсь получить довольно простой запрос с новым синтаксисом, запросить сообщения по определенному post_type (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'))
    )
);

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

Благодарность

Маор Баразаны
источник

Ответы:

35

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

query_posts(
    array(  'post_type' => 'services',
            'order'     => 'ASC',
            'meta_key' => 'some_key',
            'orderby'   => 'meta_value', //or 'meta_value_num'
            'meta_query' => array(
                                array('key' => 'order_in_archive',
                                      'value' => 'some_value'
                                )
                            )
    )
);
Ян Бочинец
источник
15

Эта проблема в общем устранена в 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' // unless the field is not a number
)));

Для меня я хотел упорядочить по числовому полю, и мне пришлось использовать 'type' => 'NUMERIC'внутри мета-запроса.

Райан Тейлор
источник
1
Потрясающая находка по названным запросам!
Кадзи
Да, именные запросы тоже ответили на вопрос.
Далтон
Превосходно. Я не уверен в значении 'value' в этом order_clause, потому что это не обязательно, так как он упорядочит его по максимальному или минимальному значению 'order_in_archive'.
Эндрю Шульц
10

Кодекс WP на самом деле сбивает с толку при решении этой проблемы.

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

так и должно быть

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )
Эван Йеунг
источник
2
Ну, да, это старый метод для выполнения этого запроса, и, похоже, он работает для указанного. В любом случае, для более сложных запросов это не сработает. Я обнаружил, что это известная проблема, которая решается , подробности можно найти в билетах trac # 15031 и # 17065
Maor Barazany
2

Это просто:

Вот мой код:

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();
?>

order_by настраиваемое поле WordPress

Иисус CMD
источник
1

Не используйте 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', //or 'meta_value_num'
    'meta_query' => array(
                    array('key' => 'order_in_archive',
                        'value' => 'some_value'
)));

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

Брэд Далтон
источник
0

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

<?php 
query_posts(
array(  'posts_per_page' => '-1',
        'post_type' => 'services',
        'order'     => 'DESC',
        'meta_key' => '_order',
        'orderby'   => 'meta_value_num', //or 'meta_value_num'
      )
);
gegere
источник
3
Речь идет о новом иш meta_queryпараметра и получить orderbyк работе с ней, а не о старых , но все еще функциональных meta_key/ meta_valueпараметров. Кроме того, давайте не будем поощрять использование query_posts.
s_ha_dum
Этот ответ содержит несколько плохих практик: использование -1, передача его в виде строки, использование query_posts. Это должно быть удалено.
Игорь Воротнов
0

У меня был набор пользовательских дат событий, которые мне нужно было отсортировать по дате по убыванию. Так как моя пользовательская дата события хранилась в моей таблице wp_postmeta и обычно отличалась от даты post_date или модифицированной даты, это сработало для меня:

  $args = array(
    'post_type' => 'events', // my post type - yours can be 'posts'
    'post_status' => 'publish', // only get posts with this status
    'orderby' => 'meta_value', // orderby the meta_value of the following meta_key
    'meta_key' => 'my_custom_eventdate', // the custom meta_key name
    'order'=> 'DESC' // sort descending
  );

  $posts = new WP_Query($args);

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

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

    $post_id = $p->ID;
    // and so on ...

    // # example of how I retrieve my event date
    $event = get_post_meta($post_id, 'my_custom_eventdate', true);
}
рекурсию
источник
0

Это работа для меня,

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

Нужно только предоставить ключ для order_clause

pingle60
источник