Программное добавление изображений в медиатеку
Я пытаюсь программно добавить несколько изображений в медиатеку, я загрузил изображения в wp-content/uploads
, теперь я пытаюсь использовать wp_insert_attachement
.
Вот код, однако он работает не так, как ожидалось, я думаю, что метаданные сгенерированы неправильно, я могу видеть файлы в медиатеке, но без миниатюр, также, если я редактирую изображение, я получаю сообщение об ошибке, требующее повторной загрузки изображения.
$filename_array = array(
'article1.jpg',
'article2.jpg',
);
// The ID of the post this attachment is for.
$parent_post_id = 0;
// Get the path to the upload directory.
$wp_upload_dir = wp_upload_dir();
foreach ($filename_array as $filename) {
// Check the type of file. We'll use this as the 'post_mime_type'.
$filetype = wp_check_filetype( basename( $filename ), null );
// Prepare an array of post data for the attachment.
$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'
);
// Insert the attachment.
$attach_id = wp_insert_attachment( $attachment, $filename, $parent_post_id );
// Make sure that this file is included, as wp_generate_attachment_metadata() depends on it.
require_once( ABSPATH . 'wp-admin/includes/image.php' );
// Generate the metadata for the attachment, and update the database record.
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );
}
3 answers
$image_url = 'adress img';
$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 );
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 );
У меня были проблемы с решением @Trubine, когда файлы изображений не загружались.
Вот полный пример, который сработал для меня: https://gist.github.com/m1r0/f22d5237ee93bcccb0d9
Это аналогичная идея, но используйте HTTP-библиотеку WP для извлечения содержимого по сравнению с file_get_contents(). Вот содержание решения github gist от m1r0:
if( !class_exists( 'WP_Http' ) )
include_once( ABSPATH . WPINC . '/class-http.php' );
$http = new WP_Http();
$response = $http->request( $meta[ 'image_url' ] );
if( $response['response']['code'] != 200 ) {
return false;
}
$upload = wp_upload_bits( basename($meta[ 'image_url' ]), null, $response['body'] );
if( !empty( $upload['error'] ) ) {
return false;
}
$file_path = $upload['file'];
$file_name = basename( $file_path );
$file_type = wp_check_filetype( $file_name, null );
$attachment_title = sanitize_file_name( pathinfo( $file_name, PATHINFO_FILENAME ) );
$wp_upload_dir = wp_upload_dir();
$post_info = array(
'guid' => $wp_upload_dir['url'] . '/' . $file_name,
'post_mime_type' => $file_type['type'],
'post_title' => $attachment_title,
'post_content' => '',
'post_status' => 'inherit',
);
$attach_id = wp_insert_attachment( $post_info, $file_path, $parent_post_id );
require_once( ABSPATH . 'wp-admin/includes/image.php' );
$attach_data = wp_generate_attachment_metadata( $attach_id, $file_path );
wp_update_attachment_metadata( $attach_id, $attach_data );
return $attach_id; code here
Если вы используете функцию дополнительной загрузки WordPress, вы можете сделать это проще (и пусть WordPress выполнит всю очистку за вас).
<?php
$desc = 'some description';
$file = 'http://www.example.com/image.png';
$file_array = [ 'name' => wp_basename( $file ), 'tmp_name' => download_url( $file ) ];
// If error storing temporarily, return the error.
if ( is_wp_error( $file_array['tmp_name'] ) ) {
return $file_array['tmp_name'];
}
// Do the validation and storage stuff.
$id = media_handle_sideload( $file_array, 0, $desc );
// If error storing permanently, unlink.
if ( is_wp_error( $id ) ) {
@unlink( $file_array['tmp_name'] );
return $id;
}