WordPress как на ладони
rgbcode is looking for WordPress developers. eurobyte.ru - мощные сервера с Дата-центрами в Нидерландах и Москве. От 159 ₽/мес.

Уменьшить размер исходного изображения и не сохранять оригинал.

При загрузке изображения, если оно большого размера, wordpress сохраняет и исходное изображение, и уменьшенную копию с припиской -scaled. Как сохранять только -scaled не сохраняя исходного? Или сохранить исходное, но уменьшать его до указанных размеров? Остальные ненужные мне размеры я смог отключить. Но не могу убрать сохранение исходного.

Код ниже не помогает, исходник сохраняется.

add_filter( 'intermediate_image_sizes_advanced', 'true_remove_default_sizes' );

function true_remove_default_sizes( $sizes ) {
	unset( $sizes[ 'full' ] );
	return $sizes;
}
Заметки к вопросу:
Dan Zakirov 1.2 года назад

По-моему нужно не unset() а unlink() делать и вроде другой фильтр или экшен. Я на каком то сайте делал свои размеры scaled и удалял оригинал, сегодня посмотрю и если найду дам готовое решение.

Dan Zakirov 1.2 года назад

Нет не подскажу, обманул немного я вас) Теперь самому интересно как сделать это.

Кстати, этот плагин хорошо справляется с задачей https://wordpress.org/plugins/ewww-image-optimizer/

0
tyllerdrdn
1.2 года назад
  • 3
    Kama9752

    Как сохранять только -scaled не сохраняя исходного?

    // Removes original image file from disk if `-scaled` size has been created. Works for WP 5.3+ only.
    add_filter( 'wp_generate_attachment_metadata', 'remove_scaled_original_image_file', 10, 3 );
    
    /**
     * Removes original image file from disk if `-scaled` size has been created.
     *
     * Function for hook `wp_generate_attachment_metadata`.
     *
     * @param array  $image_meta
     * @param int    $attachment_id
     * @param string $context       Exists from WP 5.3+.
     *
     * @return array
     */
    function remove_scaled_original_image_file( $image_meta, $attachment_id, $context = '' ){
    
    	if( $context !== 'create' || empty( $image_meta['original_image'] ) ){
    		return $image_meta;
    	}
    
    	// remove original image file from disk
    
    	$image_file = get_attached_file( $attachment_id );
    	$original_file = path_join( dirname( $image_file ), $image_meta['original_image'] );
    
    	$removed = unlink( $original_file );
    	if( $removed ){
    		unset( $image_meta['original_image'] );
    	}
    	else {
    		trigger_error( 'Couldn`t remove original_image file.' );
    	}
    
    	return $image_meta;
    }
    tyllerdrdn 1.2 года назад

    Спасибо) Удаляет исходный размер если есть scaled. То что нужно.

    Dan Zakirov 1.2 года назад

    Спасибо Тимуру! Закройте вопрос если решено

    tyllerdrdn 1.2 года назад

    Прошу прощения, не понимаю как закрыть. Решение вопроса отметил.

    tyllerdrdn 1.1 года назад

    Почему-то код выше срабатывает не всегда. Иногда срабатывает, а иногда создает две миниатюры- исходную и scaled. Не понимаю с чем это связано. Закономерность отследить не удалось. Плагинов никаких нет, а все остальное из functions.php удалил - все-равно работает через раз.

    Такое было всегда. Просто в тот раз мало протестировал.

    Kama 1.1 года назад

    Вот с этим условием видимо нужно разобратся: $context !== 'create'. Похоже иногда не передается 'create' контекст и этот код поэтому не срабатывает и все работает как если его нет.

    Надо бы выяснить при какой загрузке такое происходит.

    tyllerdrdn 1.1 года назад

    Еще раз попытался понять закономерность и провел несколько тестов. Все это работает на локалке, open server.

    1) Вхожу в админку, медиафайлы. Добавляю картинку. На выходе не 2 картинки (scaled и миниатюра), как мне нужно, а три, одна из которых исходная. Т.е. функция не сработала.

    2) Удаляю. И не обновляя страницу, добавляю еще одну картинку. Результат тот же.

    3) Полностью повторил предыдущий шаг. Теперь две картинки.

    Короче, я повторил так еще несколько раз. И обновлял страницу после удаления, и не удалял. И ctrl + f5, и вообще по разному. И мне пока не удалось понять закономерность. Все тесты проводились в админке, в медифайлы.

    При этом исходная картинка, которая сохраняется в папке uploads, при ее открытии в медиафайлах она не раскрывается.

    tyllerdrdn 1.1 года назад

    Никто никогда не замечал, что wordpress вместо одной исходной картинки добавляет две? Я отключил все плагины и полностью очистил functions.php от всего кода, в том числе и от кода Kama. И при добавлении картинки иногда wordpress загружает два исходника, приписывая второму '-1'. Т.е. проблема не в коде, а в самом движке? Который сохраняет то один исходник, то два. У меня wordpress 6.2.2., на open server.

    tyllerdrdn 1.1 года назад

    Так, провел уже много тестов и вроде все нормально. Если ошибка снова всплывет, то отпишусь. Если нет, значит все нормально и проблема решена. Возможная причина проблемы и решение- старый php на сервере. Я заметил, что в консоли wordpress ругается на старый php версии 7.2 и говорит, что минимальная рекомендуемая это 7.4. Ну, т.к. больше вариантов решения проблемы нет, решил попробовать и в open server выставил 7.4. И все, кажется нормально.

    tyllerdrdn 1.1 года назад

    И сам wordpress на 0.1 сек стал работать быстрее)) Ладно, проблема решена. Загрузил еще несколько картинок и все нормально. Код выше рабочий, можно использовать.

    Kama 1.1 года назад

    Неплохо ты протестировал все это дело. Спасибо!

    Т.е. проблема не в коде, а в самом движке? Который сохраняет то один исходник, то два.

    А картинки при этом разные пробовал грузить? В ВП есть фишка, что он считывает exif данные из картинки и иногда там бывает что ориентация другая, например вверх ногами картинка. ВП при загрузке пытается сделать правильную орриентацию. Возможно в этом случае и появляются 2 оригинала. К слову, все просмоторщики, браузер в том числе, тоже считывают эти данные и всегда показывает картинку как положено (т.е. в реальности файл картинки может содержать перевернутую картинку, где в метаданных указано что она перевернута, но мы её видем как обычно). Но для ВП важно изначально иметь картинку в правильной орринтации, потому что он создает миниатюры и там все координаты считываются с левого верхнего угла, поэтому там важно чтобы картинка была правильно с орриентирована, когда с ней работают GD или imagic библиотеки...

    Dan Zakirov 1.1 года назад

    например вверх ногами картинка. ВП при загрузке пытается сделать правильную орриентацию

    нифига себе чудеса, я даже не знал что оно так работать может

    tyllerdrdn 1.1 года назад

    Да, я грузил разные. Причем в разных форматах, не только jpg, но и png. Случайно загрузил даже webp и удивился, что из него он тоже миниатюр нарезал. Я уже загрузил более 50 картинок и код сработал адекватно, т.е. везде на выходе получил 2 картинки- исходная была в одном экземпляре и автоматически (из-за кода выше) удалилась. Т.е. проблема была в php 7.2 вместо нужных 7.4. Всего-то 0.2 версии, а такие проблемы. Чтобы понять причину, даже нейросеть мучил вопросами. Но она туповатая, так глубоко не копает, как иногда случайно получается залезть методом тыка)

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация