Почему шорткод в поле ACF преобразуется в HTML-тег?

Здравствуйте! <br/> На сайте у меня есть поле ACF, в которое я планирую добавить текст и изображение. Изображение выводится с помощью шорткода: [image id="1"]. <br/> Однако после сохранения страницы шорткод автоматически преобразуется в HTML-тег. <br/> <br/> Например, если я вводлю: [image id="1"], после обновления страницы в поле отображается: <br/> <pre><code class="html">&lt;img class="img-fluid" loading="lazy" src ="https://test.ru/wp-content/uploads/2023/03/summer-service.jpeg" srcset="https://test.ru/wp-content/uploads/2023/03/summer-service.jpeg 719w, https://test.ru/wp-content/uploads/2023/03/summer-service-216x300.jpeg 216w" sizes="(max-width: 719px) 100vw, 719px" alt="Сотрудник "/&gt;</code></pre> <br/> <br/> Я уже проверил несколько моментов: <br/> 1. Поле сохраняется корректно, если рядом с шорткодом добавить любой текст, он остается после сохранения. <br/> 2. Вывод поля через pre возвращает текст и уже сгенерированное изображение. <br/> 3. Поле ACF используется как текстовая область (не редактор). <br/> <br/> Мне нужно, чтобы шорткод оставался в поле без преобразования в тег. <br/> Вот что я пробовал: <br/> <pre><code class="php">if (!empty($more_advantages)):
	echo do_shortcode($more_advantages); // Преобразует шорткод в HTML
endif;</code></pre> <br/> <br/> <pre><code class="php">add_filter( 'acf/shortcode/allow_unsafe_html', '__return_true' );
add_filter( 'acf/the_field/allow_unsafe_html', '__return_true' );</code></pre> <br/> <br/> Также протестировал следующее: <br/> <pre><code class="php">add_filter('acf/update_value/name=your_field_name', 'save_shortcode_as_text', 10, 3);

function save_shortcode_as_text($value, $post_id, $field) {
    return esc_textarea($value); // экранирует значение чтобы сохранить текстом, без выполнения
}</code></pre>
  • 18 декабря 2024 г. 11:43
Ответы на вопрос 2
Проблема, с которой вы столкнулись, заключается в том, что поле ACF по умолчанию обрабатывает введенные шорткоды, и при сохранении значение шорткода преобразуется в соответствующий HTML-тег. Вот несколько способов, как можно изменить поведение и сохранить шорткод как текст:

### 1. Использование фильтра для сохранения шорткода как текста
Вы можете создать пользовательский фильтр для сохранения значения шорткода как текста. Попробуйте изменить код следующим образом:

```php
add_filter('acf/update_value/name=your_field_name', 'save_shortcode_as_text', 10, 3);

function save_shortcode_as_text($value, $post_id, $field) {
    // Удаляем выполнение шорткодов перед сохранением
    return htmlspecialchars($value); // экранирует специальные символы для сохранения как текст
}
```

### 2. Использование поля типа «Текст» вместо «Текстовая область»
Если вы используете поле типа «Текст», убедитесь, что используете его правильно. Поля типа «Текстовая область» по умолчанию могут обрабатывать контент иначе. Попробуйте использовать стандартное текстовое поле, чтобы избежать автоматического преобразования шорткодов в HTML.

### 3. Настройка фильтров ACF
Проверьте наличие других фильтров или действий, которые могут влиять на сохранение или отображение поля в ACF:

```php
add_filter('acf/format_value/name=your_field_name', 'format_shortcode_as_text', 10, 3);

function format_shortcode_as_text($value, $post_id, $field) {
    return htmlspecialchars($value); // выводим как текст
}
```

### 4. Использование `wp_unslash()`
Если проблема сохраняется, попробуйте воспользоваться функцией `wp_unslash()`, чтобы убедиться, что значение корректно сохраняется:

```php
add_filter('acf/update_value/name=your_field_name', 'save_shortcode_as_text', 10, 3);

function save_shortcode_as_text($value, $post_id, $field) {
    return wp_unslash($value); // предотвращает автоматическое выполнение шорткодов
}
```

### Заключение
Попробуйте разные подходы, описанные выше, и посмотрите, какой из них лучше всего работает для вашей ситуации. Если проблема сохраняется, проверьте наличие других плагинов или настроек на сайте, которые могут влиять на обработку шорткодов.
Нужно обработать значение поля ACF через соответствующий фильтр. Вместо esc_textarea использовать htmlspecialchars 

add_filter('acf/update_value/name=your_field_name', 'save_shortcode_as_text', 10, 3);
function save_shortcode_as_text($value, $post_id, $field) {
    return htmlspecialchars($value, ENT_QUOTES);
}


При выводе значения
if (!empty($more_advantages)):
    echo htmlspecialchars_decode($more_advantages, ENT_QUOTES);
endif;


Функция htmlspecialchars_decode() используется для декодирования строк, которые были закодированы с помощью htmlspecialchars(). Она возвращает строку, в которой HTML-сущности, преобразуются обратно в их оригинальные символы.
Похожие вопросы