Реализуем сортировку и разделение записей по алфавиту. Данный функционал может пригодится для вывода и разделения по алфавиту категорий. Можно разделять города в разделе Где купить и т.д.
Описанное решение данной задачи нашел на сайте 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
Так глубоко с этим вопросом не сталкивался. Тема для размышления интересная.
Вот здесь эта тема обсуждалась. Если найду решение — поделюсь.
Спасибо, за наводку, если сама допилю, поделюсь. Ну и новостей от Вас то же буду ждать =)