Вывод записей по алфавиту в php (группировка по первым буквам)
Добрый день уважаемый автор!
Столкнулся с проблемой "внедрения разделителя", если так это можно назвать, при выводе записей в рубрике. Значит суть: есть определенное количество записей отсортированных по алфавиту (order=asc, orderby=title), и мне нужно вставлять что то вроде такого:
А
Запись начинающаяся на букву А - 1
Запись начинающаяся на букву А - 2
Запись начинающаяся на букву А - 3
...
Я
Запись начинающаяся на букву Я - 1
Запись начинающаяся на букву Я - 2
Запись начинающаяся на букву Я - 3
...
То есть выводить букву на которую начинается запись рубрики + разделитель (<hr/>) и под ним все записи начинающиеся на эту букву. Задача вроде бы не из самых сложных, но что то не могу понять с какой стороны бы его лучше зайти...
Может уже плагин есть готовый реализующий все это? Ну а если нет, то хоть "пните" в каком направлении думать/копать. Благодарю за внимание)
Вообще первую букву строки можно получить так:
Но это не работает когда у нас кириллица. Тут придется обходить. Как вариант можно использовать mb_substr().
Общий алгоритм для вас будет такой:
$arr = [ 'Арбуз', 'Артишок', 'Вишня', 'Яблоко' ]; foreach( $arr as $k => $val ){ $fl = mb_substr( $val, 0, 1 ); // первая буква if( $fl !== ( $last_fl ?? '' ) ){ $last_fl = $fl; echo $fl . '<br>'; } echo $val . '<br>'; }Выведет:
Конкретно для записей WordPress, так:
$posts = get_posts( 'orderby=title&posts_per_page=10' ); foreach( $posts as $k => $post ){ // первая буква $fl = mb_substr( $post->post_title, 0, 1 ); if( $fl !== ( $last_fl ?? '' ) ){ $last_fl = $fl; echo $fl . '<br>'; } echo $post->post_title . '<br>'; } wp_reset_postdata();Выведет:
Благодарю за ответ, однако сделал немного по другому:
$thisChar = mb_substr(get_the_title(), 0, 1); if($thisChar != $lastChar){ $lastChar = $thisChar; echo '<h2>' . $lastChar . '</h2>'; }Все это в цикле while когда выводим записи... Не знаю насколько правильная такая реализация, но оно работает и клиент доволен
Надеюсь кому пригодится. Это обернутый в два div список из ссылок.
$args = array( 'post_type' => 'service', 'posts_per_page' => -1, 'publish' => true, 'orderby' => array( 'title' => 'ASC', ) ); $all = ''; $n = 0; $q = new WP_Query( $args ); if( $q->have_posts() ) : while( $q->have_posts() ) : $q->the_post(); $first = mb_substr( get_the_title(), 0, 1 ); $n++; $pos = strpos( $all, $first ); if ($pos === false) { if( $n != 1 ) { echo '</div>'; echo '</div>'; } $all .= $first; echo '<div class="service-cat__card service-card">'; echo '<div class="service-card__title h2">' . $first . '</div>'; echo '<div class="service-card__link-group">'; echo '<a href="' . get_the_permalink() . '" class="service-card__link">' . get_the_title() . '</a>'; } else { echo '<a href="' . get_the_permalink() . '" class="service-card__link">' . get_the_title() . '</a>'; } endwhile; echo '</div>'; echo '</div>'; endif;Привет. Искал что-то подобное уже неделю, спасибо за код. Можешь прислать уже с разметкой как у тебя на фото?
Это именно такая разметка как на фото, оборачиваешь в php и добавляешь классы свои и все ) Единственное, можешь для верной семантики линки в списки обернуть.