Dodaj rozmiar obrazu, jeśli szablon strony


13

Tworzę witrynę dla członków za pomocą WordPress Multisite. Czy można ograniczyć liczbę generowanych obrazów w zależności od wybranego szablonu?

Próbowałem następujących wierszy kodu, aby wygenerować pewne obrazy w szablonie galerii:

// 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 );
}

To nie zadziałało. Przeprowadziłem badania i nie mogę znaleźć niczego na ten temat. Jeśli mógłbyś wskazać mi właściwy kierunek, bardzo bym to docenił.


1
Dostępny jest również Otto Dynamic Image Resizer, który pozwala zdefiniować tyle rozmiarów obrazu, ile chcesz, ale generuje obraz o określonym rozmiarze tylko wtedy, gdy jest potrzebny. SO dla twojego przykładu miniatury galerii byłyby generowane tylko dla obrazów, które pojawiają się w szablonie page-gallery.php.
helgatheviking

2
Chcę tylko wspomnieć o dwóch innych świetnych opcjach: Dynamic Image Resize @ kaiser i usłudze Photon w JetPack.
birgire

Odpowiedzi:


13

To zawsze było dla mnie problemem - brakiem zmiany rozmiaru obrazu na żądanie i kolejną liczbą plików, z którymi możesz skończyć, jeśli masz dużo rozmiarów!

Widzę logikę twoich wysiłków - problem polega na tym, add_image_sizeże naprawdę wchodzi w grę dopiero w momencie przesłania. Jako taki is_page_template(..)zawsze będzie false.

Szybki Google wykopał Aqua Resizer , skrypt zaprojektowany w celu rozwiązania tego problemu. Zamiast używać add_image_size, używasz aq_resizebezpośrednio w swoim motywie, a jeśli rozmiar obrazu nie istnieje, jest on tworzony i buforowany w locie.

W rzeczywistości zastosowałem podobną, choć inną, technikę w kilku witrynach o wielu rozmiarach obrazu. Nadal oszczędzasz na generowaniu WordPressa, generując każdy rozmiar dla każdego przesłanego obrazu - są one generowane w locie (i buforowane), kiedy i kiedy są wymagane. Różni się tym, że możesz po prostu korzystać ze wszystkich standardowych funkcji obrazu WP i tagów szablonów, tak jak zwykle!

Ponadto, jak wspomniano @Waqas, użycie Aqua Resizer pozostawi osierocone pliki po usunięciu obrazu z biblioteki multimediów. Dzięki mojej technice wszystkie pliki zostaną usunięte, ponieważ są zapisywane w bazie danych i rozpoznawane przez 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 );

A w praktyce:

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!

Mam zamiar przekształcić to w wtyczkę, która automatycznie konwertuje wszystkie add_image_sizepołączenia na zmiany rozmiaru na żądanie, więc uważaj na to miejsce!


Dziękujemy za poświęcenie czasu na pozostawienie tak doskonałej odpowiedzi. Z pewnością dam temu szansę. Ważne jest, aby uzyskać to zaraz przed otwarciem serwera dla wielu użytkowników. W razie dalszych pytań dam ci krzyk.
Sam

2
Wypróbowałem to za pomocą the_post_thumbnail (); i działa idealnie. Jeden problem: kiedy usuwam obraz, pozostawia ten, który został przeskalowany przez twój skrypt. Jakieś pomysły?
Sam

5


Zastrzeżenie:
- To nie jest właściwie odpowiedź.
- To jest przeznaczone do pomóc w dalszych badań na ten temat.
- Poza tym to jest odzwierciedleniem - przynajmniej filcu - ostatnio częstszego występowania podobnych pytań dotyczących podobnych problemów.


Dodatkowe informacje dotyczące tego tematu na temat rozwoju Wordpress:

Uwaga: lista nie jest w żaden sposób uporządkowana i wyczerpująca.


3

Jeśli chcesz tworzyć kciuki w locie, możesz użyć Aqua Image Resizer , ale ten mini skrypt ma wadę. Utworzone kciuki nie zostaną usunięte po usunięciu obrazu z biblioteki. Ale to nie jest wielka sprawa. W razie potrzeby możesz to zrobić za pomocą poleceń SHH


1
Dobra uwaga, że ​​pliki nie są usuwane. Moje rozwiązanie tego nie ucierpi! (patrz zaktualizowana odpowiedź).
TheDeadMedic

1

To nie jest bezpośrednia odpowiedź na twój problem. Ale pomogę ci stworzyć obraz zgodnie z twoimi potrzebami.

Kiedy używasz add_image_size, nie zmienia on rozmiaru istniejących obrazów. działa tylko w przypadku nowych obrazów, które zostaną przesłane po dodaniu funkcji add_image_size.

Twój kod nie będzie generował nowych obrazów dla funkcji is_page_template.

Ale możesz użyć prostej klasy php, aby rozwiązać swój problem ... jest to słynna klasa php, która jest używana w wielu motywach premium dla WordPress. Nazywa się to Aqua-Resizer.

Więcej informacji można znaleźć tutaj https://github.com/syamilmj/Aqua-Resizer Wiki: https://github.com/syamilmj/Aqua-Resizer/wiki

Problem, który może się pojawić:

Ta funkcja działa w ten sposób ....

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

Kiedy więc nie można przyciąć (w przypadku małego obrazu określonego przez Ciebie wysokości lub szerokości), nic nie pokazuje. Możesz przezwyciężyć tę sytuację, sprawdzając, czy otrzymujesz wartość zerową po przekazaniu adresu URL w ramach tej funkcji bardzo łatwo, jak tutaj ....

<?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'; } 
?>

W ten sposób możesz zagwarantować, że określony obraz zostanie wygenerowany dla określonego szablonu strony, dzięki czemu Twoja witryna będzie znacznie czystsza.

PS: ta klasa php wykorzystuje system przycinania rdzenia WordPress, więc nie ma problemów z bezpieczeństwem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.