список сообщений и обернуть их в алфавитном порядке A-Z

У меня есть список постов на моем веб-сайте, и я пытаюсь обернуть их в алфавитном порядке от A-Z по заголовку, чтобы получить такой словарь:

A.
яблоко

B.
Банан

C.
Carotts

D.

E.

F.

Г.
Гренада

и так далее до буквы з.

Я хочу, чтобы письмо отображалось, даже если нет поста.

и я хочу обернуть результаты внутри этой структуры:

<div class="group_letter">
<div class="letter">A</div>
<div class="post">Apple</div>
</div>

<div class="group_letter">
<div class="letter">B</div>
<div class="post">Banana</div>
</div>

вот что у меня так далеко:

<?php
$letter=' ';
query_posts( array ( 'post_type' => 'auteurs', 'orderby' => 'title', 'order' => 'ASC' ) );
if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<?php
$title=get_the_title();
$initial=strtoupper(substr($title,0,1));
if($initial!=$letter) {
echo "<div>$initial</div>";
$letter=$initial;
}

echo "<div class='post'>" . $title. "</div>";
?>

<?php endwhile; endif; wp_reset_query(); ?>

вот результат:

<div class='letter'>A</div>
<div class='post'>Apple</div>

<div class='letter'>B</div>
<div class='post'>Banana</div>

<div class='letter'>C</div>
<div class='post'>carotts</div>

<div class='letter'>G</div>
<div class='post'>Grenanda</div>

У меня 2 проблемы:

  1. Пустые буквы не отображаются.
  2. Я не могу найти способ обернуть свои группы внутри div «group_letter».

Кто-нибудь может мне помочь с этим?

большое спасибо за вашу помощь

0

Решение

Я бы решил это с помощью фильтра на WP_Query. Тот, который обнаруживает дополнительную переменную запроса.
Добавьте это в ваши functions.php

add_filter( 'posts_where', 'title_filter', 10, 2 );
function title_filter( $where, &$wp_query )
{
global $wpdb;
if ( $search_term = $wp_query->get( 'search_prod_title' ) ) {
$where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( $wpdb->esc_like( $search_term ) ) . '%\'';
}
return $where;
}

Как только у вас есть фильтр, вы можете использовать wp_query и массив алфавита

foreach (range('A', 'Z') as $char) {
echo '<div class="group_letter">';
echo '<div class="letter">'.$char.'</div>';
$args = array(
'post_type' => 'auteurs',
'posts_per_page' => -1,
'search_prod_title' => $char,
'post_status' => 'publish',
'orderby'     => 'title',
'order'       => 'ASC'
);
$the_query = new WP_Query($args);
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
$title=get_the_title();
$initial=strtoupper(substr($title,0,1));
if($initial==$char) {
echo "<div class='post'>" . $title. "</div>";
}
endwhile;
wp_reset_postdata();
endif;
echo '</div>';
}
remove_filter( 'posts_where', 'title_filter', 10, 2 );

Я не проверял этот код, надеюсь, он должен работать.
Вы можете получить больше информации о Wp_query https://codex.wordpress.org/Class_Reference/WP_Query

1

Другие решения

Извините, постин ТВ с телефона, поэтому может отображаться неправильно

Во-первых, вы должны создать массив всех алфавитов.

$alph = array('A', 'B', 'C',.... 'Z');<

?php
$title=get_the_title();
foreach($alph as $key) {
// add while loop here
initial=strtoupper(substr($title,0,1));
if($initial!=$key) {
echo '<div class="group_letter">';
echo "<div>$key</div>";
}else{

echo "<div class='post'>" . $title. "</div>";
}
echo "</div>";
// end while loop here
}
?>
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector