Использование media_handle_upload для загрузки изображения, но без создания миниатюр
Я пытаюсь загрузить изображение в WordPress, используя некоторую функцию.
Я нашел способ загрузки изображений, но есть одна проблема.
Когда пользователь загружает свое изображение, WordPress создает несколько изображений разных размеров, а мне нужно только одно изображение.
Вот папка wp-content/uploads/2010/10 - посмотрите на картинку (это одно изображение, но WordPress создает его копии разных размеров).
https://i.sstatic.net/fn6ab.jpg
Вот мой код:
<?php /*
Шаблон страницы: Страница загрузки
*/?>
<?php get_header();
?><div class="container_12">
<div id="content">
<form id="file-form" enctype="multipart/form-data" action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="POST">
<p id="async-upload-wrap">
<label for="async-upload">Загрузить</label>
<input type="file" id="async-upload" name="async-upload"> <input type="submit" value="Загрузить" name="html-upload">
</p>
<p>
<input type="hidden" name="post_id" id="post_id" value="<?php echo '212';?>" />
<?php wp_nonce_field('client-file-upload'); ?>
<input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>" />
</p>
<p>
<input type="submit" value="Сохранить все изменения" name="save" style="display: none;">
</p>
</form>
<?php
if ( isset( $_POST['html-upload'] ) && !empty( $_FILES ) ) {
require_once(ABSPATH . 'wp-admin/includes/admin.php');
$id = media_handle_upload('async-upload', 1199); // ID страницы клиентских файлов
unset($_FILES);
if ( is_wp_error($id) ) {
$errors['upload_error'] = $id;
$id = false;
}
if ($errors) {
echo "<p>Произошла ошибка при загрузке вашего файла.</p>";
} else {
echo "<p>Ваш файл успешно загружен.</p>";
}
}
get_sidebar();
get_footer();?>
Как сделать так, чтобы загружалось только одно изображение?
Надеюсь, вы меня поняли ^* потому что мой язык ><

Используйте функцию wp_handle_upload() для самостоятельной обработки загрузок без создания вложений и изменения размеров.
Функция media_handle_upload() фактически создает запись вложения (attachment post), а процесс изменения размеров происходит при вызове wp_generate_attachment_metadata. Если вы не вызываете эту функцию, то изменения размеров не происходит.

HTML-разметка:
<p>
<label for="custom-upload">Загрузить новое изображение:</label>
<input type="file" tabindex="3" name="custom-upload" id="custom-upload" />
</p>
<?php
/*Получение изображения*/
$attachment = get_post_meta($postid, 'custom_image');
if($attachment[0]!='')
{
echo wp_get_attachment_link($attachment[0], 'thumbnail', false, false);
}
?>
Загрузка изображения:
<?php
global $post; /*Глобальный объект записи*/
$post_id = $post->ID; /*Получаем ID текущей записи*/
$upload = $_FILES['upload']; /*Получаем загруженное изображение из формы*/
add_custom_image($post_id, $upload); /*Вызываем функцию загрузки изображения*/
function add_custom_image($post_id, $upload)
{
$uploads = wp_upload_dir(); /*Получаем путь к директории загрузок WordPress*/
if (is_writable($uploads['path'])) /*Проверяем доступна ли директория для записи*/
{
if ((!empty($upload['tmp_name']))) /*Проверяем не пустое ли изображение загружено*/
{
if ($upload['tmp_name']) /*Проверяем загружено ли изображение во временную директорию*/
{
$file=handle_image_upload($upload); /*Вызываем нашу функцию для НЕПОСРЕДСТВЕННОЙ загрузки изображения*/
$attachment = array /*Создаем вложение для нашей записи*/
(
'post_mime_type' => $file['type'], /*Тип вложения*/
'post_parent' => $post_id, /*ID записи*/
);
$aid = wp_insert_attachment($attachment, $file['file'], $post_id); /*Добавляем вложение к записи и получаем ID вложения*/
$a = wp_generate_attachment_metadata($aid, $file['file'] ); /*Генерируем метаданные для нового вложения*/
$prev_img = get_post_meta($post_id, 'custom_image'); /*Получаем ранее загруженное изображение*/
if(is_array($prev_img))
{
if($prev_img[0] != '') /*Если изображение существует*/
{
wp_delete_attachment($prev_img[0]); /*Удаляем предыдущее изображение*/
}
}
update_post_meta($post_id, 'custom_image', $aid); /*Сохраняем ID вложения в метаданных*/
if ( !is_wp_error($aid) )
{
wp_update_attachment_metadata($aid, wp_generate_attachment_metadata($aid, $file['file'] ) ); /*Если нет ошибок, обновляем метаданные для нового изображения*/
}
}
}
else
{
echo 'Пожалуйста, загрузите изображение.';
}
}
}
function handle_image_upload($upload)
{
global $post;
if (file_is_displayable_image( $upload['tmp_name'] )) /*Проверяем является ли файл изображением*/
{
/*обрабатываем загруженный файл*/
$overrides = array('test_form' => false);
$file=wp_handle_upload($upload, $overrides);
}
return $file;
}
?>

Если вы используете WordPress 3.x, перейдите в раздел Админка > Настройки > Медиафайлы.
В разделе "Размеры изображений" установите все значения на ноль (0) и снимите галочку с пункта "Обрезать миниатюру до точных размеров".
Нажмите "Сохранить изменения", и WordPress больше не будет создавать миниатюры.

+1, хотел написать то же самое.. (потратил последние 5-10 минут на тестирование загрузок и промежуточных размеров)..

проблема всё ещё существует .. это размеры по умолчанию: $default_sizes = array('large', 'medium', 'thumbnail' ); Я хочу, чтобы по умолчанию были размеры 'thumbanil', 'photo_author', 'big_image' .. и т.д. (photo_author = 20 * 20), (big_image = 600 * 600) например ..

@AboSami Это не то, о чём вы спрашивали в исходном вопросе. Вы сказали "wordpress создаёт больше одного изображения разных размеров, это проблема, потому что я хочу только одно изображение". Если вам теперь нужно знать, как ДОБАВИТЬ пользовательские размеры или переименовать существующие размеры, это другой вопрос, и его следует опубликовать отдельно. Но пока мы говорим на эту тему - почему вас волнует, как они называются внутри? Просто измените medium на 20*20, а large на 600*600. Любой из стандартных размеров можно установить на любую ширину и высоту через админку.
