Як генерувати ескізи лише при необхідності?


18

У мене 1000 зображень. Як я можу зробити wordpress для генерації великого пальця лише за потреби. Наприклад, домашній повзунок буде використовувати лише 10 зображень, я не хочу, щоб інші 1000 зображень створили цю мініатюру як марну трату місця та ресурсів.

Є спосіб звільнити add_image_size лише за потреби?

Спасибі

ОНОВЛЕННЯ Як ви вже згадували, насправді не додається_визначити, що потрібно для запуску. Що було б чудово - це створити розмір зображення, коли я використовую the_post_thumbnail ('slider-thumb'); Можливо, це уповільнення першого перегляду зображення, але це уявлення зазвичай генерується мною, коли я насправді переглядаю посаду, тому мені все одно.

Отже, між моїми повідомленнями, слайдером, мініатюрами блогу, мініатюрами портфоліо тощо я отримав 1000 зображень, і я хочу лише 10 зображень змінити розмір для слайдера, я бачу багато витрачених ресурсів, щоб генерувати розмір мініатюр для інших 990 зображень.

Сподіваюсь, це ясно зараз, вибачте за мою англійську


2
Як ескізи генеруються з додаткових 990 зображень більше марно витраченого простору та ресурсів, ніж 990 невикористаних зображень? Чи не було б більше сенсу завантажувати лише ті зображення, які ви активно використовуєте?
SickHippie

Хоча більш кваліфіковані програмісти представляють вагомі аргументи проти вашої ідеї, я вважаю це цікавим. Я бачив деякі плагіни та теми, які завантажують зображення, не генеруючи великі пальці (не впевнений, який зараз). Але мій великий сумнів у вашому питанні: коли це вам знадобиться? . Який буде фільтр?
brasofilo

1
Ви мене неправильно зрозуміли. Я використовую 990 зображень у публікаціях, я просто не використовую домашній повзунок. Деяким з них мені потрібні великі пальці для портфоліо, іншим для великих пальців блогу тощо
chifliiiii

Відповіді:


12

Погляньте на плагін Otto's Dynamic Image Resizer

Цей плагін змінює спосіб створення WordPress образів, щоб змусити генерувати зображення лише тоді, коли вони фактично використовуються десь, на льоту. Зображення, створені таким чином, будуть збережені у звичайних каталогах для завантаження для подальшого швидкого надсилання веб-сервером. Результат полягає в тому, що простір економиться (оскільки зображення створюються лише за потреби), а завантаження зображень відбувається набагато швидше (оскільки це більше не генерує зображення під час завантаження).


2
Зауважте, що цей плагін має проблеми з додаванням зображень до старих публікацій. Пластики вітаються.
Отто

Саме це я шукав. Я спробую. Так це працює лише на нових посадах?
чифлііііі

1
Для тих , хто прибуває на цю посаду нині, ось подібний плагін , який , як видається, активно розвивається: wordpress.org/plugins/fly-dynamic-image-resizer
Тім Malone

7

Помістіть це у файл своїх тем. Це не дозволить Wordpress створювати нічого, крім трьох розмірів за замовчуванням при завантаженні.

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

        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']
            );
        }

Цей файл повинен бути стандартним у WordPress. Навіщо генерувати кожен розмір для кожного зображення? Я додаю цей код до своїх власних тем. Спасибі
Michaelkay

2
Приємно, але тепер він все ще створить усі зображення, якщо мені потрібен лише один нестандартний розмір ..
Gijs

Це трапляється, коли я використовую об’єкти зображень із розширених спеціальних полів
Gijs

Не працює, якщо раніше значення add_image_size було визначено із зміненими розмірами зображення
Benjamin Intal,

@Michaelkay в такому підході передбачено покарання за ефективність. Коли зображення завантажуються та генеруються для будь-якого розміру, означає, що завантажувач - це той, хто терпляче. Цей код змушує ваших відвідувачів мати більше терпіння, а Google перевірив, що на завантаження сайтів потрібно більше 2-х секунд, це знижує 50% людей. Крім того, якщо ваш сайт має сотні одночасних відвідувань, це зніме ваші сервери.
Том Роджеро

2

На жаль @ відповідь Патріка порушує функції 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);

Лише голова, щоб ви могли знати, що це буде зламати важко! На це знадобилися години, щоб дізнатися, що це винуватця. Я працюю над рішенням ...
Константин Грос

1

Насправді, add_image_size() мініатюра не генерує, вона просто реєструє розмір зображення, як це доступно для WordPress.

Як правило, ескізи створюються під час першого завантаження зображення. Це автоматичний процес, тому вам не доведеться турбуватися про їх створення пізніше. Подумайте про це таким чином - якщо для створення мініатюри на повільному сервері потрібні 1-2 секунди, і ви дочекаєтеся, поки це вимагається, ви змушуєте запитувача чекати додаткові 1-2 секунди на зображення щоб побачити вміст. Набагато простіше це зробити достроково - тобто при завантаженні зображення.

У той же час, якщо ви абсолютно зобов’язані обробляти ескізи в інший час, ви можете поглянути на плагін Viper's Regenerate Thumbnails . Він використовує дію на вимогу для відновлення всіх ескізів вашого зображення ... але ви можете використовувати аналогічний код для створення мініатюр лише за потреби.


Я думаю, ти не зрозумів. Він хоче контролювати, для яких зображень потрібні ескізи. Тому деякі зображення взагалі не потрібно змінювати.
П’яний майстер

Більшість людей тестують сторінки, коли вставляють фотографії (я думаю, що я цілком заощаджую, кажучи про все). Вони спричинить генерацію необхідних файлів, які були колись і ваші. У моєму випадку у мене зареєстрований розмір зображення заголовка. Близько 1 з 20 зображень, які я завантажую, насправді є заголовком. Тож 19 з 20 зображень у моїй бібліотеці - це марно витрачаючи місце.
JpaytonWPD

1

Є спосіб звільнити add_image_size лише за потреби?

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

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


Мені доведеться додати параметр або прапорець, коли я завантажую медіа, щоб вибрати, які пальці я хочу створити, наприклад. Звучить добре, але я не
знаю,

1

Ви можете використовувати мій (не Ottos) плагін "Dynamic Image Resize" 1) .

"Dynamic Resize Image" - плагін WordPress (MU-), який пропонує короткий код і тег шаблону для зміни розміру зображень "у польоті" без необхідності TimThumb, але з основними функціями WP.

Плагін поставляється з тегом шаблону та коротким кодом .

1) Щойно дізнався про плагін Ottos. Називати зіткнення не передбачалося.


1

Ви можете спробувати цей плагін: https://wordpress.org/plugins/optimize-images-resizing

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


0

Плагін WP Performance Pack пропонує "покращену обробку зображень", засновану на Ottos Dynamic Image Resizer, але включає багато вдосконалень, наприклад: Перш за все сумісний з останньою версією WordPress (3.9.1), використовує WP_Image_Editor, економлячи ескізи бути вимкнено (але їх можна кешувати, і підтримка CDN перебуває в режимі історії), відновити інтеграцію мініатюр (для видалення наявних ескізів) та деякі інші.


-1

Ви можете спробувати також 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

-1

Тут є ще один підхід: його приєднання до обробки помилок 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) //e.g. 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();
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.