Как вывести атрибут alt?

Ссылка скопирована
PHP
1 ответ

Есть плагин который выводит картинку после успешной отправки формы, но почему-то выводит без атрибута 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? Спасибо за помошь

Дополнительно

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Редакция по БД Ответ

В вашем фрагменте 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();
}

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'));

$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',
));

$image_id = 123; echo wp_get_attachment_image($image_id, 'full', false, array( 'class' => 'thankyou-image', ));

Если нужен осмысленный alt, заполняйте его в медиабиблиотеке или берите из отдельного поля. Подставлять один и тот же текст вроде спасибо для всех изображений можно только как запасной вариант. Для декоративной картинки допустим пустой alt, но тогда он должен присутствовать как alt пустая строка, а не отсутствовать совсем.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно