Как вывести метки в порядке числового возрастания?

Ссылка скопирована
PHP
1 ответ

Доброго дня! Есть метки: "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, все работает, большое спасибо
Нужно решить такую задачу?

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

Заказать помощь
Лучший ответ
1
Максим Павлов Ответ

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

$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 квт» надёжнее явно сравнивать число.

Ещё более правильный вариант для каталога — хранить мощность отдельным числовым атрибутом или метаполем, а не только в названии метки. Тогда сортировка и фильтрация будут предсказуемыми.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно