Как вывести атрибут alt?
Есть плагин который выводит картинку после успешной отправки формы, но почему-то выводит без атрибута alt
function img_src_replace($message) { $replace_array = array(); preg_match_all('/(?<=src=")(.*?)(?=">)/', $message, $src_array); foreach($src_array[0] as $src) { $message = str_replace($src, str_replace(" ", "+", $src), $message); } return $message; } |
function img_src_replace($message) { $replace_array = array(); preg_match_all('/(?<=src=")(.*?)(?=">)/', $message, $src_array); foreach($src_array[0] as $src) { $message = str_replace($src, str_replace(" ", "+", $src), $message); } return $message; }
<div class='mf-page mf-thankyou' data-index='<?php echo intval($pageIndex) ?>'> <?php echo wp_kses($page->settings->message, array( 'a' => array( 'href' => array(), 'title' => array(), 'target' => array()), 'b' => array(), 'img' => array("src" => array(), "alt" => array()), 'br' => array(), 'em' => array(), 'i' => array(), 'strong' => array(), 'p' => array("class" => array()), 'h1' => array("class" => array()), 'h2' => array("class" => array()), 'h3' => array( "class" => array()), 'h4' => array("class" => array()), 'h5' => array("class" => array()), 'h6' => array("class" => array()), "div" => array("class" => array()), "span" => array("style" => array("color" => array())) ), array("data")); ?> </div> |
<div class='mf-page mf-thankyou' data-index='<?php echo intval($pageIndex) ?>'> <?php echo wp_kses($page->settings->message, array( 'a' => array( 'href' => array(), 'title' => array(), 'target' => array()), 'b' => array(), 'img' => array("src" => array(), "alt" => array()), 'br' => array(), 'em' => array(), 'i' => array(), 'strong' => array(), 'p' => array("class" => array()), 'h1' => array("class" => array()), 'h2' => array("class" => array()), 'h3' => array( "class" => array()), 'h4' => array("class" => array()), 'h5' => array("class" => array()), 'h6' => array("class" => array()), "div" => array("class" => array()), "span" => array("style" => array("color" => array())) ), array("data")); ?> </div>
Как вывести атрибут alt? Спасибо за помошь
Дополнительно
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В вашем фрагменте wp_kses разрешает атрибут alt у img, но wp_kses не создаёт отсутствующие атрибуты. Он только пропускает или вырезает то, что уже есть в HTML. Поэтому если плагин сформировал картинку как img src без alt, разрешение alt в списке allowed HTML ничего не добавит. Добавлять alt нужно до вызова wp_kses: либо в месте, где собирается картинка, либо отдельной функцией, которая проходит по HTML сообщения и дописывает alt к изображениям.
Регулярным выражением разбирать HTML нежелательно: на пробелах, одинарных кавычках, lazyload-атрибутах и другом порядке атрибутов такой код быстро ломается. В современных версиях WordPress удобнее использовать WP_HTML_Tag_Processor. Он корректно находит теги img и позволяет изменить атрибуты без хрупкой замены строк.
function site_add_missing_img_alt($message) { if (! class_exists('WP_HTML_Tag_Processor')) { return $message; } $processor = new WP_HTML_Tag_Processor($message); while ($processor->next_tag('img')) { $current_alt = $processor->get_attribute('alt'); if ($current_alt !== null && $current_alt !== '') { continue; } $src = (string) $processor->get_attribute('src'); $attachment_id = $src ? attachment_url_to_postid($src) : 0; $alt = ''; if ($attachment_id) { $alt = (string) get_post_meta($attachment_id, '_wp_attachment_image_alt', true); if ($alt === '') { $alt = get_the_title($attachment_id); } } if ($alt === '') { $alt = 'Изображение'; } $processor->set_attribute('alt', $alt); } return $processor->get_updated_html(); }
Применять эту функцию нужно перед очисткой HTML:
$message = site_add_missing_img_alt($page->settings->message); echo wp_kses($message, array( 'a' => array( 'href' => true, 'title' => true, 'target' => true, ), 'img' => array( 'src' => true, 'alt' => true, ), 'br' => array(), 'p' => array('class' => true), 'div' => array('class' => true), 'span' => array('style' => true), ), array('http', 'https', 'data'));
Если картинка выводится не из готового HTML, а вы сами знаете ID вложения, лучше вообще не собирать img руками. Используйте wp_get_attachment_image: WordPress сам возьмёт alt из медиабиблиотеки, если он заполнен.
$image_id = 123; echo wp_get_attachment_image($image_id, 'full', false, array( 'class' => 'thankyou-image', ));
Если нужен осмысленный alt, заполняйте его в медиабиблиотеке или берите из отдельного поля. Подставлять один и тот же текст вроде спасибо для всех изображений можно только как запасной вариант. Для декоративной картинки допустим пустой alt, но тогда он должен присутствовать как alt пустая строка, а не отсутствовать совсем.