Как отсортировать города в 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; ?>
Дополнительно:
Ваш код не работает?
А
арбуз
Б
банан
В
вагон
Я не могу понять, как можно это реализовать
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

В вашем коде запрос сортирует записи по заголовку записи, а на экран выводится не заголовок, а город из 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();
Так вы получите структуру вроде А — Армавир, Архангельск; Б — Балашиха, Барнаул; В — Владивосток. Заголовок буквы выводится только тогда, когда первая буква текущего города отличается от предыдущей.
Для текущей задачи быстрый рабочий вариант — PHP-сортировка после получения записей. Но если это публичный каталог с большим количеством направлений, лучше сразу закладывать нормальную структуру данных, иначе позже появятся проблемы с пагинацией, фильтрами, скоростью и дублями городов.