Додати розмір зображення, якщо шаблон сторінки


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, який дозволяє визначати стільки розмірів зображення, скільки вам потрібно, але генерує зображення лише певного розміру, коли це потрібно. Так для вашого прикладу ескізи галереї будуть створені лише для зображень, що з’являються у шаблоні 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.