Intereting Posts
Заказать сообщения от ACF checkbox могу ли я ограничить посетителя настраиваемыми страницами просмотров страниц, тогда требуется логин или оплата Изменение пользовательской постоянной ссылки с помощью фильтра Эхо пользовательское имя таксономии Должны ли использовать виджеты в этом случае? отображать самые популярные теги категории? cURL error 6 в области новостей, а также не будет автоматически обновляться Должен ли я использовать wp_nonce_field в моей контактной форме? Отображать собственный текст главной страницы на основе домена Разбиение страниц добавлением чисел в странной моде Как остановить продолжение сообщений во втором цикле с того места, где первый закончился WP Job Manager Resume Add on Отображает значение только что добавленного поля Как перейти на локальный видеопроигрыватель с максимальным кодом короткого кода на video.js? Запятая между всеми элементами за исключением последнего с get_the_term_list Как установить значение по умолчанию для «Alt text» в диалоговом окне загрузки изображения?

Как создавать эскизы только при необходимости?

У меня 1000 изображений. Как заставить WordPress генерировать большой палец только тогда, когда это необходимо. Например, домашний слайдер будет использовать только 10 изображений, которые я не хочу, чтобы другие 1000 изображений имели этот эскиз, созданный в качестве пустой траты пространства и ресурсов.

Есть способ запустить add_image_size только при необходимости?

благодаря

ОБНОВЛЕНИЕ Как вы говорите, это не действительно add_image_size, что нужно уволить. Было бы замечательно, если бы я использовал the_post_thumbnail («слайдер-палец»), чтобы изменить размер изображения. Возможно, это замедление первого взгляда на изображение, но это представление обычно генерируется мной, когда я действительно просматриваю сообщение, поэтому я не забочусь об этом.

Таким образом, между моими сообщениями, слайдером, блогами, эскизами портфолио и т. Д., Я получил 1000 изображений, и мне нужно, чтобы только 10 изображений были изменены для слайдера. Я вижу много потерянных ресурсов, чтобы генерировать размер эскиза для других 990 изображений.

Надеюсь, теперь ясно, извините за мой английский

Взгляните на плагин Dynamic Image Resizer Отто

Этот плагин изменяет способ создания изображений WordPress, чтобы он генерировал изображения только тогда, когда они фактически используются где-то, на лету. Изображения, созданные таким образом, будут сохранены в обычных каталогах загрузки, для последующей быстрой отправки веб-сервером. В результате пространство сохраняется (так как изображения создаются только при необходимости), а загрузка изображений происходит намного быстрее (поскольку он больше не генерирует изображения при загрузке).

Поместите это в свой файл функций темы. При загрузке WordPress не сможет создавать ничего, кроме 3 стандартных размеров.

Когда изображение затем запрашивается в определенном размере, который еще не сгенерирован, он будет создан только один раз.

add_filter('image_downsize', 'ml_media_downsize', 10, 3); function ml_media_downsize($out, $id, $size) { // If image size exists let WP serve it like normally $imagedata = wp_get_attachment_metadata($id); if (is_array($imagedata) && isset($imagedata['sizes'][$size])) return false; // Check that the requested size exists, or abort global $_wp_additional_image_sizes; if (!isset($_wp_additional_image_sizes[$size])) return false; // Make the new thumb if (!$resized = image_make_intermediate_size( get_attached_file($id), $_wp_additional_image_sizes[$size]['width'], $_wp_additional_image_sizes[$size]['height'], $_wp_additional_image_sizes[$size]['crop'] )) return false; // Save image meta, or WP can't see that the thumb exists now $imagedata['sizes'][$size] = $resized; wp_update_attachment_metadata($id, $imagedata); // Return the array for displaying the resized image $att_url = wp_get_attachment_url($id); return array(dirname($att_url) . '/' . $resized['file'], $resized['width'], $resized['height'], true); } add_filter('intermediate_image_sizes_advanced', 'ml_media_prevent_resize_on_upload'); function ml_media_prevent_resize_on_upload($sizes) { // Removing these defaults might cause problems, so we don't return array( 'thumbnail' => $sizes['thumbnail'], 'medium' => $sizes['medium'], 'large' => $sizes['large'] ); } 

К сожалению, ответ @ Patrick нарушает функции srcset, введенные в WP 4.4. К счастью, нам просто нужно добавить две дополнительные функции!

Во-первых, нам необходимо временно ввести все зарегистрированные размеры миниатюр в метаданные изображения, чтобы их можно было рассмотреть:

 function bi_wp_calculate_image_srcset_meta($image_meta, $size_array, $image_src, $attachment_id){ //all registered sizes global $_wp_additional_image_sizes; //some source file specs we'll use a lot $src_path = get_attached_file($attachment_id); $src_info = pathinfo($src_path); $src_root = trailingslashit($src_info['dirname']); $src_ext = $src_info['extension']; $src_mime = wp_check_filetype($src_path); $src_mime = $src_mime['type']; $src_base = wp_basename($src_path, ".$src_ext"); //find what's missing foreach($_wp_additional_image_sizes AS $k=>$v) { if(!isset($image_meta['sizes'][$k])) { //first, let's find out how things would play out dimensionally $new_size = image_resize_dimensions($image_meta['width'], $image_meta['height'], $v['width'], $v['height'], $v['crop']); if(!$new_size) continue; $new_w = (int) $new_size[4]; $new_h = (int) $new_size[5]; //bad values if(!$new_h || !$new_w) continue; //generate a filename the same way WP_Image_Editor would $new_f = wp_basename("{$src_root}{$src_base}-{$new_w}x{$new_h}." . strtolower($src_ext)); //finally, add it! $image_meta['sizes'][$k] = array( 'file' => $new_f, 'width' => $new_w, 'height' => $new_h, 'mime-type' => $src_mime ); } } return $image_meta; } add_filter('wp_calculate_image_srcset_meta', 'bi_wp_calculate_image_srcset_meta', 10, 4); 

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

 function bi_wp_calculate_image_srcset($sources, $size_array, $image_src, $image_meta, $attachment_id){ //get some source info $src_path = get_attached_file($attachment_id); $src_root = trailingslashit(pathinfo($src_path, PATHINFO_DIRNAME)); //the actual image metadata (which might be altered here) $src_meta = wp_get_attachment_metadata($attachment_id); //an array of possible sizes to search through $sizes = $image_meta['sizes']; unset($sizes['thumbnail']); unset($sizes['medium']); unset($sizes['large']); $new = false; //loop through sources foreach($sources AS $k=>$v) { $name = wp_basename($v['url']); if(!file_exists("{$src_root}{$name}")) { //find the corresponding size foreach($sizes AS $k2=>$v2) { //we have a match! if($v2['file'] === $name) { //make it if(!$resized = image_make_intermediate_size( $src_path, $v2['width'], $v2['height'], $v2['crop'] )){ //remove from sources on failure unset($sources[$k]); } else { //add the new thumb to the true meta $new = true; $src_meta['sizes'][$k2] = $resized; } //remove from the sizes array so we have //less to search next time unset($sizes[$k2]); break; }//match }//each size }//each 404 }//each source //if we generated something, update the attachment meta if($new) wp_update_attachment_metadata($attachment_id, $src_meta); return $sources; } add_filter('wp_calculate_image_srcset', 'bi_wp_calculate_image_srcset', 10, 5); не function bi_wp_calculate_image_srcset($sources, $size_array, $image_src, $image_meta, $attachment_id){ //get some source info $src_path = get_attached_file($attachment_id); $src_root = trailingslashit(pathinfo($src_path, PATHINFO_DIRNAME)); //the actual image metadata (which might be altered here) $src_meta = wp_get_attachment_metadata($attachment_id); //an array of possible sizes to search through $sizes = $image_meta['sizes']; unset($sizes['thumbnail']); unset($sizes['medium']); unset($sizes['large']); $new = false; //loop through sources foreach($sources AS $k=>$v) { $name = wp_basename($v['url']); if(!file_exists("{$src_root}{$name}")) { //find the corresponding size foreach($sizes AS $k2=>$v2) { //we have a match! if($v2['file'] === $name) { //make it if(!$resized = image_make_intermediate_size( $src_path, $v2['width'], $v2['height'], $v2['crop'] )){ //remove from sources on failure unset($sources[$k]); } else { //add the new thumb to the true meta $new = true; $src_meta['sizes'][$k2] = $resized; } //remove from the sizes array so we have //less to search next time unset($sizes[$k2]); break; }//match }//each size }//each 404 }//each source //if we generated something, update the attachment meta if($new) wp_update_attachment_metadata($attachment_id, $src_meta); return $sources; } add_filter('wp_calculate_image_srcset', 'bi_wp_calculate_image_srcset', 10, 5); не function bi_wp_calculate_image_srcset($sources, $size_array, $image_src, $image_meta, $attachment_id){ //get some source info $src_path = get_attached_file($attachment_id); $src_root = trailingslashit(pathinfo($src_path, PATHINFO_DIRNAME)); //the actual image metadata (which might be altered here) $src_meta = wp_get_attachment_metadata($attachment_id); //an array of possible sizes to search through $sizes = $image_meta['sizes']; unset($sizes['thumbnail']); unset($sizes['medium']); unset($sizes['large']); $new = false; //loop through sources foreach($sources AS $k=>$v) { $name = wp_basename($v['url']); if(!file_exists("{$src_root}{$name}")) { //find the corresponding size foreach($sizes AS $k2=>$v2) { //we have a match! if($v2['file'] === $name) { //make it if(!$resized = image_make_intermediate_size( $src_path, $v2['width'], $v2['height'], $v2['crop'] )){ //remove from sources on failure unset($sources[$k]); } else { //add the new thumb to the true meta $new = true; $src_meta['sizes'][$k2] = $resized; } //remove from the sizes array so we have //less to search next time unset($sizes[$k2]); break; }//match }//each size }//each 404 }//each source //if we generated something, update the attachment meta if($new) wp_update_attachment_metadata($attachment_id, $src_meta); return $sources; } add_filter('wp_calculate_image_srcset', 'bi_wp_calculate_image_srcset', 10, 5); не function bi_wp_calculate_image_srcset($sources, $size_array, $image_src, $image_meta, $attachment_id){ //get some source info $src_path = get_attached_file($attachment_id); $src_root = trailingslashit(pathinfo($src_path, PATHINFO_DIRNAME)); //the actual image metadata (which might be altered here) $src_meta = wp_get_attachment_metadata($attachment_id); //an array of possible sizes to search through $sizes = $image_meta['sizes']; unset($sizes['thumbnail']); unset($sizes['medium']); unset($sizes['large']); $new = false; //loop through sources foreach($sources AS $k=>$v) { $name = wp_basename($v['url']); if(!file_exists("{$src_root}{$name}")) { //find the corresponding size foreach($sizes AS $k2=>$v2) { //we have a match! if($v2['file'] === $name) { //make it if(!$resized = image_make_intermediate_size( $src_path, $v2['width'], $v2['height'], $v2['crop'] )){ //remove from sources on failure unset($sources[$k]); } else { //add the new thumb to the true meta $new = true; $src_meta['sizes'][$k2] = $resized; } //remove from the sizes array so we have //less to search next time unset($sizes[$k2]); break; }//match }//each size }//each 404 }//each source //if we generated something, update the attachment meta if($new) wp_update_attachment_metadata($attachment_id, $src_meta); return $sources; } add_filter('wp_calculate_image_srcset', 'bi_wp_calculate_image_srcset', 10, 5); не function bi_wp_calculate_image_srcset($sources, $size_array, $image_src, $image_meta, $attachment_id){ //get some source info $src_path = get_attached_file($attachment_id); $src_root = trailingslashit(pathinfo($src_path, PATHINFO_DIRNAME)); //the actual image metadata (which might be altered here) $src_meta = wp_get_attachment_metadata($attachment_id); //an array of possible sizes to search through $sizes = $image_meta['sizes']; unset($sizes['thumbnail']); unset($sizes['medium']); unset($sizes['large']); $new = false; //loop through sources foreach($sources AS $k=>$v) { $name = wp_basename($v['url']); if(!file_exists("{$src_root}{$name}")) { //find the corresponding size foreach($sizes AS $k2=>$v2) { //we have a match! if($v2['file'] === $name) { //make it if(!$resized = image_make_intermediate_size( $src_path, $v2['width'], $v2['height'], $v2['crop'] )){ //remove from sources on failure unset($sources[$k]); } else { //add the new thumb to the true meta $new = true; $src_meta['sizes'][$k2] = $resized; } //remove from the sizes array so we have //less to search next time unset($sizes[$k2]); break; }//match }//each size }//each 404 }//each source //if we generated something, update the attachment meta if($new) wp_update_attachment_metadata($attachment_id, $src_meta); return $sources; } add_filter('wp_calculate_image_srcset', 'bi_wp_calculate_image_srcset', 10, 5); не function bi_wp_calculate_image_srcset($sources, $size_array, $image_src, $image_meta, $attachment_id){ //get some source info $src_path = get_attached_file($attachment_id); $src_root = trailingslashit(pathinfo($src_path, PATHINFO_DIRNAME)); //the actual image metadata (which might be altered here) $src_meta = wp_get_attachment_metadata($attachment_id); //an array of possible sizes to search through $sizes = $image_meta['sizes']; unset($sizes['thumbnail']); unset($sizes['medium']); unset($sizes['large']); $new = false; //loop through sources foreach($sources AS $k=>$v) { $name = wp_basename($v['url']); if(!file_exists("{$src_root}{$name}")) { //find the corresponding size foreach($sizes AS $k2=>$v2) { //we have a match! if($v2['file'] === $name) { //make it if(!$resized = image_make_intermediate_size( $src_path, $v2['width'], $v2['height'], $v2['crop'] )){ //remove from sources on failure unset($sources[$k]); } else { //add the new thumb to the true meta $new = true; $src_meta['sizes'][$k2] = $resized; } //remove from the sizes array so we have //less to search next time unset($sizes[$k2]); break; }//match }//each size }//each 404 }//each source //if we generated something, update the attachment meta if($new) wp_update_attachment_metadata($attachment_id, $src_meta); return $sources; } add_filter('wp_calculate_image_srcset', 'bi_wp_calculate_image_srcset', 10, 5); 

Фактически, add_image_size() не генерирует миниатюру, он просто регистрирует размер изображения, доступный для WordPress.

Как правило, миниатюры генерируются при первом загрузке изображения. Это автоматический процесс, поэтому вам не придется беспокоиться о его создании позже. Подумайте об этом таким образом – если для создания миниатюры на медленном сервере требуется 1-2 секунды, и вы ждете, пока это не будет запрошено, вы заставите запрашивающего ждать до 1-2 секунд на изображение для просмотра содержимого. Гораздо проще сделать это заблаговременно – т.е. когда изображение загружено.

В то же время, если вы абсолютно должны обработать эскизы в другое время, вы можете взглянуть на плагин Vener's Regenerate Thumbnails . Он использует действие по требованию для восстановления всех ваших эскизов изображений … но вы можете использовать похожий код для генерации эскизов только тогда, когда это необходимо.

Вы можете использовать мой плагин (не Ottos) «Динамическое изменение размера изображения» 1) .

«Динамическое изменение размера изображения» – это плагин WordPress (MU-), который предлагает короткий код и тег шаблона для изменения размеров изображений «на полете» без использования TimThumb, но с основными функциями WP.

Плагин содержит тег шаблона и короткий код .

1) Только что узнал о плагине Оттоса. Столкновение имен не предназначалось.

Вы можете попробовать этот плагин: https://wordpress.org/plugins/optimize-images-resizing

Он изменяет размеры изображений на основе зарегистрированного размера изображения, но только при необходимости. Также можно очистить существующие размеры изображений, чтобы они могли регенерировать.

Есть способ запустить add_image_size только при необходимости?

Не совсем. Но вы можете отфильтровать список зарегистрированных размеров прямо перед созданием эскизов. Функция wp_generate_attachment_metadata () (которая вызывает функцию, которая генерирует миниатюры) имеет фильтр под названием «intermediate_image_sizes_advanced», который позволяет вам манипулировать массивом размеров непосредственно перед созданием файлов. Вы можете использовать этот фильтр всякий раз, когда вы добавляете изображение определенного «типа», а затем удаляете его сразу же после.

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

Плагин WP Performance Pack предлагает «улучшенную обработку изображений», которая основана на Ottos Dynamic Image Resizer, но включает в себя множество улучшений, например: во-первых, она совместима с последней версией WordPress (3.9.1), использует WP_Image_Editor, сохранение эскизов может (но их можно кэшировать, а поддержка CDN – в режиме ist), включить регенерацию Thumbails (удалить существующие эскизы) и еще несколько.

Вы можете попробовать также Aqua Resizer – https://github.com/syamilmj/Aqua-Resizer/

Это всего лишь один файл.

Вы можете использовать его следующим образом:

 $img_src = aq_resize( $img_src, $width = null, $height = null, $crop = null, $single = true, $upscale = false ); $img_src = aq_resize( $img_src, 150, 150); // resized $img_src = aq_resize( $img_src, 150, 150, true); // cropped $img_src = aq_resize( $img_src, 150, 150, null, null, true); // image with 120x120 for example will be upscaled up to 150x150 

Здесь еще один подход: его перехватывает обработку ошибок HTTP 404. То есть, когда эскиз недоступен, найдите исходное изображение и создайте миниатюру. Обратите внимание, что это действительно не решает вашу проблему, так как при загрузке она не предотвращает генерации эскизов.

Также обратите внимание, что этот плагин может использоваться злоумышленниками для создания любого количества миниатюр и, следовательно, для исчерпания дискового пространства.

Примечание. Этот плагин можно легко установить с помощью Pluginception .

 <?php /* Plugin Name: Create thumbnails on demand Plugin URI: Description: Create thumbnails instead of showing 404. Use in combination with "Broken Link Checker" to create all missing thumbnails. Version: 0.1 Author: Jack Miller Author URI: License: License URI: */ add_filter('status_header', 'createThumbIf404'); function createThumbIf404($httpCodeString) //eg HTTP/1.1 200 OK { global $wp_query; error_reporting(E_ALL); ini_set('display_errors', 1); $httpCode = explode(" ", $httpCodeString); $httpCode = $httpCode[1]; if ($httpCode == "404") { $requestUri = $_SERVER["REQUEST_URI"]; $regex = '/^\/(wp-content\/uploads\/(?:[a-zA-Z0-9]*\/){2})(.*)-(.*)x(.*)\.jpg$/'; preg_match($regex, $requestUri, $groups); if (sizeof($groups) === 5) { $baseDir = $groups[1]; $baseName = $groups[2]; $sizeX = $groups[3]; $sizeY = $groups[4]; $oriImg = ctod_checkFile($baseDir, $baseName); if ($oriImg != null) { $image = wp_get_image_editor($baseDir . $oriImg); if (!is_wp_error($image)) { $image->resize($sizeX, $sizeY, true); $thumb = $baseDir . $baseName . '-' . $sizeX . 'x' . $sizeY . '.jpg'; $image->save($thumb); ctod_sendImageAndExit($thumb); } } } } } //finds original image within $baseDir with $baseName. //Returns file name including extension of original image or null. function ctod_checkFile($baseDir, $baseName) { $arr = array( ".jpg", ".JPG", ".jpeg", ".JPEG" ); foreach ($arr as &$ext) { if (file_exists($baseDir . $baseName . $ext)) { return $baseName . $ext; } } return null; } //Read file at $path from disk and return it as HTTP JPG image request. function ctod_sendImageAndExit($path) { $fp = fopen($path, 'rb'); header("Content-Type: image/jpeg"); header("Content-Length: " . filesize($path)); fpassthru($fp); exit(); }