Значения ACF получают через get_field(), но перед выводом в HTML нужно выбрать экранирование по контексту. Поле «текст» и поле «ссылка» нельзя выводить одинаково: для первого обычно нужен esc_html(), для второго — esc_url().
Подготовка поля
- Установите ACF на тестовом сайте и создайте группу полей для записей или вашего CPT.
- Добавьте текстовое поле
project_subtitleи URL-полеproject_link. - Заполните оба поля в тестовой записи и проверьте фактический формат значения каждого поля.
- Выведите значения в шаблоне темы или в callback собственного блока.
Минимальный пример
<?php
if ( ! function_exists( 'get_field' ) ) {
return;
}
$subtitle = get_field( 'project_subtitle', get_the_ID() );
$link = get_field( 'project_link', get_the_ID() );
if ( is_string( $subtitle ) && $subtitle !== '' ) {
echo '<p class="project-subtitle">' . esc_html( $subtitle ) . '</p>';
}
if ( is_string( $link ) && wp_http_validate_url( $link ) ) {
echo '<a href="' . esc_url( $link ) . '" rel="noopener noreferrer">Сайт проекта</a>';
}
Пример рассчитан на URL-поле, возвращающее строку. Для поля Link ACF может вернуть массив с url, title, target: сначала проверяйте структуру массива и только потом выводите его части.
Если поле содержит форматированный текст
Для WYSIWYG-поля, где разрешена безопасная HTML-разметка, при необходимости используйте wp_kses_post(). Но не применяйте его к произвольному JavaScript, iframe или данным, которым нельзя доверять.
<?php
$details = get_field( 'project_details', get_the_ID() );
if ( is_string( $details ) && $details !== '' ) {
echo wp_kses_post( $details );
}
Что проверить
- Пустое значение не создаёт пустой тег или невалидную ссылку.
- Строки с
<script>не становятся исполняемым кодом. - URL с недопустимым протоколом не отображается как внешняя ссылка.
- Объекты, массивы и числовые значения обрабатываются с учётом типа поля.
- При отключённом ACF страница не падает с fatal error.
Частые ошибки
echo get_field(...)без экранирования.- Вызов
the_field()в месте, где нужен контроль HTML-контекста. - Предположение, что Image/Relationship/Link всегда возвращает строку.
- Использование
sanitize_text_field()как замены экранирования при выводе.
Для каталога дополнений и альтернатив ACF см. плагины ACF.
Источник: https://www.advancedcustomfields.com/resources/get_field/
Материал был полезен?
Помогите нам сделать материалы точнее и понятнее.