Условные размеры изображения для использования с помощью настройки пользовательского режима

Я ищу способ добавления размеров изображений, которые генерируются только при загрузке, происходящих в Настройке темы, любых предложений или указаний относительно того, как это можно сделать?

Я уже работал с фильтром middle_image_sizes_advanced, который дает мне изображения, которые я хочу, проблема в том, что они не отображаются в медиабиблиотеке, поэтому они не могут быть удалены пользователем. Это для многосетевой сети, поэтому я не хочу создавать бесконечное накопление изображений, которые пользователи не могут получить для очистки, и создать ситуацию, когда системный администратор не знает, какие изображения должны быть удалены и не использовать.

Вот текущий код, который не работает просто потому, что фильтр intermediate_image_sizes_advanced не add_image_size() эти новые размеры так же, как это add_image_size() , и поэтому они становятся «потерянными», как я упоминал выше.

 add_filter('intermediate_image_sizes_advanced','responsive_customizer_bg_images'); function responsive_customizer_bg_images( $image_sizes ){ // quit if the theme is not pure - only PURE gets responsive images, add new themes with responsive images here if ( ! isset( $_POST['post_data'] ) ) { return false; } else { if ( $_POST['post_data']['theme'] != 'pure' ) return false; } $sizes = array( '1024' => array( 'width' => 1024, 'height' => 768, 'crop' => true, ), '1680' => array( 'width' => 1680, 'height' => 1050, 'crop' => true, ), '2560' => array( 'width' => 2560, 'height' => 1440, 'crop' => true, ), ); $image_sizes = []; $custom_sizes = []; foreach ($sizes as $key => $value) { $image_sizes[ 'artsite-bg-' . $value['width'] . 'x' .$value['height'] ] = array( 'width' => $value['width'], 'height' => $value['height'], 'crop' => $value['crop'] ); $custom_sizes[] = array( 'artsite-bg-' . $value['width'] . 'x' .$value['height'] => __('Background ' . $value['width'] . 'x' .$value['height'] ) ); } return $image_sizes; } 

EDIT – для чего это стоит, этот вопрос решает подобную проблему, однако OP не пытается заглядывать в $_POST как я, чтобы определить, поступает ли входящая загрузка из Customizer или нет: добавьте пользовательские размеры изображений в загрузчик мультимедиа

EDIT 2 – вот веселая версия, которая создает бесконечный цикл, в котором каждое отзывчивое изображение вставлено в виде вложения в конце, в свою очередь, заставляя функцию запускать себя и создавать бесконечный цикл. Есть ли другой крюк, который я мог бы захватить, чтобы избежать цикла самозапускания?

 add_filter('add_attachment','generate_responsive_sizes'); function generate_responsive_sizes( $attachment_id ) { $image_post_data = get_post( $attachment_id ); error_log(print_r($image_post_data,true)); // quit if the post_type is not attachment and mime_type is not jpeg/jpg/gif if ( $image_post_data->post_type != 'attachment' || $image_post_data->post_mime_type != ( 'image/jpeg' || 'image/png' || 'image/gif' ) ) return false; // quit if the theme is not pure - only PURE gets responsive images, add new themes with responsive images here if ( ! isset( $_POST['post_data'] ) ) { return false; } else { if ( $_POST['post_data']['theme'] != 'pure' ) return false; } $upload_dir = wp_upload_dir(); $file = substr( strrchr( $image_post_data->guid, '/' ), 1 ); $filepath = $upload_dir['path'] . '/' . $file; $file_arr = preg_split( '/\./', $file ); $filename = $file_arr[0]; $file_ext = $file_arr[1]; error_log(print_r($upload_dir,true)); $sizes = array( '1024' => array( 'width' => 1024, 'height' => 768, 'crop' => true, ), '1680' => array( 'width' => 1680, 'height' => 1050, 'crop' => true, ), '2560' => array( 'width' => 2560, 'height' => 1440, 'crop' => true, ), ); $new_sizes_generated = []; // first create the images if ( ! is_wp_error( $image_post_data ) ) { foreach ($sizes as $key => $value) { $image = wp_get_image_editor( $filepath ); $new_img_filepath = $upload_dir['path'] . '/' . $filename . '-' . $value['width'] . 'x' . $value['height'] . '.' . $file_ext; error_log(print_r($value,true)); error_log(print_r($image,true)); error_log(print_r($new_img_filepath,true)); $dimensions = $image->get_size(); // if the image new size is not bigger than the original, we will // continue and not save a new version of this image if ( $dimensions['width'] < $value['width'] && $dimensions['height'] < $value['height'] ) { continue; } $image->resize( $value['width'], $value['height'], $value['crop'] ); $image->save( $new_img_filepath ); } } // now attach them, we do this separately to avoid an infinite loop of files added, // which in turn triggers this entire function from start, since it's hooked to // `add_attachment`. if ( ! is_wp_error( $image_post_data ) ) { foreach ($sizes as $key => $value) { $new_img_filepath = $upload_dir['path'] . '/' . $filename . '-' . $value['width'] . 'x' . $value['height'] . '.' . $file_ext; // Check for existence of an attachment with the same GUID to avoid // infinite loop as noted at the opening of the above foreach loop global $wpdb; $prefix = $wpdb->prefix; $attachment = $wpdb->get_col($wpdb->prepare("SELECT ID FROM " . $prefix . "posts" . " WHERE guid='%s';", $new_img_filepath )); if ( ! empty( $attachment ) ) { error_log(print_r('there already is an attachment for ' . $new_img_filepath, true )); return false; } else { error_log(print_r('there is NO attachment for ' . $new_img_filepath, true )); $wp_filetype = wp_check_filetype(basename($new_img_filepath), null ); error_log(print_r($wp_filetype,true)); $attachment = array( 'guid' => $new_img_filepath, 'post_mime_type' => $wp_filetype['type'], 'post_title' => preg_replace('/\.[^.]+$/', '', basename($new_img_filepath)), 'post_content' => '', 'post_status' => 'inherit' ); error_log(print_r($attachment,true)); wp_insert_attachment( $attachment, $new_img_filepath, 37 ); } } } } 

Solutions Collecting From Web of "Условные размеры изображения для использования с помощью настройки пользовательского режима"