Как программно добавить изображение к записи?
Я работаю над переносом своих старых блогов с NucleusCMS на WordPress. Я создал набор таблиц локально и начал процесс конвертации. До момента с "конвертацией" изображений все шло хорошо. Думаю, я могу извлечь старое изображение и добавить его в медиатеку, используя этот ответ. Но дальше я немного теряюсь.
Мне нужно: после программного добавления медиафайла (изображения) программно же вставить это изображение в конкретную запись с указанием размеров и alt-текста, которые я извлекаю (через регулярные выражения) из исходного кода.
Шаг 1. Получить указатель или ID только что добавленного медиафайла
Я не полностью понимаю механику работы WordPress, поэтому не знаю, как получить доступ к только что добавленному изображению.
Шаг 2. Сделать это изображение частью записи
А также понять, как вставить его в запись (в нужном размере) в том формате, который WordPress использует по умолчанию...
Мне нужна помощь с обоими шагами.

Привет, я использовал этот код для похожей задачи (я также загружал удалённое изображение на сайт WordPress). Взгляни:
$image_url = $value; // Это очищенный URL изображения.
$image = pathinfo($image_url); // Извлекаем информацию в массив.
$image_name = $image['basename'];
$upload_dir = wp_upload_dir();
$image_data = file_get_contents($image_url);
$unique_file_name = wp_unique_filename($upload_dir['path'], $image_name);
$filename = basename($unique_file_name);
$postarr = array(
'post_title' => $post_title,
'post_content' => $post_content,
'post_type' => 'post', // или любой другой слаг типа записи.
'post_status' => 'publish',
'meta_input' => array(
// Если есть метаданные, они будут здесь.
),
);
$insert_id = wp_insert_post($postarr, true);
if (!is_wp_error($insert_id)) {
if ($image != '') {
// Проверяем разрешения папки и определяем расположение файла
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, $insert_id);
// Подключаем image.php
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);
// И наконец, назначаем изображение записи как миниатюру
$thumbnail = set_post_thumbnail($insert_id, $attach_id);
}
}

Развивая принятый ответ на связанный вопрос, я думаю, что что-то подобное может сработать.
Итак, вкратце:
- получить существующее содержимое записи с помощью
get_post_field
- загрузить изображение с помощью
wp_insert_attachment
, что даст вам ID изображения - каким-то образом извлечь размер изображения и alt из содержимого записи
- позволить WordPress сгенерировать разметку для изображения с помощью
wp_get_attachment_image
- заменить старый плейсхолдер изображения на новую HTML-разметку
- когда все плейсхолдеры изображений будут заменены на теги img, сохранить изменённое содержимое записи в БД с помощью
wp_update_post
Опционально установить любое из изображений как миниатюру записи / featured image с помощью set_post_thumbnail
.
$post_id = 1234;
$images = array('filename1.png', 'filename2.png', ... 'filename10.png');
// Получаем содержимое записи
$post_content = get_post_field( 'post_content', $post_id );
// Получаем путь к директории загрузок
$wp_upload_dir = wp_upload_dir();
foreach($images as $name) {
$attachment = array(
'guid'=> $wp_upload_dir['url'] . '/' . basename( $name ),
'post_mime_type' => 'image/png',
'post_title' => 'my description',
'post_content' => 'my description',
'post_status' => 'inherit'
);
/**
* ШАГ 1
* добавляем изображения как вложения в WordPress
*/
$image_id = wp_insert_attachment($attachment, $name, $post_id);
// Убедитесь, что этот файл подключен, так как wp_generate_attachment_metadata() зависит от него.
require_once( ABSPATH . 'wp-admin/includes/image.php' );
// Генерируем метаданные для вложения и обновляем запись в базе данных.
$attach_data = wp_generate_attachment_metadata( $image_id, $name );
wp_update_attachment_metadata( $image_id, $attach_data );
/**
* ШАГ 2
* Извлекаем данные изображения из $post_content
*/
// возможно, strpos() + substr()?
$width = 123;
$height = 123;
$alt = 'Привет';
/**
* ШАГ 3
* получаем HTML-разметку для изображения
*/
// Позволяем WP сгенерировать HTML-разметку для изображения, регулируем размер по необходимости (thumbnail,medium,large,full,array(width,height))
$image_html = wp_get_attachment_image( $image_id, array( $width, $height ), false, array( 'alt' => $alt ) );
/**
* ШАГ 4
* Заменяем плейсхолдеры в содержимом на img-разметку
*/
preg_replace( $pattern, $image_html, $post_content ) // Я не очень хорошо разбираюсь в регулярных выражениях, чтобы привести пример, так что вам нужно разобраться с этим самостоятельно
/**
* ОПЦИОНАЛЬНО
* устанавливаем изображение как featured
*/
if ( $name === 'example' ) {
set_post_thumbnail( $post_id, $image_id );
}
}
/**
* ШАГ 5
* Обновляем содержимое записи
*/
$post_with_imported_images = array(
'ID' => $post_id,
'post_content' => $post_content,
);
wp_update_post( $post_with_imported_images );
РЕДАКТИРОВАТЬ Это должно работать, возможно, с небольшими доработками, по крайней мере, с Классическим редактором. Я не уверен насчёт Гутенберга, так как мало с ним работал.
