Спеціальний запит із замовленням мета-значення спеціального поля


37

Ви знаєте, що з WP3.0 є варіанти для спеціальних розширених запитів, що чудово. З цього моменту деякі параметри запиту користувацьких полів, таких як meta_key, meta_value, були застаріли для нового параметра meta_query ( див. Тут )

Я намагаюсь мати досить простий запит із новим синтаксисом, повідомленнями запитів певного post_type (служби), що містить вказаний мета_кейк (order_in_archive) - це йде добре, як і очікувалося. Але - я хочу замовити запит мета_значення, і це не має успіху.

Це мій запит -

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

Я спробував orderby також мета_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? що orderyby все ще потребує meta_key.

так і має бути

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )

2
Ну так, це старий метод для виконання цього запиту, і, здається, він працює для цього вказаного. У будь-якому випадку для складніших запитів він не працюватиме. Я виявив, що це відоме питання, про яке піклуються, детальну інформацію можна знайти в квитках № 15031 та № 17065
Маор Баразани

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 custom fiel wordpress


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'
      )
);

3
Питання полягає в новому meta_queryпараметрі ish і про те, orderbyщоб працювати з ним, а не про старих, але все ще функціональних meta_key/ meta_valueпараметрах. Також не давайте заохочувати використання query_posts.
s_ha_dum

Ця відповідь містить кілька поганих практик: використання -1, передавання її як рядка, використання query_posts. Його слід видалити.
Ігор Воротнов

0

У мене був набір спеціальних дат подій, які мені потрібно було сортувати за датою зменшення. Оскільки моя власна дата події зберігалася в моїй таблиці wp_postmeta і, як правило, відрізнялася від дати пост_дати або модифікованих дат, це працювало для мене:

  $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);

Потім ви можете переглядати записи на $, наприклад:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.