Создавать миниатюры только для избранных изображений

10

Я хотел бы знать, если есть простой способ (пользовательский код или плагин) для создания миниатюр размеров только для изображений, которые я намерен использовать в качестве рекомендуемых изображений (index.php, archive.php и т. Д.), Но не для изображений используется в сообщениях (single.php). Моя главная цель - уменьшить использование серверного пространства, не создавая миниатюры, которые моя тема никогда не будет использовать.

Мои миниатюры на самом деле имели бы только два размера, ширину 720px и ширину 328px, а популярные изображения шириной 720px (только для домашней страницы) также имели бы ширину 328px (для archive.php и sidebar.php)

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

Я бы предпочел собственный код над плагинами, но плагин был бы приемлемым. Я знаю, что есть некоторые плагины для изменения размера изображения, но они давно не обновлялись (TimThumb, Dynamic Image Resizer ).

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


РЕДАКТИРОВАТЬ: мне нужно удалить или предотвратить миниатюры для изображений внутри сообщения, а не для избранных изображений, то есть:

(1) Главное изображение : дополнительные эскизы, автоматически сгенерированные WP, в порядке.

(2) Изображения, используемые внутри постов : загрузите оригинальное изображение и не создавайте никаких дополнительных размеров. Я буду обрезать, изменять размер и оптимизировать изображение перед его загрузкой, и один размер будет соответствовать моим потребностям.

imrek
источник
1
Во-первых, это говорит о возможном дублировании ; во-вторых, это может помочь вам решить вашу проблему, потому что вы, возможно, сможете сделать ее соответствующей вашим потребностям; И последнее, но не менее важное: есть ответ на плагин »Dynamic Image Resizer«, хотя он и другой.
Николай
2
Нет времени углубляться в это, но то, что вы знаете, это миниатюрный идентификатор - мета-ключ: _thumbnail_id- которого должно быть достаточно на самом деле, save_postи подобные ловушки могут быть подходящим способом. Но не забывайте, что эти изображения в вашем сообщении могут быть использованы в других сообщениях в качестве миниатюры, вы можете захотеть иметь механизм для учета этого.
Николай
1
Учитывая то, что вы написали, вы не возражаете против дополнительных размеров для показанного изображения, я подумал: если вы знаете, к какому из прикрепленных изображений относится уменьшенное / опубликованное изображение, то вы можете удалить дополнительные размеры изображений для других , исключив показанное изображение из этого процесса. Я упоминал одно возможное ограничение / недостаток ранее.
Николай
1
Предложение: полностью отключите изменение размера с помощью, add_filter('intermediate_image_sizes_advanced', '__return_false')а затем измените размер миниатюры на лету с Glide
gmazzap

Ответы:

2

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

function lazy_image_size($image_id, $width, $height, $crop) {
    // Temporarily create an image size
    $size_id = 'lazy_' . $width . 'x' .$height . '_' . ((string) $crop);
    add_image_size($size_id, $width, $height, $crop);

    // Get the attachment data
    $meta = wp_get_attachment_metadata($image_id);

    // If the size does not exist
    if(!isset($meta['sizes'][$size_id])) {
        require_once(ABSPATH . 'wp-admin/includes/image.php');

        $file = get_attached_file($image_id);
        $new_meta = wp_generate_attachment_metadata($image_id, $file);

        // Merge the sizes so we don't lose already generated sizes
        $new_meta['sizes'] = array_merge($meta['sizes'], $new_meta['sizes']);

        // Update the meta data
        wp_update_attachment_metadata($image_id, $new_meta);
    }

    // Fetch the sized image
    $sized = wp_get_attachment_image_src($image_id, $size_id);

    // Remove the image size so new images won't be created in this size automatically
    remove_image_size($size_id);
    return $sized;
}

Это "ленивый", потому что изображения не генерируются, пока они не нужны.

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

Суть: https://gist.github.com/mtinsley/be503d90724be73cdda4

Мэтью Тинсли
источник
0

Вы можете увидеть эту ссылку . там есть такой пример, как

add_action( 'after_setup_theme', 'baw_theme_setup' );
function baw_theme_setup() {
  add_image_size( 'category-thumb', 300 ); // 300 pixels wide (and unlimited height)
  add_image_size( 'homepage-thumb', 220, 180, true ); // (cropped)
}
Якир Хоссейн
источник
2
Мне нужны эскизы только для определенных изображений, а не для всего, что я загружаю. В основном, когда я загружаю изображение, я хочу контролировать, созданы ли эскизы или нет.
imrek
но почему? проблема с объемом памяти? действительно трудно представить это, когда есть так много места для хранения.
Aequalsb
0

1. Перейдите на панель инструментов> Настройки> Мультимедиа
2. Снимите флажок Обрезать миниатюру до точных размеров (обычно эскизы пропорциональны)
3. Введите 0 для всех входных данных (0 для всех размеров)
4. Добавьте их в functions.php

// Enable support for Post Thumbnails, and declare sizes.
add_theme_support( 'post-thumbnails' );
set_post_thumbnail_size( 400, 400, array("center","center") );
function fw_add_image_insert_override($sizes){
    // unset( $sizes['thumbnail']);
    unset( $sizes['small']);
    unset( $sizes['medium']);
    unset( $sizes['large']);
    return $sizes;
}
add_filter('intermediate_image_sizes_advanced', 'fw_add_image_insert_override' );

5. Убедитесь, что в вашем файле functions.php нет строчки кода. Начните с add_imge_size Примечание: я полагаю, что вы используете размер 400x400 для миниатюры. Теперь, когда вы загружаете фотографию, она будет создавать только 2 версии, а не как минимум 4 версии фото. как и раньше.

Транг
источник
0

Привет - у меня была похожая проблема. Woocommerce использует изображения каталогов для каталогов и связанных изображений продуктов. Это не идеально, потому что вы теряете ни качество изображения, ни скорость. Поэтому я попытался добавить четвертую категорию изображений для своих сопутствующих товаров. Хауди МакГи решил проблему. Пожалуйста, взгляните на ответ Howdy McGees:

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

Это сработало великолепно для моих нужд. Для вашей проблемы может быть применена та же логика. Надеюсь это поможет. С уважением - Тео

Я нашел решение, которое работает. 1. шаг: назначьте новый размер миниатюры в вашем functions.php. Проверьте ссылку: wp codex !

/*add your custom size*/
add_action( 'after_setup_theme', 'your_theme_setup' );
function your_theme_setup() {
add_image_size( 'your-thumb', 123, 123, true );//insert your values
}

Примечание: «ваш большой палец», вы будете использовать это имя позже

  1. шаг: Затем добавьте следующий код, где вы хотите отобразить ваши рекомендуемые продукты:

    <h1>featured products</h1> 
    <div class="woocommerce">
    <ul class= "products">
    
    <?php
    $args = array( 'post_type' => 'product', 'meta_key' => '_featured','posts_per_page' => 4,'columns' => '4', 'meta_value' => 'yes' );
     $loop = new WP_Query( $args );
    
     while ( $loop->have_posts() ) : $loop->the_post(); global $product; ?>
    
                    <li class="product post-<?php echo get_the_ID(); ?>">    
                        <a href="<?php echo get_permalink( $loop->post->ID ) ?>" title="<?php echo esc_attr($loop->post->post_title ? $loop->post->post_title : $loop->post->ID); ?>">
    
                            <?php woocommerce_show_product_sale_flash( $post, $product ); ?>
                            <?php if (has_post_thumbnail( $loop->post->ID )) echo get_the_post_thumbnail($loop->post->ID, 'your-thumb'); else echo '<img src="'.woocommerce_placeholder_img_src().'" alt="Placeholder" width="123px" height="123px" />'; ?></a>
                            <h3><?php the_title(); ?></h3><span class="price"><?php echo $product->get_price_html(); ?></span>
    
                    </li>
    
    <?php endwhile; ?>
    <?php wp_reset_query(); ?> 
    </ul>
    </div>

Ссылка и информация: не хватило репутации для третьей ссылки, извините (www.haloseeker.com/display-woocommerce-featured-products-without-a-shortcode/) Я поместил ее в index.php (моя домашняя страница) wootheme mystile , Не забудьте использовать «ваш большой палец» в строке:

<?php if (has_post_thumbnail( $loop->post->ID )) echo get_the_post_thumbnail($loop->post->ID, 'your-thumb'); else echo '<img src="'.woocommerce_placeholder_img_src().'" alt="Placeholder" width="123px" height="123px" />'; ?></a>
  1. шаг: восстановить эскизы, используйте плагин https://wordpress.org/plugins/regenerate-thumbnails/

  2. обновить браузер и проверить дом и сравнить значения

В зависимости от вашей темы вы можете изменить разметку и имена классов. Я тестирую вышеупомянутый метод, и он работает хорошо. Единственное, что я пока не смог сделать, это добавить кнопку «добавить в корзину», потому что я не знаю, как записать переменную в шорткод кнопки «Добавить в корзину». Это код:

<?php echo do_shortcode('[add_to_cart id="variable number?"]'); ?>

Надеюсь, это поможет. Существует, безусловно, более элегантный способ сделать это. Например, с функцией в functions.php

С уважением

timholz
источник
0

Чтобы WordPress не создавал дополнительные размеры только для определенных изображений, вам необходимо указать, что изображение, которое ВЫ НАДО загружать, будет использоваться только для определенных целей. это должно произойти, прежде чем вы загрузили его.

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

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

Вы не можете использовать свои собственные конкретные размеры, как это? the_post_thumbnail( array(100, 100) );

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

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

  1. CSS: вы можете добавлять записи в свою таблицу стилей, например .post-entry img { max-width:200px; max-height:300px; }, это более универсально и эффективно, чем полагаться на размер самого изображения - ЭТО МНОГО времени фотошопа.

  2. Шаблон: вы можете изменить файл шаблона, в котором генерируется вывод HTML, и указать размер изображения следующим образом:

см. эту документацию на WordPress: https://codex.wordpress.org/Function_Reference/the_post_thumbnail

aequalsb
источник