Тег ALT в WP: весь импорт с использованием функции PHP

Я пытаюсь извлечь тег alt из изображения из узла xml под названием <description>. Вот содержимое узла <img src = "xxx.png" alt = "WHAT I WANT TO GRAB">. Я попытался создать функцию php для ее извлечения, но она не работает. Где я ошибаюсь? Для справки, вот XML-фид .

Что я использую для установки тега Alt при импорте:

[get_alt_tags_from_xml({description[1]})]

Что я использую для функции:

function get_alt_tags_from_xml($content) {
    //The content
    $html = file_get_html($content);
    //Run on all images
    foreach($html->find('img') as $element)
    echo $element->alt . ', ';
    }

Похоже, что тег <img> на самом деле заключен в раздел CDATA, поэтому с точки зрения XML это просто текст, и метод find() с ним не работает. Я думаю, что для этого вам нужно будет получить содержимое CDATA элемента <description> и повторно проанализировать его как XML/HTML, а затем вызвать find() для этого.

Chris Haas 22.03.2024 18:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функция

Рассмотрите возможность использования DOMDocument и DOMXPath. Загрузите HTML и найдите теги img с помощью XPath, затем извлеките все атрибуты. Для объединения значений лучше использовать PHP_EOL вместо , .

Функция должна поддерживать извлечение атрибутов src и alt, чтобы иметь возможность предоставить два списка одинакового размера, представляющие изображения. WP All Import будет использовать эту информацию в качестве источника данных изображения и для альтернативного заполнения текстовых полей.

function get_img_attrs_from_html( $content, $attribute_name ) {
    if ( empty( $content ) || empty( $attribute_name ) ) {
        return '';
    }
    $dom = new DOMDocument;
    @$dom->loadHTML( $content );

    $dxp = new DOMXPath( $dom );
    $images = $dxp->query( '//img' );

    $values = array_map( function( $img ) use ( $attribute_name ) {
        return trim( $img->getAttribute( $attribute_name ) );
    }, iterator_to_array( $images ) );

    return join( PHP_EOL, $values );
}

Шаблон

Предпочтителен узел элемента content_encoded из ленты Simplifyingthemarket, поскольку он содержит больше изображений, чем тег description.

В разделе Images на странице редактирования шаблона WP All Import:

  1. Download images hosted elsewhere должен быть выбран и содержать список источников:
  • Enter image URL one per line, or separate them with a должно быть пустым.
  • Значение для основного входа:
[get_img_attrs_from_html({content_encoded[1]},"src")]
  1. Scan through post content and import images wrapped in <img> tags должен быть включен.
  2. SEO & Advanced Options -> Set Alt Text(s) следует выбрать и предоставить альтернативный текстовый список:
  • Enter one per line, or separate them with a должно быть пустым.
  • Основное входное значение:
[get_img_attrs_from_html({content_encoded[1]},"alt")]

После сохранения этих настроек можно начать импорт.

Тест

Функцию извлечения атрибутов можно протестировать вне импорта:

$item = <<<XML
<item><content_encoded><![CDATA[
text
<img src = "x.png" alt = "WHAT I WANT TO GRAB">
<p>
    <img src = "no-alt.png">
    <strong>tag</strong>
    <img src = "y.png" alt = "ANOTHER, AN ATTRIBUTE, SHOULD BE GRABBED">
</p>
]]></content_encoded></item>
XML;
$idom = new DOMDocument;
@$idom->loadXML( $item );
$cnode = ( new DOMXPath( $idom ) )->query( '//content_encoded' );
$content = $cnode->item( 0 )->textContent;

echo get_img_attrs_from_html( $content, 'src' ) . PHP_EOL;
echo get_img_attrs_from_html( $content, 'alt' ). PHP_EOL;
x.png
no-alt.png
y.png
WHAT I WANT TO GRAB

ANOTHER, AN ATTRIBUTE, SHOULD BE GRABBED

Спасибо @hedfol за подробный ответ. К сожалению, я до сих пор не вижу ожидаемых результатов. Изображения в медиатеке (и в публикациях) не имеют alt-тега. Я создал здесь песочницу, и вы можете видеть, что она не работает. nimble-ray-17c83f.instawp.xyz?upass=bXkgYXdlc29tZSBzdHJpbmcz‌​NTA…

Mike Oberdick 22.03.2024 23:05

Спасибо, теперь ваш вариант использования стал намного понятнее. Я обновил ответ. Также я отредактировал и запустил ваш feed (ID: 2) в песочнице, которая обновила сообщения и заполнила alt. Это можно проверить в «Медиатеке» и на отдельных страницах публикаций.

hedfol 23.03.2024 15:29

Очень ценю, что @hedfol работает на живом сайте просто великолепно!

Mike Oberdick 23.03.2024 19:39

Другие вопросы по теме