Как вывести метки в порядке числового возрастания?
Доброго дня! Есть метки: "10 квт, 12 квт, 100 квт, 200 кв и т.д.", пытаюсь вывести их в порядке возрастания, но они выводятся почему-то в таком виде: "10 квт, 100 квт, 1000 квт, 12 квт, 120 квт,..." подскажите пожалуйста, как реализовать задачу?
Мой код:
$terms = get_terms( array( 'hide_empty' => 0, 'orderby' => 'name', 'order' => 'ASC', 'taxonomy' => 'product_tag', ) ); if ( $terms ) { echo '<ul>'; foreach ($terms as $term) { echo '<li>'; echo '<a href="' . esc_url(get_term_link($term)) . '">'; echo $term->name; echo '</a>'; echo '</li>'; } echo '</ul>'; } |
$terms = get_terms( array( 'hide_empty' => 0, 'orderby' => 'name', 'order' => 'ASC', 'taxonomy' => 'product_tag', ) ); if ( $terms ) { echo '<ul>'; foreach ($terms as $term) { echo '<li>'; echo '<a href="' . esc_url(get_term_link($term)) . '">'; echo $term->name; echo '</a>'; echo '</li>'; } echo '</ul>'; }
Дополнительно:
KingAnton @KingAnton Можно сформировать массив и отсортировать его средствами php
$sort_tag = []; foreach ($terms as $term) { $sort_tag[$term->name] = esc_url(get_term_link($term->term_id)); } ksort($sort_tag, SORT_NATURAL); foreach ($sort_tag as $tag_name => $tag_url) { echo '<li><a href="' . $tag_url . '">' . $tag_name .'</a></li>'; } |
$sort_tag = []; foreach ($terms as $term) { $sort_tag[$term->name] = esc_url(get_term_link($term->term_id)); } ksort($sort_tag, SORT_NATURAL); foreach ($sort_tag as $tag_name => $tag_url) { echo '<li><a href="' . $tag_url . '">' . $tag_name .'</a></li>'; }
- Undefined array key
- jazzman7, исправил, проверь
- KingAnton, все работает, большое спасибо
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
WordPress сортирует термины по имени как строки, поэтому порядок получается лексикографический:
10,100,1000,12. Для числового порядка нужно отсортировать результат средствами PHP с натуральной сортировкой или вынуть число из названия и сравнить его как число.Если названия всегда начинаются с числа, используйте
usort():$terms = get_terms([ 'taxonomy' => 'product_tag', 'hide_empty' => false, ]); if (! is_wp_error($terms) && $terms) { usort($terms, function ($a, $b) { preg_match('/d+/', $a->name, $a_matches); preg_match('/d+/', $b->name, $b_matches); $a_number = isset($a_matches[0]) ? (int) $a_matches[0] : 0; $b_number = isset($b_matches[0]) ? (int) $b_matches[0] : 0; return $a_number <=> $b_number; }); echo '<ul>'; foreach ($terms as $term) { echo '<li><a href="' . esc_url(get_term_link($term)) . '">' . esc_html($term->name) . '</a></li>'; } echo '</ul>'; }
Если достаточно натуральной сортировки строк, можно собрать массив и применить
strnatcmp(), но для значений вроде «10 квт» и «100 квт» надёжнее явно сравнивать число.Ещё более правильный вариант для каталога — хранить мощность отдельным числовым атрибутом или метаполем, а не только в названии метки. Тогда сортировка и фильтрация будут предсказуемыми.