Соскребите внешнюю веб-страницу для получения первого изображения и добавьте его в новый пост.

Вопрос или проблема

Я ищу способ извлечь первую/лучшую/крупнейшую картинку с внешней страницы и вставить копию этой картинки в качестве изображения записи на моем сайте WordPress.

Я надеялся, что это будет работать так: пользователь моего сайта вводит URL внешней веб-страницы в форму, и она извлекает эту страницу на предмет первой/лучшей/крупнейшей картинки и устанавливает ее в качестве изображения записи, которая затем будет опубликована после отправки формы. У меня настроена отправка записей на фронт-энде с помощью Gravity Forms, что позволяет пользователям моего сайта создавать новые записи, но я запутался с частью веб-скрапинга на бэкенде.

Можно ли добиться этого в WordPress? Может быть, используя HTTP API? Я не программист, так что HTTP API немного пугает меня. Я надеюсь, что кто-то из вас с большим опытом программирования и знакомством с WordPress сможет помочь.

Это возможно, как упоминалось здесь

но вы говорите о значительной настройке плагина Gravity Forms, и, как вы сами сказали, вы не программист, так что лучше открыть заявку на поддержку в их форумах, и они, возможно, смогут помочь.

Также посмотрите этот код, который может помочь вам, если вы решите сделать это самостоятельно

    $upload_dir = wp_upload_dir();
$image_data = file_get_contents($image_url);
$filename = basename($image_url);
if(wp_mkdir_p($upload_dir['path']))
    $file = $upload_dir['path'] . "https://wordpress.stackexchange.com/" . $filename;
else
    $file = $upload_dir['basedir'] . "https://wordpress.stackexchange.com/" . $filename;
file_put_contents($file, $image_data);

$wp_filetype = wp_check_filetype($filename, null );
$attachment = array(
    'post_mime_type' => $wp_filetype['type'],
    'post_title' => sanitize_file_name($filename),
    'post_content' => '',
    'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment( $attachment, $file, $post_id );
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attach_data = wp_generate_attachment_metadata( $attach_id, $file );
wp_update_attachment_metadata( $attach_id, $attach_data );

set_post_thumbnail( $post_id, $attach_id );

$image_url – это то, что вы получите от ввода/загрузки пользователя.

Ответ или решение

Как извлечь первое изображение с внешней страницы и установить его в качестве изображения записи на WordPress

Ваша задача заключается в извлечении первого изображения с указанного пользователем URL и установки его в качестве "особого" изображения (featured image) новой записи на вашем сайте WordPress. Это можно сделать с использованием HTTP API WordPress и необходимых методов для обработки изображений. Ниже приведены подробные шаги, как этот процесс может быть организован.

Шаг 1: Создание формы для сбора URL

Используя Gravity Forms, создайте форму, которая позволяет пользователям вводить URL-адрес внешней страницы. Настройте форму так, чтобы по ее отправке запускался обработчик на стороне сервера.

Шаг 2: Получение HTML контента страницы

В обработчике формы, который выполнится после отправки, можно использовать следующий код для получения содержимого внешней страницы:

$url = $_POST['external_url']; // Получаем URL из пользовательского ввода
$response = wp_remote_get($url); // Используем HTTP API для получения данных

if (is_wp_error($response)) {
    // Обработка ошибок
    return;
}

$html = wp_remote_retrieve_body($response); // Получаем тело ответа

Шаг 3: Извлечение первого изображения

С помощью библиотеки DOMDocument можно легко проанализировать HTML и извлечь изображения. Для этого добавьте следующий код:

libxml_use_internal_errors(true); // Убираем предупреждения
$dom = new DOMDocument();
$dom->loadHTML($html);
$images = $dom->getElementsByTagName('img');

if ($images->length > 0) {
    $first_image_url = $images->item(0)->getAttribute('src'); // Получаем URL первого изображения
}

Шаг 4: Загрузка изображения в медиа-библотеку WordPress

Теперь, когда у вас есть URL первого изображения, вы можете загрузить его в медиа-библотеку и установить как "особое" изображение записи:

function set_featured_image_from_url($image_url, $post_id) {
    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($image_url);
    $filename = basename($image_url);

    if (wp_mkdir_p($upload_dir['path'])) {
        $file = $upload_dir['path'] . '/' . $filename;
    } else {
        $file = $upload_dir['basedir'] . '/' . $filename;
    }

    file_put_contents($file, $image_data);

    $wp_filetype = wp_check_filetype($filename, null);
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name($filename),
        'post_content' => '',
        'post_status' => 'inherit',
    );
    $attach_id = wp_insert_attachment($attachment, $file, $post_id);
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata($attach_id, $file);
    wp_update_attachment_metadata($attach_id, $attach_data);

    set_post_thumbnail($post_id, $attach_id); // Устанавливаем изображение записи
}

// Вызов функции с нужными параметрами
$post_id = wp_insert_post(array(
    'post_title' => 'Название вашей записи',
    'post_content' => 'Содержимое вашей записи',
    'post_status' => 'publish',
));
set_featured_image_from_url($first_image_url, $post_id);

Заключение

Теперь, когда парадигма реализации описана, важно помнить, что вся работа с внешними ресурсами должна быть осуществлена с соблюдением авторских прав. Также isсте следует учитывать возможность появления ошибок (например, если изображение недоступно) и соответствующим образом обрабатывать эти ситуации. В конечном итоге, благодаря вышеописанному процессу, пользователи смогут добавлять «особые» изображения из внешних источников за пределами вашего сайта WordPress, что сделает их опыт использования более интерактивным и ценным.

Оцените материал
Добавить комментарий

Капча загружается...