WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

wp_insert_attachment() WP 2.0

Добавляет медиафайл (вложение) в медиатеку WordPress. Файл физически не добавляется — функция создает запись в таблице wp_posts в базе данных и возвращает ID созданной записи.

Эта функция - одна из функций API низкого уровня, которая используется в WordPress для вставки вложений.

Функцию нужно использовать в связке с функциями: wp_generate_attachment_metadata() и wp_update_attachment_metadata().

Чтобы физически загрузить файл и создать запись этого файла в БД разом, обычно используется функция media_handle_upload().

Является основой для: media_handle_sideload(), media_handle_upload()
Работает на основе: wp_insert_post()

Хуков нет.

Возвращает

Число/WP_Error. ID записи в случае успешного добавления и 0 при неудаче. WP_Error объект при неудаче, если указан параметр $wp_error (с версии 4.7).

Использование

wp_insert_attachment( $attachment, $filename, $parent_post_id, $wp_error );
$attachment(массив) (обязательный)

Массив данных о добавляемом вложении, который будет записан в БД в таблицу wp_posts. Обязательно должен содержать минимум эти данные: post_title, post_content (в значении указывается пустая строка), post_status, guid и post_mime_type:

$attachment = array(
	'guid'           => $wp_upload_dir['url'] . '/' . basename( $filename ), 
	'post_mime_type' => $filetype['type'],
	'post_title'     => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
	'post_content'   => '',
	'post_status'    => 'inherit'
);
$filename(строка)
Расположение файла на сервере. Используйте абсолютный путь, а не УРЛ. Путь должен указывать на директорию загрузок WordPress - uploads. Смотрите wp_upload_dir().
По умолчанию: false
$parent_post_id(число)
ID поста (записи) к которому должен относиться добавляемый медиафайл. Здесь указываем ID поста-родителя.
По умолчанию: 0
$wp_error(логический)
Ставим true, если в случае ошибки нужно вернуть объект WP_Error. C WP 4.7.
По умолчанию: false

Примеры

#1 Добавим записи о файле в базу данных WP

Предполагается, что физически файл уже загружен в директорию uploads и теперь нам нужно добавить запись об этом файле в базу данных WordPress. Также, прикрепим запись к посту 37:

// файл должен находиться в директории загрузок WP.
$filename = '/path/to/uploads/2013/03/filname.jpg';

// ID поста, к которому прикрепим вложение.
$parent_post_id = 37;

// Проверим тип поста, который мы будем использовать в поле 'post_mime_type'.
$filetype = wp_check_filetype( basename( $filename ), null );

// Получим путь до директории загрузок.
$wp_upload_dir = wp_upload_dir();

// Подготовим массив с необходимыми данными для вложения.
$attachment = array(
	'guid'           => $wp_upload_dir['url'] . '/' . basename( $filename ), 
	'post_mime_type' => $filetype['type'],
	'post_title'     => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
	'post_content'   => '',
	'post_status'    => 'inherit'
);

// Вставляем запись в базу данных.
$attach_id = wp_insert_attachment( $attachment, $filename, $parent_post_id );

// Подключим нужный файл, если он еще не подключен
// wp_generate_attachment_metadata() зависит от этого файла.
require_once( ABSPATH . 'wp-admin/includes/image.php' );

// Создадим метаданные для вложения и обновим запись в базе данных.
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );

Заметки

Использование _wp_relative_upload_path(), чтобы создать guid может быть невозможно на некоторых серверах.

Код wp insert attachment: wp-includes/post.php WP 5.2

<?php
function wp_insert_attachment( $args, $file = false, $parent = 0, $wp_error = false ) {
	$defaults = array(
		'file'        => $file,
		'post_parent' => 0,
	);

	$data = wp_parse_args( $args, $defaults );

	if ( ! empty( $parent ) ) {
		$data['post_parent'] = $parent;
	}

	$data['post_type'] = 'attachment';

	return wp_insert_post( $data, $wp_error );
}

Cвязанные функции

Из метки: wp_insert (вставка в БД)

Еще из раздела: Вложения (media файлы)

17 комментов
Полезные 2 Вопросы 2 Все
  • Вячеслав cайт: www.realby.info

    Не получается воспользоваться функцией. Картинка грузится на серверЮ нормально используется, но при попытке воспользоваться функцией пишет очень странный путь, типа:

    /wp-content/uploads/images/images/2015/30/картинка.png

    То есть дублирует именно images
    хотя когда вывожу перед записью $filename - там правильный путь

    Ответить4.1 года назад #
    • Kama7452

      Ничего не понятно... Какой функцией? Эта функция добавляет запись в БД и Возвращает: Число. ID записи в случае успешного добавления и 0 при неудаче.

      Ответить4.1 года назад #
      • Вячеслав

        Вышеописанная функция. запись добавляет, id возвращает, но путь к картинке в базу пишется неправильный- как указал, добавляет еще одну несуществующую подпапку в пути. Поэтому и спращиваю- как все-таки правильно задавать второй параметр в функции?

        Ответить4.1 года назад #
        • Вячеслав

          С трудом, но заставил работать. Через непонятно что. Просто решил попробовать не указывать второй параметр. Точнее передаю $filename = ''. Все остальное как указано выше. Тогда все прекрасно добавляется и файл, загруженный не через админку, становится виден и в библиотеке файлов.

          Ответить4.1 года назад #
          • Kama7452

            Видимо вы как-то не так указывали путь. Ну, вообще-то так правильно, ничего не указывать, WP автоматом путь соберет. Сейчас добавлю этот момент в описание параметра.

            Ответить4.1 года назад #
            • Вячеслав cайт: www.realby.info

              Если вдруг кому интересно- таки разобрался я с правильной работой этой функции. Второй параметр $filename передавать надо, но обязательноо в виде пути от корневой папки на сервере, типа /var/www/ без http// А вот первый- как и описано.
              связано с тем что fopen() fwrite не работает с HTTP

              Ответить3.6 года назад #
              • Kama7452

                В описании этой функции вроде бы так и написано...

                $filename(строка)
                Расположение файла на сервере. Используйте абсолютный путь, а не УРЛ. Путь должен указывать на директорию загрузок WordPress - uploads.

                Ответить3.6 года назад #
  • Whido

    При удалении файла, физически он не удаляется, если загружен таким образом. В чем может быть проблема?

    Ответить1.5 года назад #
  • Рекомендую в первый аргумент ф-ции wp_insert_attachment - $attachment в массив добавить post_author = [ID], где [ID] - ваш собственный user ID, число, иначе в Медиафайлах WP и потом в блоке установки thumbnail'а на странице поста не будет картинка выводиться.

    3
    Ответить8 мес назад #
    • Игорь

      Ухх это очень важный комментарий. Нужно добавить его в пост. Только путём анализа БД понял разницу между "хорошими" и "плохими" картинками. post_author должен быть обязательно!!!

      Ответить4 мес назад #
    • Kama7452

      Там по умолчанию ставится этот параметр равный get_current_user_id(). Отдельно указывать не обязательно.

      Только если не нужно изменить ID на не текущего пользователя. Например, когда с фронта картинка добавляется неавторизованным юзером, то в этом случае да, обязательно нужно указать какой-то ID юзера.

      Ответить4 мес назад #
  • dydaevskiy1 cайт: techblog.sdstudio.top

    Вот не пойму, картинка в медиатеку загружена, при открытии в медиатеке указано что картинка привязана к посту. Но фактически изоражение в посте не отображается.

    1
    Ответить6 мес назад #
    • АП

      Да, у меня тоже.

      Ответить3 мес назад #
    • Kama7452

      Чтобы оно отобразилось его надо вывести где-то, сам факт привязки не гарантирует отображение картинки...

      Ответить3 мес назад #
      • @ Александр

        А не могли бы вы привести пример, как это можно сделать? Для тех кто в танке)

        Ответитьмесяц назад #
        • Kama7452

          get_attached_media() тут второй пример - это один из примеров, суть - надо получить прикрепленную картинку и вывести её через функции ВП.

          1
          Ответитьмесяц назад #
  • DronBoy cайт: comiczone.ru

    Добавляю картинку к посту после чего добавляю миниатюру в админке ее видно но на сайте нет. Но после того как я зайду в админку и нажму кнопку обновить то на сайте она появляется.
    Пробовал после добавления миниатюры вызывать метод обновления но не помогает.
    вот код
    добавление картинки

    function addToPost($postId,$img){
    	// файл должен находиться в директории загрузок WP.
    	$filename = $img;
    	// ID поста, к которому прикрепим вложение.
    	$parent_post_id = $postId;
    	// Проверим тип поста, который мы будем использовать в поле 'post_mime_type'.
    	$filetype = wp_check_filetype( basename( $filename ), null );
    	// Получим путь до директории загрузок.
    	$wp_upload_dir = wp_upload_dir();
    	// Подготовим массив с необходимыми данными для вложения.
    	$attachment = array(
    		'guid'           => $postId, 
    		'post_mime_type' => $filetype['type'],
    		'post_title'     => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
    		'post_content'   => '',
    		'post_status'    => 'publish'
    	);
    	// Вставляем запись в базу данных.
    	$attach_id = wp_insert_attachment( $attachment, $filename, $parent_post_id ,true);
    	return $attach_id;
    }

    в $k id поста.

    $id = addToPost($k,$newPuth);
    set_post_thumbnail($k,$id);

    Разобрался была ошибка в добовлении формата записи

    Ответитьмесяц назад #
Здравствуйте, !     Войти . Зарегистрироваться