Как программно добавить изображение к записи?

30 дек. 2018 г., 20:43:27
Просмотры: 14K
Голосов: 2

Я работаю над переносом своих старых блогов с NucleusCMS на WordPress. Я создал набор таблиц локально и начал процесс конвертации. До момента с "конвертацией" изображений все шло хорошо. Думаю, я могу извлечь старое изображение и добавить его в медиатеку, используя этот ответ. Но дальше я немного теряюсь.

Мне нужно: после программного добавления медиафайла (изображения) программно же вставить это изображение в конкретную запись с указанием размеров и alt-текста, которые я извлекаю (через регулярные выражения) из исходного кода.

Шаг 1. Получить указатель или ID только что добавленного медиафайла

Я не полностью понимаю механику работы WordPress, поэтому не знаю, как получить доступ к только что добавленному изображению.

Шаг 2. Сделать это изображение частью записи

А также понять, как вставить его в запись (в нужном размере) в том формате, который WordPress использует по умолчанию...

Мне нужна помощь с обоими шагами.

4
Комментарии

Пока что я понял, что WordPress называет это "sideloading", но есть несколько похожих функций, так что мне все еще нужна помощь.

Matthew Brown aka Lord Matt Matthew Brown aka Lord Matt
6 мая 2019 г. 04:02:10

Ты смог разобраться, как это реализовать? Если нет, я бы хотел помочь тебе с этой проблемой. :)

BlueSuiter BlueSuiter
13 июн. 2019 г. 10:19:45

Сейчас я в полном тупике. Программная работа с постами для меня совершенно новая. Пожалуйста, не стесняйся - мне нужна любая помощь.

Matthew Brown aka Lord Matt Matthew Brown aka Lord Matt
13 июн. 2019 г. 10:33:31

Мне нужно посмотреть ваш код, который вы пишете. Вы можете предоставить доступ к нему?

BlueSuiter BlueSuiter
13 июн. 2019 г. 12:28:25
Все ответы на вопрос 2
0

Привет, я использовал этот код для похожей задачи (я также загружал удалённое изображение на сайт 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);
    }
}
13 июн. 2019 г. 14:43:02
0

Развивая принятый ответ на связанный вопрос, я думаю, что что-то подобное может сработать.

Итак, вкратце:

  1. получить существующее содержимое записи с помощью get_post_field
  2. загрузить изображение с помощью wp_insert_attachment, что даст вам ID изображения
  3. каким-то образом извлечь размер изображения и alt из содержимого записи
  4. позволить WordPress сгенерировать разметку для изображения с помощью wp_get_attachment_image
  5. заменить старый плейсхолдер изображения на новую HTML-разметку
  6. когда все плейсхолдеры изображений будут заменены на теги 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 );

РЕДАКТИРОВАТЬ Это должно работать, возможно, с небольшими доработками, по крайней мере, с Классическим редактором. Я не уверен насчёт Гутенберга, так как мало с ним работал.

13 июн. 2019 г. 14:07:41