#javascript #php #wordpress #advanced-custom-fields
#javascript #php #wordpress #дополнительно-пользовательские поля
Вопрос:
Я использую плагин ACF WordPress для создания встроенного поля. Поле принимает URL-адрес из Vimeo и выводит iframe во внешнем интерфейсе.
Обычно я избегаю URL-адресов и атрибутов в своей теме следующим образом:
<a href="<?= esc_url( get_field('link') ); ?>" title="<?= esc_attr( get_field('title') ); ?>">
Когда я пытаюсь выйти из oEmbed, ничего не отображается:
<?= esc_url( get_field('video') ); ?>
Если я протестирую XSS с помощью следующего скрипта, поле ACF полностью прерывается с ошибкой JS.
<script>alert('hello')</script>
Нужно ли мне экранировать это поле? Я предполагаю, что WordPress заботится об экранировании через встроенную функцию?
Комментарии:
1. Чтобы уточнить, когда вы удаляете функцию esc_url(), правильно ли выводится URL-адрес?
2. Да, поле выдает iframe и правильно отображает видео.
Ответ №1:
Из официальной документации:
Поле oEmbed вернет строку, содержащую встроенный HTML.
Даже если входные данные имеют тип URL, при получении значения ACF преобразует его в полный HTML-код для встраивания. В заключение, неправильно вызывать esc_url
этот HTML, вам просто нужно использовать the_field('video')
или echo get_field('video')
.
Что касается ACF, принимающего недопустимые (не URL) данные во входных данных типа oEmbed, вы можете написать пользовательский валидатор для выдачи ошибки, если это необходимо, путем реализации фильтра: acf /validate_value .
Ответ №2:
Вы пробовали использовать the_field() вместо get_field()?
<?= esc_url( the_field('video') ); ?>
oEmbed фактически возвращает больше, чем просто URL, так что это тоже может быть проблемой. Я не работал с esc_url() в прошлом, но это может привести к сбоям, потому что все, что передается, — это не только URL.
Как указано здесь, https://www.advancedcustomfields.com/resources/oembed /, «Поле oEmbed вернет строку, содержащую HTML-код для встраивания».
Комментарии:
1. ! Функция
the_field
повторяет значения, а не возвращает их, такesc_url( the_field('video') )
что это то же самое, чтоthe_field('video'); echo NULL;