Как отсортировать города в wp?

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

Как можно сделать такую сортировку в wp?

Как отсортировать города в wp?

Мой код который выводит все города выглядит так:

<?php                     global $wp_query;                     $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;                     $query = new WP_Query(array(                         'post_type' => 'otkuda', # тип записи                         'post_status' => 'publish', # статус записи                         'paged' => $paged,                         'posts_per_page' => -1,                         'orderby' => 'title',                         'order' => 'ASC'                     ));                     if ($query->have_posts()):                         while ($query->have_posts()):                             $query->the_post();                             ?>                             <div class="other__item">                                 <?php $marshrut = get_field('marshrut', $post->ID); ?>                                 <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" class="other_link"><?php echo $marshrut['geo_from']['city_from']; ?></a>                             </div>                         <?php endwhile;                         wp_reset_query();                         wp_reset_postdata();                      endif; ?>

<?php global $wp_query; $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $query = new WP_Query(array( 'post_type' => 'otkuda', # тип записи 'post_status' => 'publish', # статус записи 'paged' => $paged, 'posts_per_page' => -1, 'orderby' => 'title', 'order' => 'ASC' )); if ($query->have_posts()): while ($query->have_posts()): $query->the_post(); ?> <div class="other__item"> <?php $marshrut = get_field('marshrut', $post->ID); ?> <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" class="other_link"><?php echo $marshrut['geo_from']['city_from']; ?></a> </div> <?php endwhile; wp_reset_query(); wp_reset_postdata(); endif; ?>

Дополнительно:

Ваш код не работает?

  • Артем Золин, Работает, но мне надо чтобы он делал так:
    А
    арбуз
    Б
    банан
    В
    вагон

    Я не могу понять, как можно это реализовать

  • Нужно решить такую задачу?

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

    Заказать помощь
    Лучший ответ
    1
    Mobile-редакция Ответ

    В вашем коде запрос сортирует записи по заголовку записи, а на экран выводится не заголовок, а город из ACF-поля marshrut, внутри geo_from и city_from. Поэтому orderby title не может дать нужный результат, если названия записей и названия городов отличаются. Нужно сортировать именно по тому значению, которое выводится пользователю, а затем при выводе группировать список по первой букве.

    Если записей немного, самый простой путь — получить все записи, собрать для каждой город, отсортировать массив в PHP и вывести заголовок буквы при смене первой буквы. Это проще внедрить в существующий шаблон и не требует перестройки структуры данных. Для русского алфавита лучше использовать mb_substr и mb_strtoupper, чтобы первая буква бралась корректно.

    $query = new WP_Query([
        'post_type'      => 'otkuda',
        'post_status'    => 'publish',
        'posts_per_page' => -1,
    ]);
     
    $items = [];
     
    foreach ($query->posts as $item_post) {
        $marshrut = get_field('marshrut', $item_post->ID);
        $city = $marshrut['geo_from']['city_from'] ?? '';
     
        if ($city === '') {
            continue;
        }
     
        $items[] = [
            'post' => $item_post,
            'city' => $city,
        ];
    }
     
    usort($items, function ($a, $b) {
        return strnatcasecmp($a['city'], $b['city']);
    });
     
    $current_letter = '';
     
    foreach ($items as $item) {
        $post = $item['post'];
        setup_postdata($post);
     
        $city = $item['city'];
        $letter = mb_strtoupper(mb_substr($city, 0, 1));
     
        if ($letter !== $current_letter) {
            $current_letter = $letter;
            echo '<h2>' . esc_html($current_letter) . '</h2>';
        }
     
        echo '<div class="other__item">';
        echo '<a class="other_link" href="' . esc_url(get_permalink($post)) . '">' . esc_html($city) . '</a>';
        echo '</div>';
    }
     
    wp_reset_postdata();

    $query = new WP_Query([ 'post_type' => 'otkuda', 'post_status' => 'publish', 'posts_per_page' => -1, ]); $items = []; foreach ($query->posts as $item_post) { $marshrut = get_field('marshrut', $item_post->ID); $city = $marshrut['geo_from']['city_from'] ?? ''; if ($city === '') { continue; } $items[] = [ 'post' => $item_post, 'city' => $city, ]; } usort($items, function ($a, $b) { return strnatcasecmp($a['city'], $b['city']); }); $current_letter = ''; foreach ($items as $item) { $post = $item['post']; setup_postdata($post); $city = $item['city']; $letter = mb_strtoupper(mb_substr($city, 0, 1)); if ($letter !== $current_letter) { $current_letter = $letter; echo '<h2>' . esc_html($current_letter) . '</h2>'; } echo '<div class="other__item">'; echo '<a class="other_link" href="' . esc_url(get_permalink($post)) . '">' . esc_html($city) . '</a>'; echo '</div>'; } wp_reset_postdata();

    Так вы получите структуру вроде А — Армавир, Архангельск; Б — Балашиха, Барнаул; В — Владивосток. Заголовок буквы выводится только тогда, когда первая буква текущего города отличается от предыдущей.

    • Не используйте wp_reset_query без необходимости. Для отдельного WP_Query обычно достаточно wp_reset_postdata после цикла.
    • Если городов много, сортировка через get_field в PHP будет тяжелее, потому что WordPress загрузит все записи, а ACF дополнительно прочитает метаполя.
    • Для большого каталога лучше дублировать city_from в простое meta-поле, например city_from_sort, и сортировать запросом по meta_value. Еще надежнее сделать города отдельной таксономией или справочником, если они используются в фильтрах и посадочных страницах.

    Для текущей задачи быстрый рабочий вариант — PHP-сортировка после получения записей. Но если это публичный каталог с большим количеством направлений, лучше сразу закладывать нормальную структуру данных, иначе позже появятся проблемы с пагинацией, фильтрами, скоростью и дублями городов.

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

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

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

    комментарий

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

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