- Вопрос или проблема
- Ответ или решение
- Как извлечь первое изображение с внешней страницы и установить его в качестве изображения записи на WordPress
- Шаг 1: Создание формы для сбора URL
- Шаг 2: Получение HTML контента страницы
- Шаг 3: Извлечение первого изображения
- Шаг 4: Загрузка изображения в медиа-библотеку WordPress
- Заключение
Вопрос или проблема
Я ищу способ извлечь первую/лучшую/крупнейшую картинку с внешней страницы и вставить копию этой картинки в качестве изображения записи на моем сайте 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, что сделает их опыт использования более интерактивным и ценным.