Запретить WordPress обрезать GIF-файлы


Есть ли какой-либо способ запретить WordPress обрезать файлы на основе их расширения. На самом деле, я хочу отключить обрезку для GIF-файлов, потому что после обрезки GIF-изображения...

  1. GIF-изображение не остается анимированным
  2. Даже если он останется анимированным, я не буду использовать эти маленькие размеры GIF.

Итак, есть ли способ отключить создание миниатюр (для GIF) в зависимости от того, какое расширение файла имеет изображение.

Author: fuxia, 2014-09-24

1 answers

Изменение размеров обычно легко выполняется с помощью крючка intermediate_image_sizes_advanced. Единственная проблема в том, что доступен только массив $sizes, поэтому этого достаточно для общего уровня, но не в том случае, если вы хотите сделать это условно. Информация, необходимая для этого условно, может быть собрана с помощью debug_backtrace - debug_backtrace однако с точки зрения производительности это несколько дорого. В любом случае, я полагаю, что это можно было бы сделать, как показано ниже:

add_action(
    'intermediate_image_sizes_advanced',
    'wpse162413_unset_sizes_if_gif'
);
function wpse162413_unset_sizes_if_gif( $sizes ) {
    // we're only having the sizes available
    // we're using debug_backtrace to get additional information
    $dbg_back = debug_backtrace();
    // scan $dbg_back array for function and get $args
    foreach ( $dbg_back as $sub ) {
        if ( $sub[ 'function'] == 'wp_generate_attachment_metadata' ) {
            $args = $sub[ 'args' ]; 
        }
    }
    // attachment id
    $att_id       = $args[0];
    // attachment path
    $att_path     = $args[1];
    // split up file information
    $pathinfo = pathinfo( $att_path );
    // if extension is gif unset sizes
    if ( $pathinfo[ 'extension' ] == 'gif' ) {
        // get all intermediate sizes
        $intermediate_image_sizes = get_intermediate_image_sizes();
        // loop trough the intermediate sizes array
        foreach ( $intermediate_image_sizes as $size ) {
            // unset the size in the sizes array
            unset( $sizes[ $size ] );
        }
    }
    // return sizes
    return $sizes;
}
 6
Author: Nicolai, 2015-04-22 08:10:17