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

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

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

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

А

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

Я

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

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

2
Гость
7.5 лет назад
  • 0
    Kama8757

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

    $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 7.5 лет назад

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

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

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

    turbomen24 1.8 года назад

    Тот же вопрос!

    Abies 7 месяцев назад

    Надеюсь кому пригодится. Это обернутый в два 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;
    web-darom 6 месяцев назад

    Привет. Искал что-то подобное уже неделю, спасибо за код. Можешь прислать уже с разметкой как у тебя на фото?

    Abies 6 месяцев назад

    Это именно такая разметка как на фото, оборачиваешь в php и добавляешь классы свои и все ) Единственное, можешь для верной семантики линки в списки обернуть.

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