WordPress как на ладони
wordpress jino

Вывод записей по алфавиту в php (группировка по первым буквам)

Добрый день уважаемый автор!

Столкнулся с проблемой "внедрения разделителя", если так это можно назвать, при выводе записей в рубрике.  Значит суть: есть определенное количество записей отсортированных по алфавиту (order=asc, orderby=title), и мне нужно вставлять что то вроде такого:

А

Запись начинающаяся на букву А - 1
Запись начинающаяся на букву А - 2
Запись начинающаяся на букву А - 3
...

Я

Запись начинающаяся на букву Я - 1
Запись начинающаяся на букву Я - 2
Запись начинающаяся на букву Я - 3
...

То есть выводить букву на которую начинается запись рубрики + разделитель (<hr/>) и под ним все записи начинающиеся на эту букву. Задача вроде бы не из самых сложных, но что то не могу понять с какой стороны бы его лучше зайти... Может уже плагин есть готовый реализующий все это? Ну а если нет, то хоть "пните" в каком направлении думать/копать. Благодарю за внимание)

2
Гость 2.9 года назад
  • 0
    Kama4639

    Вообще первую букву строки можно получить так:

    $str = 'foo';
    echo $str{0}; // f

    Но это не работает когда у нас кириллица. Тут придется обходить, как вариант можно использовать mb_substr(). Общий алгоритм для вас будет такой:

    $arr = array('Арбуз', 'Артишок', 'Вишня', 'Яблоко');
    
    foreach( $arr as $k => $val ){
    
    	// первая буква
    	$fl = get_first_letter( $val );
    	$prev_fl = isset( $arr[ $k-1 ] ) ? get_first_letter( $arr[ $k-1 ] ) : '';
    	if( $prev_fl != $fl )
    		echo $fl . '<br>';
    
    	// данные
    	echo $val . '<br>';
    }
    
    function get_first_letter( $str ){
    	return mb_substr($str, 0, 1, 'utf-8');
    }

    Выведет:

    А
    Арбуз
    Артишок
    В
    Вишня
    Я
    Яблоко

    Конкретно для записей WordPress, так:

    $posts = get_posts('orderby=title&posts_per_page=10');
    
    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 $fl . '<br>';
    
    	// данные
    	echo $post->post_title . '<br>';
    }
    
    wp_reset_postdata();
    
    function get_first_letter( $str ){
    	return mb_substr($str, 0, 1, 'utf-8');
    }

    Выведет:

    Ч
    Что такое цикл the loop в WordPress
    Ф
    Функция для вывода последних комментариев
    Функция для вывода последних записей в WordPress
    Функция вывода постов по количеству комментариев
    Функция вывода записей по количеству просмотров
    Функция вывода всех постов по месяцам написания
    Файл шаблона functions.php в WordPress
    У
    Условные теги в WordPress и все что с ними связано
    Удаляем комментарии ветками
    Удаление виджетов из Консоли WordPress
    Scaletta 2.9 года назад

    Благодарю за ответ, однако сделал немного по другому:

    $thisChar = mb_substr(get_the_title(), 0, 1);
    if($thisChar != $lastChar){
    	$lastChar = $thisChar;
    	echo '<h2>' . $lastChar . '</h2>';
    }

    Все это в цикле while когда выводим записи... Не знаю насколько правильная такая реализация, но оно работает и клиент доволен smile

    Дима 1.2 года назад

    Добрый день. Подскажите, как можно обернуть блок с буквой и соответсвующим ей ссылкам в div

        Буква
    	<ul>
    		<li><a href="" rel="nofollow">Ссылка 1</a><li>
    		<li><a href="" rel="nofollow">Ссылка 1</a><li>
    	</ul>

    ? Помогите, пожалуйста

    Alex-wp год назад

    Не решили данную проблему? Просто тоже столкнулся с этим и уже сутки потерял, но решить так и не смог.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.