Записи в повторитель?

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

Друзья, возникла проблема, создал повторитель в нём находится acf поле с типом записи. Пример кода будет ниже.
Когда я использую повторитель, то я использую the_sub_field чтобы вывести вложенные поля. Но как мне сделать это если там внутри поле с типом записи и если я вставляю вместо get_field('block-serv-pov') ставлю the_sub_field('block-serv-pov') то у меня крашится сайт. Как можно решить эту проблему

<?php if (get_field('show-uslug-1')) : ?> 			<div class="services-sect bg-color_gray"> 					<div class="services-sect__container"> 						<?php while (have_rows('block-name-uslug')) : the_row(); ?> 						<h2 class="services-sect__title section-title"><?php the_sub_field('block-name-title'); ?></h2> 		<?php 			$query = new WP_Query( 				array( 					'post_type' => 'page', 					'posts_per_page' => -1, 					'post__in' => get_field('block-serv-pov') 				) 			); 			if ($query->have_posts()) : 		?> 							 			 					 		<?php 			endif; 			wp_reset_query(); 		?> 						<?php endwhile; ?> 					</div> 				</div> 		<?php endif; ?>

<?php if (get_field('show-uslug-1')) : ?> <div class="services-sect bg-color_gray"> <div class="services-sect__container"> <?php while (have_rows('block-name-uslug')) : the_row(); ?> <h2 class="services-sect__title section-title"><?php the_sub_field('block-name-title'); ?></h2> <?php $query = new WP_Query( array( 'post_type' => 'page', 'posts_per_page' => -1, 'post__in' => get_field('block-serv-pov') ) ); if ($query->have_posts()) : ?> <?php endif; wp_reset_query(); ?> <?php endwhile; ?> </div> </div> <?php endif; ?>

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

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

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

Заказать помощь
Лучший ответ
1
Редакция по БД Ответ

Если вопрос про “записи в повторитель”, то обычно речь о том, как вывести несколько записей WordPress внутри repeater-поля ACF/Carbon Fields или как хранить выбранные записи в повторителе. Рабочий вариант зависит от того, что именно Вы хотите получить: список связанных записей, карточки услуг, блоки FAQ или произвольные элементы.

Для ACF правильнее не хранить ID записей текстом. Используйте поле Post Object или Relationship внутри repeater. Тогда редактор сможет выбрать запись из админки, а в шаблоне Вы получите объект или ID.

Пример для ACF repeater:

if (have_rows('related_items')) {
    echo '<div class="related-items">';
 
    while (have_rows('related_items')) {
        the_row();
 
        $post = get_sub_field('post');
 
        if (!$post) {
            continue;
        }
 
        $post_id = is_object($post) ? $post->ID : (int) $post;
 
        echo '<a class="related-card" href="' . esc_url(get_permalink($post_id)) . '">';
        echo esc_html(get_the_title($post_id));
        echo '</a>';
    }
 
    echo '</div>';
}

if (have_rows('related_items')) { echo '<div class="related-items">'; while (have_rows('related_items')) { the_row(); $post = get_sub_field('post'); if (!$post) { continue; } $post_id = is_object($post) ? $post->ID : (int) $post; echo '<a class="related-card" href="' . esc_url(get_permalink($post_id)) . '">'; echo esc_html(get_the_title($post_id)); echo '</a>'; } echo '</div>'; }

Если нужно вывести последние записи внутри повторителя, то повторитель вообще не нужен. Делайте обычный WP_Query:

$q = new WP_Query([
    'post_type'      => 'post',
    'posts_per_page' => 6,
]);
 
while ($q->have_posts()) {
    $q->the_post();
    get_template_part('template-parts/card');
}
 
wp_reset_postdata();

$q = new WP_Query([ 'post_type' => 'post', 'posts_per_page' => 6, ]); while ($q->have_posts()) { $q->the_post(); get_template_part('template-parts/card'); } wp_reset_postdata();

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

Если используете Carbon Fields, аналог — complex field с association внутри:

Field::make('complex', 'related_blocks', 'Связанные материалы')
    ->add_fields([
        Field::make('association', 'post', 'Запись')
            ->set_types([
                ['type' => 'post', 'post_type' => 'post'],
            ]),
    ]);

Field::make('complex', 'related_blocks', 'Связанные материалы') ->add_fields([ Field::make('association', 'post', 'Запись') ->set_types([ ['type' => 'post', 'post_type' => 'post'], ]), ]);

Итог: для ручного выбора записей используйте Relationship/Post Object внутри повторителя. Для автоматического вывода не нужен повторитель — используйте WP_Query.

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

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

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

комментарий

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

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