Добавьте размер изображения, если шаблон страницы


13

Я создаю сайт членов с WordPress Multisite. Можно ли ограничить количество создаваемых изображений в зависимости от выбранного шаблона?

Я пробовал следующие строки кода для создания определенных изображений в шаблоне галереи:

// Generate on all uploads
add_theme_support('post-thumbnails');
set_post_thumbnail_size( 1440, 350, true ); 
add_image_size( 'standard_box', 450, 215, true );
add_image_size( 'default_image', 691, 9999 );

// Generate on gallery template only
if ( is_page_template('page-gallery.php') ) {
add_image_size( 'gallery', 900, 9999 );
add_image_size( 'gallery_thumb', 450, 450, true );
}

Это не сработало. Я провел некоторое исследование и не могу найти что-нибудь по этому вопросу. Если бы вы могли указать мне правильное направление, я был бы очень благодарен.


1
Существует также Otto Dynamic Image Resizer, который позволяет вам определять столько размеров изображения, сколько вы хотите, но генерирует изображение только определенного размера, когда это необходимо. Так что для вашего примера миниатюры галереи будут создаваться только для изображений, которые отображаются в шаблоне page-gallery.php.
helgatheviking

2
Просто хочу упомянуть другие два замечательных варианта: динамическое изменение размера изображения @ kaiser и сервис Photon в JetPack.
Birgire

Ответы:


13

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

Я вижу логику ваших усилий - проблема в том, что add_image_sizeдействительно вступает в игру только в момент загрузки. Как таковой, is_page_template(..)всегда будет false.

Быстрый Google выкопал Aqua Resizer , скрипт, разработанный для решения этой проблемы. Вместо использования add_image_sizeвы используете aq_resizeнепосредственно в своей теме, и если размер изображения не существует, он создается и кэшируется на лету.

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

Кроме того, как упомянул @Waqas, использование Aqua Resizer оставит потерянные файлы, когда вы удалите изображение из медиатеки. С моей техникой все файлы будут удалены, так как они сохраняются в базе данных и распознаются WordPress.

/**
 * Resize internally-registered image sizes on-demand.
 *
 * @link    http://wordpress.stackexchange.com/q/139624/1685
 * 
 * @param   mixed   $null
 * @param   int     $id
 * @param   mixed   $size
 * @return  mixed
 */
function wpse_139624_image_downsize( $null, $id, $size ) {
    static $sizes = array(
        'post-thumbnail' => array(
            'height' => 350,
            'width'  => 1440,
            'crop'   => true,
        ),

        'standard_box' => array(
            'height' => 215,
            'width'  => 450,
            'crop'   => true,
        ),

        'default_image' => array(
            'height' => 9999,
            'width'  => 691,
            'crop'   => false,
        ),

        'gallery' => array(
            'height' => 900,
            'width'  => 9999,
            'crop'   => false,
        ),

        'gallery_thumb' => array(
            'height' => 450,
            'width'  => 450,
            'crop'   => true,
        ),
    );

    if ( ! is_string( $size ) || ! isset( $sizes[ $size ] ) )
        return $null;
    if ( ! is_array( $data = wp_get_attachment_metadata( $id ) ) )
        return $null;
    if ( ! empty( $data['sizes'][ $size ] ) )
        return $null;
    if ( $data['height'] <= $sizes[ $size ]['height'] && $data['width'] <= $sizes[ $size ]['width'] )
        return $null;
    if ( ! $file = get_attached_file( $id ) )
        return $null;

    $editor = wp_get_image_editor( $file );

    if ( ! is_wp_error( $editor ) ) {
        $data['sizes'] += $editor->multi_resize(
            array(
                $size => $sizes[ $size ],
            )
        );

        wp_update_attachment_metadata( $id, $data );
    }

    return $null;
}

add_filter( 'image_downsize', 'wpse_139624_image_downsize', 10, 3 );

И на практике:

wp_get_attachment_image( $id, 'gallery' ); // Resized if not already
wp_get_attachment_image_src( $id, 'standard_box' ); // Resized if not already
the_post_thumbnail(); // You get the idea!
// And so forth!

Я собираюсь превратить это в плагин, который автоматически преобразует все add_image_sizeвызовы в изменение размера по требованию, так что следите за этим!


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

2
Я дал этому попробовать the_post_thumbnail (); и работает отлично. Одна проблема: когда я удаляю изображение, оно оставляет то, которое было изменено вашим скриптом. Есть идеи?
Сэм

5


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


Дополнительная информация по этой теме по разработке Wordpress:

Примечание: список не упорядочен и не является исчерпывающим.


3

Если вы хотите создавать большие пальцы на лету, вы можете использовать акваизайзер изображений Aqua , но у этого мини-скрипта есть недостаток. Созданные превью не будут удалены при удалении изображения из библиотеки. Но это не имеет большого значения. При необходимости вы можете сделать это с помощью команд SHH


1
Хороший вопрос о том, что файлы не удаляются. Мое решение не пострадает от этого! (см. обновленный ответ).
TheDeadMedic

1

Это не прямой ответ на вашу проблему. Но я помогу вам сделать имидж в соответствии с вашими потребностями.

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

Таким образом, ваш код не будет генерировать новые изображения для функции is_page_template.

Но вы можете использовать простой класс php для решения вашей проблемы ... это известный класс php, который используется для многих премиальных тем для WordPress. Это называется Aqua-Resizer.

Вы можете найти более подробную информацию здесь https://github.com/syamilmj/Aqua-Resizer Wiki: https://github.com/syamilmj/Aqua-Resizer/wiki

Проблема, которая может возникнуть:

Эта функция работает таким образом ....

<?php aq_resize( $url, $width, $height, $crop, $single ) ?>

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

<?php 
$thumb = wp_get_attachment_url( get_post_thumbnail_id($post->ID), 'full' ); if($thumb){ $url = aq_resize( $thumb, 400, 200, true, true ); if(!$url){ $url = WPM_DIR.'/assets/images/demo/wrong_image_size.jpg'; } }else{ $url = WPM_DIR.'/assets/images/demo/400x200_no_feature_image.jpg'; } 
?>

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

PS: этот класс php использует ядро ​​WordPress, поэтому проблем с безопасностью нет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.