Сортировка get_terms по мета-данным термина

22 нояб. 2016 г., 04:55:29
Просмотры: 32.4K
Голосов: 10

У меня есть пользовательская таксономия prod-cat

Я хочу отсортировать вывод в шаблоне по номеру, поэтому я добавил term_meta к таксономии следующим образом:

add_action( 'prod-cat_add_form_fields', 'add_feature_group_field', 10, 2 );
function add_feature_group_field($taxonomy) {
    ?>
    <div class="form-field term-order-wrap">
        <label for="term-order">Порядок</label>
        <input type="text" name="wm-cat-prod-order" />
    </div>
    <?php
}

А затем:

add_action( 'created_prod-cat', 'save_feature_meta', 10, 2 );
function save_feature_meta( $term_id, $tt_id ){
    if( isset( $_POST['wm-cat-prod-order'] ) && '' !== $_POST['wm-cat-prod-order'] ){
        add_term_meta( $term_id, 'wm-cat-prod-order', $_POST['wm-cat-prod-order'], true );
    }
}

Мета-данные термина работают, они сохраняются. Затем в шаблоне я делаю следующее:

$args = array(
    'taxonomy'      =>  'categoria-de-productos',
    'orderby'       =>  'wm-cat-prod-order',
    'order'         =>  'ASC',
    'hide_empty'    =>  false,
    'hierarchical'  =>  false,
    'parent'        =>  0,
);

$terms = get_terms( $args );

Но я не могу заставить его сортироваться по мета-данным "wm-cat-prod-order". Кто-нибудь может помочь с этим? Спасибо

0
Все ответы на вопрос 4
3
18

Функция get_terms поддерживает параметр meta_query, который вызывает новый параметр WP_Meta_Query, как вы можете увидеть здесь. Для запроса терминов с нужными метаданными вы можете изменить вызов функции следующим образом:

$args = array(
  'taxonomy' => 'categoria-de-productos',
  'orderby' => 'meta_value_num',
  'order' => 'ASC',
  'hide_empty' => false,
  'hierarchical' => false,
  'parent' => 0,
  'meta_query' => [[
    'key' => 'wm-cat-prod-order',
    'type' => 'NUMERIC',
  ]],
);

$terms = get_terms( $args );

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

22 нояб. 2016 г. 11:45:33
Комментарии

Это не работает для категорий + ACF

vladkras vladkras
30 мая 2017 г. 07:56:49

Что именно ты хочешь достичь, @vladkras?

Fabian Marz Fabian Marz
30 мая 2017 г. 11:34:12

Ты также можешь исключить часть meta_query из аргументов, просто добавив 'meta_key'=>'wm-cat-prod-order', убедившись, что сохраняешь часть 'orderby' => 'meta_value_num'

Frits Frits
3 дек. 2019 г. 09:43:09
2
$args = array(

    'taxonomy'      => 'MY_TAX', // Таксономия
    'meta_key'      => 'ordem', // Мета-ключ для сортировки
    'meta_compare'  => 'NUMERIC', // Сравнение как числовое значение
    'orderby'       => 'meta_value_num', // Сортировка по числовому значению
    'order'         => 'ASC', // Порядок сортировки (по возрастанию)
    'hide_empty'    => false, // Показывать пустые термины
);

$the_query = new WP_Term_Query($args); // Создание запроса терминов

foreach ( $the_query->get_terms() as $term ) // Цикл по полученным терминам
{
    ...
}
29 авг. 2018 г. 20:12:01
Комментарии

Пожалуйста, [отредактируйте] ваш ответ и добавьте объяснение: почему это может решить проблему?

fuxia fuxia
29 авг. 2018 г. 20:46:48

Это работает с пользовательскими типами записей и является простым решением - просто измените meta_key на то же имя, что и field_name (обратите внимание, что это число)

User User
3 февр. 2019 г. 11:53:04
0

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

$args = array(
    'taxonomy'      => 'categoria-de-productos',
    'order'         => 'ASC',
    'orderby'       => 'meta_value_num', // Обрабатывать мета-значение как числовое
    'meta_key'      => 'wm-cat-prod-order' // Ключ мета-поля
);
$terms_query = new WP_Term_Query( $args );
if( ! empty( $terms_query->terms ) ) {
   foreach( $terms_query->terms as $term ) {
      // Здесь выполняем действия, $term - это объект WP_Term
    }
}

Одна из вещей, которые я обычно делаю, это определяю запасной вариант, например 'meta_value_num term_id', чтобы использовать term_id, если значения для wm-cat-prod-order одинаковы, но это полностью сломало код и привело к неожиданным результатам. Это работало только если 'meta_value_num' было единственным значением для orderby.

14 авг. 2020 г. 00:51:29
0

Для себя я создал пользовательскую таксономию, в которой было пользовательское мета-поле. Мне нужно было добавить колонку в админке и сделать её сортируемой. Чтобы сортировка работала для пользовательского мета-поля в пользовательской таксономии, я сделал следующее.

https://pastebin.com/vr2sCKzX

public function pre_get_terms( $query ) {
$meta_query_args = array(
    'relation' => 'AND', // Необязательно, по умолчанию "AND"
    array(
        'key'     => 'order_index',
        'value'   => 0,
        'compare' => '>='
    )
);
$meta_query = new WP_Meta_Query( $meta_query_args );
$query->meta_query = $meta_query;
$query->orderby = 'position_clause';

} Ответ я нашёл по этой ссылке https://core.trac.wordpress.org/ticket/34996

Мне просто пришлось адаптировать ответ, предоставленный в комментариях пользователем @eherman24

10 нояб. 2017 г. 16:20:34