Извлечение и замена HTML-контента с помощью PHP DOMPhp

Кемеровские программисты php общаются здесь
Ответить
Гость
 Извлечение и замена HTML-контента с помощью PHP DOM

Сообщение Гость »


Я работаю над обновлением/заменой определенных данных в сообщениях блога WordPress (более 1000) из двух категорий, из которых мне нужно извлечь определенный HTML-контент из двух тегов p и заменить один из тегов p новым контентом. Я пытаюсь настроить таргетинг на определенные элементы HTML, такие как ссылка/изображение и цена/цена со скидкой. Любая помощь будет очень приветствоваться.

Я пытаюсь извлечь скидку и первоначальную цену из этого элемента. Из другой категории цена со скидкой для этого элемента заключена в теги del.

117 евро вместо 296 евро

117 евро вместо 296 евро

Также я пытаюсь извлечь URL-адрес и ссылку на изображение из этого элемента и заменить их новой структурой HTML.

Перейдите по адресу:
Изображение


Новая структура замены для второго элемента HTML:

Это моя попытка добиться желаемого результата, однако по какой-то причине первые 6, 7 постов заменяются правильно, а затем остальные посты заменяются, но ломаются. Содержание в каждом посте одинаковое, за исключением цен... Я пробовал с датой и Tax_query и без них, результат был тот же. Я не очень хорошо разбираюсь в шаблонах регулярных выражений и не уверен, что это или что вызывает такое поведение.

$args = [ 'post_type' => 'сообщение', 'posts_per_page' => предел $, 'смещение' => $смещение, 'date_query' => [['after' => '1 месяц назад']], 'tax_query' => [[ 'отношение' => 'ИЛИ', [ 'таксономия' => 'категория', 'поле' => 'ссылка', 'термины' => ['категория-1', 'категория-2']], ]], ]; $query = новый WP_Query($args); если ($query->have_posts()) { $processed_posts = 0; while ($query->have_posts()) { $query->the_post(); $post_id = get_the_ID(); $post_content = get_post_field('post_content', $post_id); $dom = новый DOMDocument(); @$dom->loadHTML(mb_convert_encoding($post_content, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $xpath = новый DOMXPath($dom); error_log("Обработка идентификатора сообщения: " . $post_id); $oldStructure = $xpath->query("//a[contains(text(), 'Go to:') и @target='_blank' и @rel='nofollow спонсируемый noopener']")->item(0 ); error_log("Результат запроса XPath для идентификатора сообщения: " . $post_id . ": " . ($oldStructure ? «Найдено» : «Не найдено»); если ($oldStructure) { error_log("Найдена старая структура!"); $productUrlNode = $xpath->query('//a[@style="font-size: 26px;text-decoration: none"]/@href')->item(0); $productUrl = $productUrlNode? $productUrlNode->nodeValue: ''; $imageSrcNode = $xpath->query('//p/a[@style="font-size: 26px;text-decoration: none"]/img/@src')->item(0); $imageSrc = $imageSrcNode? $imageSrcNode->nodeValue: ''; $discountPriceNodeQuery = "//p/span/a/del/text() | //p/span/a[not(del)]/text()"; $discountPriceNodes = $xpath->query($discountPriceNodeQuery); $discountPrice = ''; foreach ($discountPriceNodes как $node) { $textContent = $node->nodeValue; if (preg_match('/(\d+)/', $textContent, $matches)) { $discountPrice = $matches[1]; перерыв; } } $originalPrice = ''; $pNodeTexts = $xpath->query("//p[contains(., 'вместо')]"); foreach ($pNodeTexts как $textNode) { if (preg_match('/вместо (\d+)/', $textNode->nodeValue, $matches)) { $originalPrice = $matches[1]; перерыв; } } $pElement = $dom->createElement('p'); $anchor = $dom->createElement('a'); $anchor->setAttribute('href', esc_url($productUrl)); $anchor->setAttribute('class', 'product-link_wrap'); $anchor->setAttribute('target', '_blank'); $buttonBlock = $dom->createElement('div'); $buttonBlock->setAttribute('класс', 'кнопочный блок'); $anchor->appendChild($buttonBlock); $buttonImage = $dom->createElement('div'); $buttonImage->setAttribute('класс', 'изображение кнопки'); $img = $dom->createElement('img'); $img->setAttribute('src', esc_url($imageSrc)); $img->setAttribute('alt', 'Изображение продукта'); $img->setAttribute('класс', 'обработано webpexpress'); $buttonImage->appendChild($img); $buttonBlock->appendChild($buttonImage); $productTitle = $dom->createElement('div'); $productTitle->setAttribute('класс', 'название продукта'); $productName = $dom->createElement('span', esc_html(get_the_title($post_id))); $productName->setAttribute('класс', 'имя-продукта'); $productTitle->appendChild($productName); $buttonBlock->appendChild($productTitle); $productPrices = $dom->createElement('div'); $productPrices->setAttribute('класс', 'цены-контейнер'); $productOriginalPrice = $dom->createElement('span', esc_html($originalPrice)); $productDiscountPrice = $dom->createElement('span', esc_html($discountPrice)); $productPrices->appendChild($productOriginalPrice); $productPrices->appendChild($productDiscountPrice); $buttonBlock->appendChild($productPrices); $buttonContainer = $dom->createElement('div'); $buttonContainer->setAttribute('класс', 'кнопка-контейнер'); $button = $dom->createElement('кнопка'); $button->setAttribute('класс', 'кнопка продукта'); $span = $dom->createElement('span', 'Перейти к продукту'); $button->appendChild($span); $svg = $dom->createElement('svg'); $svg->setAttribute('xmlns', 'http://www.w3.org/2000/svg'); $svg->setAttribute('enable-background', 'new 0 0 24 24'); $svg->setAttribute('viewBox', '0 0 24 24'); $path = $dom->createElement('path'); $path->setAttribute('d', 'M15.5,11.3L9.9,5.6c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l4.9,4.9l-4.9 ,4.9c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.6,0.4,1,1,1c0.3,0,0.5-0.1,0.7-0.3l5.7-5.7c0,0,0,0 ,0,0C15.9,12.3,15.9,11.7,15.5,11.3z'); $svg->appendChild($path); $button->appendChild($svg); $buttonContainer->appendChild($button); $buttonBlock->appendChild($buttonContainer); $pElement->appendChild($anchor); $oldStructure->parentNode->replaceChild($anchor, $oldStructure); $updated_content = $dom->saveHTML(); error_log("Новый контент: " . $updated_content); $result = wp_update_post([ 'ID' => $post_id, 'post_content' => $updated_content, ]); if ($result === 0 || $result === false) { error_log("Не удалось обновить идентификатор сообщения: " . $post_id); } еще { error_log("Идентификатор сообщения успешно обновлен: " . $post_id); } Это правильно замененный элемент:

[29 февраля 2024 г., 11:26:21 UTC] Идентификатор сообщения при обработке: 56526 [29 февраля 2024, 11:26:21 UTC] Результат запроса XPath для идентификатора сообщения: 56526: Найдено [29-Фев-2024 11:26:21 UTC] Найдена старая структура! [29 февраля 2024 г., 11:26:21 UTC] Изображение: https://dev.website.com/wp-content/uplo ... /image.png [29 февраля 2024 г., 11:26:21 UTC] URL: https://dev.website.com/urll [29-Фев-2024 11:26:21 UTC] скидка: 12 [29 февраля 2024, 11:26:21 UTC] оригинал: 133 Неправильно замененный элемент:

[29 февраля 2024 г., 11:26:21 UTC] Обработка идентификатора сообщения: 56510 [29 февраля 2024 г., 11:26:21 UTC] Результат запроса XPath для идентификатора сообщения: 56510: Найдено [29-Фев-2024 11:26:21 UTC] Найдена старая структура! [29 февраля 2024 г., 11:26:21 UTC] Изображение: [29 февраля 2024 г., 11:26:21 UTC] URL: [29-Фев-2024 11:26:21 UTC] скидка: [29 февраля 2024, 11:26:21 UTC] оригинал: 340 Я полагаю, что неправильно замененный элемент лишается тега p и, следовательно, приводит к его поломке...
28 евро вместо 340 евро
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»