Как вставить группу полей ACF в записи после 1-го абзаца в WordPress?
Здравсвтуйте, у меня возникла проблема, которую я не смогла решить... Я добавила в acf нужную группу мне полей, с этим проблем не возникло и вставила данный код в single.php :
<table> <thead> <tr class="first"> <th><?php the_field('bir_date_title'); ?></th> <th><?php the_field('bir_date'); ?></th> </tr> </thead> <tbody> <tr class="second"> <td><?php the_field('age_title'); ?></td> <td><?php the_field('age'); ?></td> </tr> </tbody> <tbody> <tr class="first"> <td><?php the_field('bir_place_title'); ?></td> <td><?php the_field('bir_place'); ?></td> </tr> </tbody> <tbody> <tr class="second"> <td><?php the_field('rost_title'); ?></td> <td><?php the_field('rost'); ?></td> </tr> </tbody> <tbody> <tr class="first"> <td><?php the_field('ves_title'); ?></td> <td><?php the_field('ves'); ?></td> </tr> </tbody> <tbody> <tr class="second"> <td><?php the_field('instagram_title'); ?></td> <td><a href="<?= get_field('instagram')['url'] ?>" target="<?= get_field('instagram')['target'] ?>"><?= get_field('instagram')['title'] ?></a> </td> </tr> </tbody> </table> |
<table> <thead> <tr class="first"> <th><?php the_field('bir_date_title'); ?></th> <th><?php the_field('bir_date'); ?></th> </tr> </thead> <tbody> <tr class="second"> <td><?php the_field('age_title'); ?></td> <td><?php the_field('age'); ?></td> </tr> </tbody> <tbody> <tr class="first"> <td><?php the_field('bir_place_title'); ?></td> <td><?php the_field('bir_place'); ?></td> </tr> </tbody> <tbody> <tr class="second"> <td><?php the_field('rost_title'); ?></td> <td><?php the_field('rost'); ?></td> </tr> </tbody> <tbody> <tr class="first"> <td><?php the_field('ves_title'); ?></td> <td><?php the_field('ves'); ?></td> </tr> </tbody> <tbody> <tr class="second"> <td><?php the_field('instagram_title'); ?></td> <td><a href="<?= get_field('instagram')['url'] ?>" target="<?= get_field('instagram')['target'] ?>"><?= get_field('instagram')['title'] ?></a> </td> </tr> </tbody> </table>
Эти поля выводится в конце записи, а мне нужно, чтобы они выводились после первого абзаца в записи. Как это реализовать?
Дополнительно:
Ответы:
1. Самый простой способ, однако, более громоздкий. Если такая ситуация (когда надо вставлять поле acf после абзаца) повторяется регулярно, то можно оставить окно редактора под первый абзац. Далее создать второе окно редактора на странице с помощью того же ACF. Между ними вывести необходимое поле.
2. Если не подходит, то делайте шорткод. Ссылка wp-kama.ru/plugin/acf/shortkod. Правда, шорткод придется постоянно выводить в записи руками.
- 2. Не обязательно руками, можно написать обработчик хука the_content, вставляющий do_shortcode() после первого </p>
-
то можно оставить окно редактора под первый абзац
это как?
то делайте шорткод
я так понимаю шорткод выводит только одно поле, а мне нужно выводить группу полей
- Ponitessa,
это как?
В ACF выбрать в "Тип поля" WYSIWYG редактор и вставить его под the_content в нужном шаблоне.
я так понимаю шорткод выводит только одно поле, а мне нужно выводить группу полей
Используйте обычные шорткоды https://wp-kama.ru/handbook/codex/shortcodes
Дмитрий выше предложил хорошее решение, тоже первым делом подумал о шорткоде.
Но можно решить задачу с другой стороны. Вы можете отключить основной редактор (если это не гутенберг, а классический TinyMCE) или просто не использовать его содержимое.
Вместо контента, добавьте еще 2 поля типа WYSIWYG в вашей группе полей. Например text_before для абзаца перед таблицей и text_after для остального содержимого.
Тогда у вас получится следующих код:
<?php the_field('text_before'); ?> <table> <thead> <tr class="first"> <th><?php the_field('bir_date_title'); ?></th> <th><?php the_field('bir_date'); ?></th> </tr> </thead> <tbody> <tr class="second"> <td><?php the_field('age_title'); ?></td> <td><?php the_field('age'); ?></td> </tr> </tbody> <tbody> <tr class="first"> <td><?php the_field('bir_place_title'); ?></td> <td><?php the_field('bir_place'); ?></td> </tr> </tbody> <tbody> <tr class="second"> <td><?php the_field('rost_title'); ?></td> <td><?php the_field('rost'); ?></td> </tr> </tbody> <tbody> <tr class="first"> <td><?php the_field('ves_title'); ?></td> <td><?php the_field('ves'); ?></td> </tr> </tbody> <tbody> <tr class="second"> <td><?php the_field('instagram_title'); ?></td> <td><a href="<?= get_field('instagram')['url'] ?>" target="<?= get_field('instagram')['target'] ?>"><?= get_field('instagram')['title'] ?></a> </td> </tr> </tbody> </table> <?php the_field('text_after); ?> |
<?php the_field('text_before'); ?> <table> <thead> <tr class="first"> <th><?php the_field('bir_date_title'); ?></th> <th><?php the_field('bir_date'); ?></th> </tr> </thead> <tbody> <tr class="second"> <td><?php the_field('age_title'); ?></td> <td><?php the_field('age'); ?></td> </tr> </tbody> <tbody> <tr class="first"> <td><?php the_field('bir_place_title'); ?></td> <td><?php the_field('bir_place'); ?></td> </tr> </tbody> <tbody> <tr class="second"> <td><?php the_field('rost_title'); ?></td> <td><?php the_field('rost'); ?></td> </tr> </tbody> <tbody> <tr class="first"> <td><?php the_field('ves_title'); ?></td> <td><?php the_field('ves'); ?></td> </tr> </tbody> <tbody> <tr class="second"> <td><?php the_field('instagram_title'); ?></td> <td><a href="<?= get_field('instagram')['url'] ?>" target="<?= get_field('instagram')['target'] ?>"><?= get_field('instagram')['title'] ?></a> </td> </tr> </tbody> </table> <?php the_field('text_after); ?>
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Чтобы вставить блок ACF после первого абзаца, не нужно вручную вставлять таблицу в
single.phpв фиксированном месте. Лучше фильтроватьthe_content: получить HTML основного контента, найти конец первого абзаца и вставить туда сгенерированный блок с полями ACF.Пример:
add_filter('the_content', function ($content) { if (!is_singular('post') || !in_the_loop() || !is_main_query()) { return $content; } $block = my_acf_info_block(get_the_ID()); if (!$block) { return $content; } $pos = strpos($content, '</p>'); if ($pos === false) { return $block . $content; } return substr_replace($content, '</p>' . $block, $pos, 4); }); function my_acf_info_block($post_id) { $date_title = get_field('bir_date_title', $post_id); $date = get_field('bir_date', $post_id); if (!$date_title && !$date) { return ''; } ob_start(); ?> <table class="acf-info-table"> <tr> <th><?php echo esc_html($date_title); ?></th> <td><?php echo esc_html($date); ?></td> </tr> </table> <?php return ob_get_clean(); }
Так блок будет вставляться автоматически после первого абзаца только в нужных записях. Если полей много, лучше не писать длинную таблицу прямо в фильтре, а вынести разметку в отдельный template part. И обязательно экранируйте значения ACF: текст через
esc_html(), URL черезesc_url(), HTML черезwp_kses_post().Если в первом абзаце есть изображения, шорткоды или блоки Gutenberg, простой поиск
</p>может вставить таблицу не туда. Для более точной логики можно использовать DOMDocument или разбирать блоки Gutenberg черезparse_blocks(). Но для обычного классического текста фильтрthe_contentпосле первого закрывающего абзаца работает нормально.Не забывайте, что код в
single.phpсработает только в одном шаблоне. Если записи выводятся через другой шаблон темы или page builder, блок может не появиться. Фильтрthe_contentуниверсальнее, потому что срабатывает там, где выводится основной контент записи. Если нужно ограничить конкретную рубрику или тип записи, добавьте проверкуhas_category()илиis_singular('your_cpt').