Вопрос или проблема
В моей теме есть набор
add_theme_support( 'post-thumbnails' );
set_post_thumbnail_size( 470, 680 );
который фактически генерирует еще одно изображение помимо стандартных small,medium,medium-large,large
и он установлен автором темы для конкретных целей, конечно.
Я использую wp_insert_attachment() как стандартную функцию для загрузки изображений с фронтенда. Из этого конкретного процесса я не хочу, чтобы генерировались несколько изображений.Только оригинальное изображение и эскиз изображения. Поэтому я сделал этот простой код
function test_attachment( $user_data, $values, $user_id ) {
if( isset( $values['profile']['user_avatar']['path'] ) ) {
$filename = $values['profile']['user_avatar']['path'];
$filetype = wp_check_filetype( basename( $filename ), null );
$wp_upload_dir = wp_upload_dir();
$attachment = array(
'guid' => $wp_upload_dir['url'] . "https://wordpress.stackexchange.com/" . basename( $filename ),
'post_mime_type' => $filetype['type'],
'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
'post_content' => '',
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment( $attachment, $filename );
require_once( ABSPATH . 'wp-admin/includes/image.php' );
//удалить все сгенерированные изображения и оставить только оригинальное и эскиз изображения.
add_filter('intermediate_image_sizes_advanced', function($sizes) {
unset( $sizes['medium']);
unset( $sizes['medium_large']);
unset( $sizes['large']);
return $sizes;
});
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );
$previous_avatar_id = get_user_meta( $user_id, 'avatar_attachment_id', true );
if( $previous_avatar_id ) {
wp_delete_attachment( $previous_avatar_id );
}
update_user_meta( $user_id, 'avatar_attachment_id', $attach_id );
}
}
что отлично работает и фактически отключает генерацию стандартных размеров изображений с помощью intermediate_image_sizes_advanced, но все еще происходит генерация изображения миниатюры сообщения.
Я пытался также отключить создание изображения миниатюры сообщения. Я попытался добавить
unset( $sizes['post-thumbnail']);
но безуспешно.
Как возможно остановить генерацию изображения миниатюры сообщения изнутри парсера и не удаляя оригинал set_post_thumbnail_size, так как он установлен там для других конкретных целей?
Буду признателен за любые идеи.
Я допустил большую ошибку, используя
unset( $sizes['post-thumbnails']);
вместо
unset( $sizes['post-thumbnail']);
что на самом деле является названием изображения.
Ответ или решение
Для отключения генерации изображений пост-миниатюр (post-thumbnail) в WordPress, особенно если вы используете функцию wp_insert_attachment
для загрузки изображений через интерфейс, вы можете воспользоваться следующим подходом.
Шаги для отключения генерации изображений пост-миниатюр
1. Использование фильтра intermediate_image_sizes_advanced
Вы уже начали с использования фильтра intermediate_image_sizes_advanced
для удаления стандартных размеров изображений (medium
, medium_large
, large
). Вам нужно добавить дополнительные операции в ваш код, чтобы отключить также создание миниатюры.
add_filter('intermediate_image_sizes_advanced', function($sizes) {
unset($sizes['medium']);
unset($sizes['medium_large']);
unset($sizes['large']);
unset($sizes['post-thumbnail']); // Удаляем создание пост-миниатюры
return $sizes;
});
Убедитесь, что вы добавляете этот фильтр на правильном уровне вашего кода.
2. Установка параметра для wp_insert_attachment
Если вы хотите, чтобы система не создавала пост-миниатюры при загрузке через wp_insert_attachment
, указывайте это преднамеренно в вашем вызове функции. Однако, поскольку стандартный вызов уже инициирует создание миниатюр, вам понадобятся дополнительные меры.
$attach_id = wp_insert_attachment($attachment, $filename);
// Убедитесь, что вы корректно включаете эту часть кода перед wp_generate_attachment_metadata
require_once(ABSPATH . 'wp-admin/includes/image.php');
// Отключаем генерацию миниатюр, добавляя этот фильтр здесь
add_filter('intermediate_image_sizes_advanced', function($sizes) {
unset($sizes['medium']);
unset($sizes['medium_large']);
unset($sizes['large']);
unset($sizes['post-thumbnail']); // Отключаем создание пост-миниатюры
return $sizes;
});
// Генерируем метаданные, не создавая лишние размеры
$attach_data = wp_generate_attachment_metadata($attach_id, $filename);
wp_update_attachment_metadata($attach_id, $attach_data);
3. Убедитесь, что код выполняется в правильном порядке
Важно, чтобы фильтр, отключающий размеры изображений, менялся до вызовов функций, которые реагируют на него, то есть до wp_generate_attachment_metadata
. В противном случае любое последующее действие может проигнорировать ваши настройки.
Замечания
- Убедитесь, что у вас нет других плагинов или тем, которые могут переопределять ваши фильтры или вызывать генерацию миниатюр.
- Проверьте настройки медиабиблиотеки в административной панели WordPress, чтобы не было конфликтов.
- Тестируйте производительность вашего сайта после внесения изменений, чтобы убедиться, что они не влияют на другие стороны вашего проекта.
Итог
Эти шаги позволят вам отключить генерацию пост-миниатюр, не меняя глобальные настройки вашего сайта или темы. Такой подход поможет вам контролировать, какие размеры изображений создаются, обеспечивая при этом эффективность загрузки и обработки медиафайлов на вашем сайте.