Я пытаюсь получить и вставить изображения вне среды WordPress в пользовательский пост через PHP.
Как переместить / загрузить это изображение в формате папок дата/год, как это делает WordPress, и установить это изображение в качестве миниатюры записи?
Кроме того, как загрузить изображение в галерею?
Ниже мой код:
$filename = $image['name'];
$target_path = "../wp-content/uploads/";
$target_path = $target_path . $filename;
$wp_filetype = wp_check_filetype(basename($filename), null );
$wp_upload_dir = wp_upload_dir();
$attachment = array(
'guid' => $wp_upload_dir['baseurl'] . '/' . basename( $filename ),
'post_mime_type' => $wp_filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
'post_content' => '',
'post_status' => 'inherit',
);
$attach_id = wp_insert_attachment( $attachment, $target_path, $post_id );
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );
set_post_thumbnail( $post_id, $attach_id );
Мне удалось загрузить изображение в каталог загрузок, но я не могу создать папку года и даты. Это какая-то функция wp?
Попробуйте этот код:
Возможно, я неправильно понимаю, но зачем вам это делать вне среды WordPress? WordPress делает гораздо больше, чем просто загружает файл и помещает его в определенный каталог, например, управляет тем, какие пользователи могут загружать файлы, добавляет записи в базу данных для выгрузки и настраивает связи между избранными изображениями, выполняет действия и фильтры для внешних плагинов в зависимости от загрузки файла — все при соблюдении настроек сайта (в отношении соглашений об именах, места загрузки медиа и т.д.)
Если вы просто пытаетесь загрузить файлы без входа в раздел администрирования WordPress, например, для загрузки файлов с внешнего сайта, вам может понадобиться взглянуть на API-интерфейс XML-RPC и, в частности, метод uploadFile.
Другой вариант — написать мини-API самостоятельно. Для этого нужно:
Получить файл на сервере с помощью загрузки (или заставить сервер загрузить его с указанного URL-адреса).
Используйте
wp_upload_dir()
, чтобы получить путь к каталогу загрузки, иsanitize_file_name()
, чтобы создать путь и записать файл в нужное место.Используйте
wp_insert_attachment()
для хранения вложения в базе данных (wp_check_filetype()
будет полезен для установки post_mime_type). При желании также установите post_parent и метаключ _thumbnail_id, если хотите.Предоставьте доступ к вашему API внешним пользователям или, при необходимости, войдите в систему. Если вы используете открытую форму, то, по крайней мере, используйте
wp_create_nonce()
иwp_verify_nonce()
, чтобы сделать форму чуть более безопасной.Безусловно, я часто делаю это при переносе данных с существующих сайтов, устаревших систем, экспорта баз данных и т.д. Я хочу сказать, что вы всегда должны стремиться использовать преимущества основных функций WordPress для достижения этой цели, а не просто писать собственный скрипт, который помещает изображения в правильном месте.
У меня такая же проблема. Другая причина, по которой нужно загрузить изображение, — это когда у вас есть пакетное задание изображений, которое вы хотите прикрепить к разным публикациям, а не делать это вручную.
Я пишу веб-сервис для приложения. Приложение отправляет мне массив FILE, через который я хочу вставить данные поста и изображение. Я вставил детали поста в базу данных, но застрял в части изображения.
Обратитесь к документации по
wp_insert_attachment()
, она должна делать то, что вам нужно, я думаю. Я очень не рекомендую вручную изменять базу данных вне WordPress. Вместо этого просто посмотрите на источник WordPress и попытайтесь определить части, отвечающие за добавление данных постов, обработку загрузки файлов и вставку вложений.Разве это не может быть просто сделано с помощью media_sideload_image()? Единственное, что если вы не в административной области, то должны включить некоторые библиотеки из WordPress:
Для WordPress 4.8:
$new_att_id = media_sideload_image($image, $post_id, "image description...", 'id'); if(!is_wp_error($new_att_id)) { set_post_thumbnail($post_id, $new_att_id); }
Куда добавить этот код?
Посмотрите следующий код: