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

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

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

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

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

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

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

Может уже плагин есть готовый реализующий все это? Ну а если нет, то хоть "пните" в каком направлении думать/копать. Благодарю за внимание)

2
Гость
8 лет назад
  • 0
    Kama9100

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

    $str = 'foo';
    echo $str[0]; // f

    Но это не работает когда у нас кириллица. Тут придется обходить. Как вариант можно использовать 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();

    Выведет:

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

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

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

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

    turbomen24 2.4 года назад

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

    Abies 1.1 года назад

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

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

    Abies 1.1 года назад

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

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