Реализуем сортировку и разделение записей по алфавиту. Данный функционал может пригодится для вывода и разделения по алфавиту категорий. Можно разделять города в разделе Где купить и т.д.
Описанное решение данной задачи нашел на сайте wp-kama.ru, за что ему большое спасибо!
Вывод категорий с записями по алфавиту
Вставлять там, где необходимо выводить рублики.
<?php // Получаем все рубрики сайта $all_cat = get_categories( array( 'orderby' => 'name', 'order' => 'ASC' ) ); // Выводим каждую рубрику + алфавитный список со статьями к ней относящиеся foreach ( $all_cat as $item_cat ) { // Выводим название рубрики в виде ссылки на неё printf ( '<h2><a href="%s">%s</a></h2>' , get_category_link( $item_cat->term_id ), $item_cat->cat_name ); // Выводим отсортированные по алфавиту записи с этой рубрики get_abc_posts ( $item_cat->term_id ); } ?> <?php // Функция для получения отсортированных по алфавиту записей из указанной рубрики, где $cat - ID рубрики function get_abc_posts ( $cat = 11 ) { $posts = get_posts( array ( 'category' => $cat, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => -1 ) ); foreach( $posts as $k => $post ){ // первая буква $fl = get_first_letter( $post->post_title ); $prev_fl = isset( $posts[ ($k-1) ] ) ? get_first_letter( $posts[ ($k-1) ]->post_title ) : ''; if( $prev_fl !== $fl ) // Буква echo '<h3>'.$fl.'</h3>'; // Выводим название записи в виде ссылки на неё printf ( '<a href="%s">%s</a><br>' , get_the_permalink($post->ID), $post->post_title ); } wp_reset_postdata(); } ?> <?php // Функция возвращает первую букву переданного в неё слова function get_first_letter( $str ){ return mb_substr($str, 0, 1, 'utf-8'); } ?>
Произвольный тип записей по алфавиту
Данный код рассчитан на шаблон архива записей пользовательского типа.
city — это slug записи произвольного типа
<?php $posts = get_posts( array ( 'post_type' => 'city', 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => -1 ) ); foreach( $posts as $k => $post ){ echo '<div class="city-letter">'; // первая буква $fl = get_first_letter( $post->post_title ); $prev_fl = isset( $posts[ ($k-1) ] ) ? get_first_letter( $posts[ ($k-1) ]->post_title ) : ''; if( $prev_fl !== $fl ) // Буква echo '<h3>'.$fl.'</h3>'; // Выводим название записи в виде ссылки на неё printf ( '<a href="%s">%s</a><br>' , get_the_permalink($post->ID), $post->post_title ); echo '</div>'; } wp_reset_postdata(); ?> <?php // Функция возвращает первую букву переданного в неё слова function get_first_letter( $str ){ return mb_substr($str, 0, 1, 'utf-8'); } ?>
Верстка каждой буквы
В вышеописанном примере не совсем корректно будут верстаться блоки с записями буквы. Чтоб сделать каждый блок в отдельном div нужно применить небольшую хитрость:
<?php $posts = get_posts( array ( 'post_type' => 'city', 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => -1 ) ); echo '<div class="city-letter">'; foreach( $posts as $k => $post ){ // первая буква $fl = get_first_letter( $post->post_title ); $prev_fl = isset( $posts[ ($k-1) ] ) ? get_first_letter( $posts[ ($k-1) ]->post_title ) : ''; if( $prev_fl !== $fl ) // Буква echo '</div><div class="city-letter"><h3>'.$fl.'</h3>'; // Выводим название записи в виде ссылки на неё printf ( '<a href="%s">%s</a><br>' , get_the_permalink($post->ID), $post->post_title ); } echo '</div>'; wp_reset_postdata(); ?>
Мы заранее (до цикла) открываем div и при нахождении первой буквы закрываем его и сразу создаем новый. После того как заканчиваются буквы закрываем последний div. Единственным недостатком данного метода является наличие первого пустого div, но это легко исправляется display: none;
Стили:
.city-letter:first-child { display: none; } .city-letter { float: left; width: 20%; height: 100px; }
Про удобное разделение блоков с .city-letter описано здесь (пункт 8)
[site-socialshare]
Вечер добрый. А как при сортировке ‘order’ => ‘ASC’ сделать так, чтобы цифры и всякие символы в духе , . и тд, выводились в последнюю очередь.
То есть а б …. я 1 2 … 1000
Так глубоко с этим вопросом не сталкивался. Тема для размышления интересная.
Вот здесь эта тема обсуждалась. Если найду решение — поделюсь.
Спасибо, за наводку, если сама допилю, поделюсь. Ну и новостей от Вас то же буду ждать =)