Я пытаюсь извлечь тег 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 . ', ';
}






Рассмотрите возможность использования 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:
Download images hosted elsewhere должен быть выбран и содержать список источников:Enter image URL one per line, or separate them with a должно быть пустым.[get_img_attrs_from_html({content_encoded[1]},"src")]
Scan through post content and import images wrapped in <img> tags должен быть включен.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=bXkgYXdlc29tZSBzdHJpbmczNTA…
Спасибо, теперь ваш вариант использования стал намного понятнее. Я обновил ответ. Также я отредактировал и запустил ваш feed (ID: 2) в песочнице, которая обновила сообщения и заполнила alt. Это можно проверить в «Медиатеке» и на отдельных страницах публикаций.
Очень ценю, что @hedfol работает на живом сайте просто великолепно!
Похоже, что тег
<img>на самом деле заключен в раздел CDATA, поэтому с точки зрения XML это просто текст, и методfind()с ним не работает. Я думаю, что для этого вам нужно будет получить содержимое CDATA элемента<description>и повторно проанализировать его как XML/HTML, а затем вызватьfind()для этого.