Использование media_handle_upload для загрузки изображения, но без создания миниатюр

20 дек. 2010 г., 17:25:50
Просмотры: 13.5K
Голосов: 3

Я пытаюсь загрузить изображение в 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();?>

Как сделать так, чтобы загружалось только одно изображение?

Надеюсь, вы меня поняли ^* потому что мой язык ><

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

В чем проблема с миниатюрами? Технически это то, что вы просите, но у этого может быть слишком много побочных эффектов, поэтому я решил сначала уточнить :)

hakre hakre
20 дек. 2010 г. 18:47:37

Проблема в том, что когда я загружаю изображение (одно изображение), WordPress создает более 4 изображений разных размеров... Мне это не нужно.. КАК я могу отключить эту функцию? спасибо ^_^

AboSami AboSami
21 дек. 2010 г. 21:17:25

AboSami, если вы вдруг вернетесь сюда ( последний визит 25 дек. '11 :), пожалуйста, выберите один из замечательных ответов, которые дали люди на ваш вопрос (непростой выбор!)...

brasofilo brasofilo
7 июл. 2012 г. 10:57:19
Все ответы на вопрос 4
0

Используйте функцию wp_handle_upload() для самостоятельной обработки загрузок без создания вложений и изменения размеров.

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

30 мар. 2011 г. 00:16:48
0

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;
}
?>
29 мар. 2011 г. 15:13:20
4

Если вы используете WordPress 3.x, перейдите в раздел Админка > Настройки > Медиафайлы.

В разделе "Размеры изображений" установите все значения на ноль (0) и снимите галочку с пункта "Обрезать миниатюру до точных размеров".

Нажмите "Сохранить изменения", и WordPress больше не будет создавать миниатюры.

20 дек. 2010 г. 20:22:01
Комментарии

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

t31os t31os
20 дек. 2010 г. 21:04:01

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

AboSami AboSami
21 дек. 2010 г. 22:06:07

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

MathSmath MathSmath
21 дек. 2010 г. 23:14:14

Извините, что мой вопрос был неясен... Мне нужно уменьшить стандартные размеры изображений, их три типа (large, medium, thumbnail). Я хочу удалить 'large' и 'medium', а также добавить только 'big-picture'. КАК? Спасибо, mr MATHSMATH

AboSami AboSami
22 дек. 2010 г. 07:28:28
0

Чтобы предотвратить создание WordPress нескольких миниатюр при загрузке изображения, я использую следующий код:

add_filter('intermediate_image_sizes_advanced', 'no_image_resizing');
    function no_image_resizing($size) {
        $ret = array();
        return $ret;
    }
24 мая 2011 г. 06:18:15