WordPress порядок мета значений в массиве - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь получить отсортированный список сообщений, используя get_posts по мета-значению, а порядок мета-значений указан в массиве.

Это то, что у меня сейчас есть.

$stores = get_posts(array(
  'post_type'   => 'stores',
  'post_status' => 'publish',
  'posts_per_page' => -1,
  'fields' => 'ids', // I only need the ID's of posts
  'orderby' => 'meta_value',
  'meta_key' => 'state',
  'order' => 'ASC'
));

Возвращает массив сообщений, отсортированных по meta_value в алфавитном порядке.

У меня есть массив возможных значений для 'meta_key' => 'state', т.е. array('State1', 'State2', 'State3')

Я хочуустановите порядок так, чтобы сначала отображались все хранилища с мета-значением State1, затем с State2 и после этого State3 Я не могу использовать порядок по числовому значению и алфавитному значению, поскольку имена состояний будут случайными.

Я нашел один пост здесь , он использует mera_query_orderby.Я не могу найти документацию для этого и попробовал, но это не работает.Он возвращает сообщения, заказанные по ID.

Любая помощь будет оценена.Спасибо

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

Я добавил meta_query_orderby фильтры в functions.php

И обновленный код, который я использовал из ПРИМЕРА 2, похож на:

$stores = get_posts(array(
  'post_type'   => 'stores',
  'post_status' => 'publish',
  'posts_per_page' => -1,
  'fields' => 'ids',
  'order' => 'ASC',
  'meta_query' => array(
    array(
      'key'   => 'state', // Custom field key.
      'value' => array("CState1", "AState2", "BState3")
    )
  ),
  'meta_query_orderby' => array(
    array(
      'key'   => 'state', // (required) Custom field key.
      'value' => array("CState1", "AState2", "BState3")
    )
  )
));

Ответы [ 2 ]

1 голос
/ 21 мая 2019

У меня есть массив возможных значений для 'meta_key' => 'state', то есть array('State1', 'State2', 'State3')

Если вы хотите отсортировать сообщения по мета-значению в точном порядке, как указано вышеВ массиве вы можете использовать пользовательский параметр WP_Query (для установки значений мета / сортировки) и posts_orderby filter для настройки предложения ORDER BY, и в этом предложении вы будете использоватьFIELD() функция в MySQL.

Шаг 1

Добавьте этот код в свой плагин или тему (если тема, вы добавите код в файл функций темы):

add_filter( 'posts_orderby', 'posts_orderby_meta_value_list', 10, 2 );
function posts_orderby_meta_value_list( $orderby, $query ) {
    $key = 'meta_value_list';
    if ( $key === $query->get( 'orderby' ) &&
        ( $list = $query->get( $key ) ) ) {
        global $wpdb;
        $list = "'" . implode( wp_parse_list( $list ), "', '" ) . "'";
        return "FIELD( $wpdb->postmeta.meta_value, $list )";
    }

    return $orderby;
}

Шаг 2

При выполнении почтовых запросов установите orderby на meta_value_list и добавьте meta_value_list к параметрам запроса -если вы используете get_posts(), убедитесь, что для suppress_filters установлено значение false:

$stores = get_posts( array(
    'post_type'        => 'stores',
    'post_status'      => 'publish',
    'posts_per_page'   => -1,
    'fields'           => 'ids', // get just the ID's of posts
    'meta_key'         => 'state',
    'orderby'          => 'meta_value_list',
    'meta_value_list'  => array( 'State1', 'State2', 'State3', '' ),
    'suppress_filters' => false,
) );

PS: я добавил '' к массиву, чтобы сообщения, где метаданные ((*)1036 *) (т. Е. существует в базе данных, но значение пусто) будет помещено в внизу результатов.

Испытано и протестированоработает, ноОбратите внимание, что приведенное выше решение предназначено только для одного orderby, что означает, что массив не поддерживается.

0 голосов
/ 17 мая 2019
/*Display posts of type 'stores', ordered by 'state', and filtered to show only states.*/
$args = array(
    'post_type'  => 'stores',
    'meta_key'   => 'state',
    'orderby'    => 'meta_value_num',
    'order'      => 'ASC',
    'meta_query' => array(
        array(
            'key'     => 'state',
            'value'   => array( 'State1', 'State2', 'State3'),
            'compare' => 'IN',
        ),
    ),
);
$query = new WP_Query( $args );
...