Обернуть элементы в div внутри цикла WP_Query

Рейтинг: 1Ответов: 1Опубликовано: 10.04.2023

Есть сайт на WordPress. Вывожу записи через WP_Query, подскажите пожалуйста как обернуть все <div class="home_tn_link"> в один общий div, что бы этот общий div был на одном уровне вложенности с <div class="title">.

<?php
$query = new WP_Query( [
    'orderby'        => 'title',
    'posts_per_page' => -1,
] );
global $post;
if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
            $fl = mb_substr( $post->post_title, 0, 1 );
            if( $fl !== ( $last_fl ?? '' ) ){
            $last_fl = $fl;
            ?>
                <div class="title"><?php echo $fl; ?></div>
            <?php
            }?>
            <div class="home_tn_link"><?php echo $post->post_title; ?></div>
    <?php 
    }
}
wp_reset_postdata(); ?>

Пример нужной структуры:

<div> 
   <div class="title"><?php echo $fl; ?></div>
   <div>
      <div class="home_tn_link"></div>
      <div class="home_tn_link"></div>
      <div class="home_tn_link"></div>
   </div>
</div>
<div> 
   <div class="title"><?php echo $fl; ?></div>
   <div>
      <div class="home_tn_link"></div>
      <div class="home_tn_link"></div>
      <div class="home_tn_link"></div>
   </div>
</div>
<div> 
   <div class="title"><?php echo $fl; ?></div>
   <div>
      <div class="home_tn_link"></div>
      <div class="home_tn_link"></div>
      <div class="home_tn_link"></div>
   </div>
</div>

Ответы

▲ 1Принят

Понял Вас, спасибо за уточнение. Исправил ответ
Добавил общий тег, в котором title и второй раздел и для home_tn_link во втором разделе.
Постарался добавить комментариев. Проверьте, пожалуйста, я верно Вас понял?

<?php
$query = new WP_Query( [
    'orderby'        => 'title',
    'posts_per_page' => -1,
] );
global $post;
if ( $query->have_posts() ) {
    $MainDiv = ''; // То, что планируем выводить
    while ( $query->have_posts() ) {
        $query->the_post();
        $fl = mb_substr( $post->post_title, 0, 1 );
        if( $fl !== ( $last_fl ?? '' ) ){
            $last_fl = $fl;
            $MainDiv .= ($MainDiv == '')?'':'</div></div>';  // Если строка уже заполнялась, и это новый title, то необходимо закрыть предыдущий тег div, сначала объединяющий home_tn_link, затем закрываем сразу тег ообщего блока, в котором title и блок с home_tn_link
            $MainDiv .= '<div><div class="title">'.$fl.'</div><div>'; // Если первая строка, то открываем div в котором будут title и блок с home_tn_link и сразу после title еще один div, в котором будут home_tn_link

        } else {
            $MainDiv .= '<div class="home_tn_link">'.$post->post_title.'</div>'; // Добавляем в общую переменную home_tn_link
        }
    }
    echo $MainDiv; // Выводим переменную общую на экран.
}