Как прописать условие при котором блок показываться не будет?

Ссылка скопирована
1 ответ

как прописать условие, при котором в случае отсутствия контента, блок ( весь section) показываться не будет.
Сейчас код выглядит так:

<section class="questions">     <div class="container">         <div class="questions__container">             <h2 class="questions__title ">Часто задаваемые вопросы</h2>             <ul class="questions__list list accordion-list list flex ">                   <?php if (have_rows('faq')) : while (have_rows('faq')) : the_row(); ?>                         <li class="questions__item accordion ">                             <button class=" accordion__control  btn-reset ">                                 <span class="questions__item-title"><?php the_sub_field('vopros'); ?></span>                                 <svg class="questions__item-icon" width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">                                     <ellipse cx="25" cy="25" rx="25" ry="25" fill="#ECECEC" />                                     <path fill-rule="evenodd" clip-rule="evenodd" d="M25.0571 24.0571L25.0571 9L25.9429 9L25.9429 24.0571L33.8835 24.0571L41 24.0571L41 24.9429L25.9429 24.9429L25.9429 40L25.0571 40L25.0571 24.9429L10 24.9429L10 24.0571L25.0571 24.0571Z" fill="#666666" />                                 </svg>                             </button>                             <div class="accordion__content"><?php the_sub_field('otvet'); ?></div>                         </li>                 <?php endwhile;                 endif; ?>              </ul>          </div>     </div> </section>

<section class="questions"> <div class="container"> <div class="questions__container"> <h2 class="questions__title ">Часто задаваемые вопросы</h2> <ul class="questions__list list accordion-list list flex "> <?php if (have_rows('faq')) : while (have_rows('faq')) : the_row(); ?> <li class="questions__item accordion "> <button class=" accordion__control btn-reset "> <span class="questions__item-title"><?php the_sub_field('vopros'); ?></span> <svg class="questions__item-icon" width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg"> <ellipse cx="25" cy="25" rx="25" ry="25" fill="#ECECEC" /> <path fill-rule="evenodd" clip-rule="evenodd" d="M25.0571 24.0571L25.0571 9L25.9429 9L25.9429 24.0571L33.8835 24.0571L41 24.0571L41 24.9429L25.9429 24.9429L25.9429 40L25.0571 40L25.0571 24.9429L10 24.9429L10 24.0571L25.0571 24.0571Z" fill="#666666" /> </svg> </button> <div class="accordion__content"><?php the_sub_field('otvet'); ?></div> </li> <?php endwhile; endif; ?> </ul> </div> </div> </section>

Дополнительно:

Спасибо, что указал, что это ВордПресс и мы сразу имеем понятие, какое условие тебе нужно - have_rows('faq')

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Артём Dev Ответ

Сейчас <section> выводится до проверки ACF-поля, поэтому пустой блок все равно появляется. Нужно сначала проверить, есть ли строки в repeater-поле faq, и только потом выводить весь section.

&lt;?php if (have_rows('faq')) : ?&gt;
    &lt;section class="questions"&gt;
        &lt;div class="container"&gt;
            &lt;div class="questions__container"&gt;
                &lt;h2 class="questions__title"&gt;Часто задаваемые вопросы&lt;/h2&gt;
 
                &lt;ul class="questions__list list accordion-list list flex"&gt;
                    &lt;?php while (have_rows('faq')) : the_row(); ?&gt;
                        &lt;li class="questions__item accordion"&gt;
                            &lt;button class="accordion__control btn-reset" type="button"&gt;
                                &lt;span class="questions__item-title"&gt;&lt;?php the_sub_field('vopros'); ?&gt;&lt;/span&gt;
                            &lt;/button&gt;
 
                            &lt;div class="accordion__content"&gt;
                                &lt;?php the_sub_field('otvet'); ?&gt;
                            &lt;/div&gt;
                        &lt;/li&gt;
                    &lt;?php endwhile; ?&gt;
                &lt;/ul&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/section&gt;
&lt;?php endif; ?&gt;

&lt;?php if (have_rows('faq')) : ?&gt; &lt;section class="questions"&gt; &lt;div class="container"&gt; &lt;div class="questions__container"&gt; &lt;h2 class="questions__title"&gt;Часто задаваемые вопросы&lt;/h2&gt; &lt;ul class="questions__list list accordion-list list flex"&gt; &lt;?php while (have_rows('faq')) : the_row(); ?&gt; &lt;li class="questions__item accordion"&gt; &lt;button class="accordion__control btn-reset" type="button"&gt; &lt;span class="questions__item-title"&gt;&lt;?php the_sub_field('vopros'); ?&gt;&lt;/span&gt; &lt;/button&gt; &lt;div class="accordion__content"&gt; &lt;?php the_sub_field('otvet'); ?&gt; &lt;/div&gt; &lt;/li&gt; &lt;?php endwhile; ?&gt; &lt;/ul&gt; &lt;/div&gt; &lt;/div&gt; &lt;/section&gt; &lt;?php endif; ?&gt;

Если repeater может содержать строку без вопроса и ответа, лучше дополнительно пропускать пустые элементы внутри цикла:

$question = get_sub_field('vopros');
$answer = get_sub_field('otvet');
 
if (! $question &amp;&amp; ! $answer) {
    continue;
}

$question = get_sub_field('vopros'); $answer = get_sub_field('otvet'); if (! $question &amp;&amp; ! $answer) { continue; }

Но главный принцип один: HTML-обертку блока выводим только после проверки данных. Иначе CSS может скрыть визуально пустоту, но в разметке пустой section все равно останется.

Условие нужно ставить вокруг всего <section>, а не только вокруг цикла внутри него. Сейчас секция, заголовок и контейнер выводятся всегда, даже если повторитель faq пустой. Поэтому проверку have_rows('faq') нужно перенести выше.

&lt;?php if (have_rows('faq')) : ?&gt;
    &lt;section class="questions"&gt;
        &lt;div class="container"&gt;
            &lt;div class="questions__container"&gt;
                &lt;h2 class="questions__title"&gt;Часто задаваемые вопросы&lt;/h2&gt;
                &lt;ul class="questions__list list accordion-list list flex"&gt;
                    &lt;?php while (have_rows('faq')) : the_row(); ?&gt;
                        &lt;li class="questions__item accordion"&gt;
                            &lt;button class="accordion__control btn-reset" type="button"&gt;
                                &lt;span class="questions__item-title"&gt;&lt;?php echo esc_html(get_sub_field('vopros')); ?&gt;&lt;/span&gt;
                            &lt;/button&gt;
                            &lt;div class="accordion__content"&gt;
                                &lt;?php echo wp_kses_post(get_sub_field('otvet')); ?&gt;
                            &lt;/div&gt;
                        &lt;/li&gt;
                    &lt;?php endwhile; ?&gt;
                &lt;/ul&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/section&gt;
&lt;?php endif; ?&gt;

&lt;?php if (have_rows('faq')) : ?&gt; &lt;section class="questions"&gt; &lt;div class="container"&gt; &lt;div class="questions__container"&gt; &lt;h2 class="questions__title"&gt;Часто задаваемые вопросы&lt;/h2&gt; &lt;ul class="questions__list list accordion-list list flex"&gt; &lt;?php while (have_rows('faq')) : the_row(); ?&gt; &lt;li class="questions__item accordion"&gt; &lt;button class="accordion__control btn-reset" type="button"&gt; &lt;span class="questions__item-title"&gt;&lt;?php echo esc_html(get_sub_field('vopros')); ?&gt;&lt;/span&gt; &lt;/button&gt; &lt;div class="accordion__content"&gt; &lt;?php echo wp_kses_post(get_sub_field('otvet')); ?&gt; &lt;/div&gt; &lt;/li&gt; &lt;?php endwhile; ?&gt; &lt;/ul&gt; &lt;/div&gt; &lt;/div&gt; &lt;/section&gt; &lt;?php endif; ?&gt;

Если у вас внутри повторителя бывают строки с пустым вопросом и ответом, одной проверки have_rows() мало: повторитель формально есть, но полезного контента нет. Тогда сначала соберите строки в массив и выводите секцию только если есть хотя бы один непустой элемент. Это особенно важно для FAQ, чтобы на странице не появлялся пустой блок с заголовком.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно