Generuj miniatury tylko dla wyróżnionych zdjęć

10

Chciałbym wiedzieć, czy istnieje prosty sposób (niestandardowy kod lub wtyczka), aby utworzyć rozmiary miniaturek tylko dla obrazów, które zamierzam wykorzystać jako polecane obrazy (index.php, archive.php itp.), Ale nie dla obrazów używane w postach (single.php). Moim głównym celem jest zmniejszenie wykorzystania miejsca na serwerze, nie tworząc miniatur, których mój motyw nigdy nie użyje.

Moje miniatury w rzeczywistości miałyby tylko dwa rozmiary, szerokość 720px i szerokość 328px, a obrazki o szerokości 720px (tylko strona główna) miałyby również rozmiar 328px (dla archive.php i sidebar.php)

Obecnie jedynym programowym sposobem, jaki znam, jest generowanie miniaturek dla każdego przesłanego obrazu , co jest niepożądane, ponieważ większość moich przesyłanych obrazów to posty i musiałbym ręcznie usunąć wiele obrazów z serwera.

Wolałbym niestandardowy kod niż wtyczki, ale wtyczka byłaby do przyjęcia. Wiem, że istnieją pewne wtyczki do zmiany rozmiaru obrazu, ale nie były one aktualizowane od dłuższego czasu (TimThumb, Dynamic Image Resizer ).

Znalazłem również podobne pytanie tutaj na Wordpress SE, ale zaakceptowana odpowiedź tak naprawdę nie rozwiązuje mojego problemu.


EDYCJA: Muszę usunąć lub zablokować miniatury zdjęć w poście, a nie polecanych zdjęć, tj .:

(1) Wyróżniony obraz : dodatkowe miniatury generowane automatycznie przez WP są OK.

(2) Obrazy użyte w postach : Prześlij oryginalny obraz i nie generuj żadnych dodatkowych rozmiarów. Przed przesłaniem będę go przycinać, zmieniać rozmiar i optymalizować, a jeden rozmiar będzie pasował do moich potrzeb.

imrek
źródło
możliwy duplikat nowej wersji rozmiaru obrazu tylko dla pliku
polecanego
1
Po pierwsze, mówi możliwe duplikaty ; po drugie, może pomóc w rozwiązaniu problemu, ponieważ możliwe jest dostosowanie go do twoich potrzeb; ostatnią, ale nie mniej ważną kwestią jest odpowiedź na wtyczkę »Dynamic Image Resizer«, chociaż jest inna.
Nicolai
2
Nie ma czasu na zanurzenie się w nim, ale wiesz, co to jest miniatura id - klucz meta: _thumbnail_id-, który powinien wystarczyć, save_posta podobne haki mogą być dobrym rozwiązaniem. Ale nie zapominaj, że te obrazy w twoim poście mogą być użyte w innych postach jako miniatura, możesz chcieć mieć mechanizm, który to uwzględni.
Nicolai
1
Biorąc pod uwagę to, co napisałeś, nie masz nic przeciwko dodatkowym rozmiarom prezentowanego obrazu, pomyślałem bardziej: jeśli wiesz, który z załączonych obrazów to miniatura postu / polecany obraz, możesz usunąć dodatkowe rozmiary pozostałych , wykluczając wyróżniony obraz z tego procesu. Wspomniałem wcześniej o jednym możliwym ograniczeniu / wadzie.
Nicolai
1
Sugestia: wyłącz zmianę rozmiaru całkowicie za pomocą, add_filter('intermediate_image_sizes_advanced', '__return_false')a następnie zmień rozmiar miniatury w locie za pomocą Glide
gmazzap

Odpowiedzi:

2

Ta funkcja wygeneruje obraz, tymczasowo rejestrując rozmiar obrazu, generując obraz (jeśli to konieczne) i usuwając rozmiar, aby nowe obrazy nie były tworzone w tym rozmiarze.

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

Jest „leniwy”, ponieważ obrazy nie są generowane, dopóki nie są potrzebne.

W twoim przypadku użycia nazwałbyś to lazy_image_sizeidentyfikatorem miniatury postu, aby uzyskać obraz o pożądanym rozmiarze. Obraz zostanie wygenerowany przy pierwszym połączeniu. Kolejne wywołania pobierałyby istniejący obraz.

Gist: https://gist.github.com/mtinsley/be503d90724be73cdda4

Mathew Tinsley
źródło
0

Możesz zobaczyć ten link . jest taki przykład

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)
}
Jakir Hossain
źródło
2
Potrzebuję miniaturek tylko do niektórych zdjęć, a nie do wszystkiego, co przesyłam. Zasadniczo, kiedy przesyłam obraz, chcę kontrolować, czy miniatury są tworzone, czy nie.
imrek
ale dlaczego? czy miejsce na dysku stanowi problem? naprawdę trudno sobie wyobrazić, że przy tak dużej ilości miejsca do przechowywania.
aequalsb
0

1. Przejdź do Pulpitu nawigacyjnego> Ustawienia> Media 2.
Odznacz Przytnij miniaturę do dokładnych wymiarów (zwykle miniatury są proporcjonalne)
3. Wprowadź 0 dla wszystkich danych wejściowych (0 dla wszystkich rozmiarów)
4. Dodaj je do swoich funkcji. 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.Upewnij się, że w twoich funkcjach nie ma linii kodu. Zacznij od add_imge_size Uwaga: Przypuszczam, że używasz rozmiaru 400 x 400 dla swojej miniatury Teraz, gdy prześlesz zdjęcie, utworzą tylko 2 wersje zamiast co najmniej 4 wersji zdjęcia jak poprzednio.

Trang
źródło
0

aby uniemożliwić WordPressowi tworzenie dodatkowych rozmiarów tylko dla niektórych obrazów, musisz mieć sposób na wskazanie, że obraz, który PRZESYŁASZ, zostanie wykorzystany tylko do określonego celu. musi to nastąpić PRZED przesłaniem go.

ponieważ nie ma takiego interfejsu (gotowego do użycia) wskazującego takie opcje podczas operacji przesyłania, nie można zapobiec dodatkowemu generowaniu obrazu - chyba że istnieje wtyczka, która dodała tę funkcję.

ale dlaczego na świecie nie chcesz dodatkowych rozmiarów obrazu? nigdy nie wiadomo, kiedy możesz spotkać się z sytuacją, gdy chcesz użyć innego rozmiaru dowolnego obrazu. martwisz się o miejsce do przechowywania?

czy nie możesz użyć własnych specyfikacji rozmiaru takiego jak ten? the_post_thumbnail( array(100, 100) );

większość odpowiedzi i komentarzy, które przeczytałem tutaj, wyjaśnia, jak dostosować środowisko WordPress do rozmiarów obrazów, ale żadna z nich nie wspomina o tym warunkowo. poza tym żaden z nich nie odnosi się do faktu, że musisz być w stanie wskazać użycie obrazu przed jego przesłaniem.

jeśli próbujesz zrekompensować zbyt mały obraz lub zbyt duży obraz w poście, możesz użyć kilku rzeczy.

  1. CSS: możesz dodawać wpisy do arkusza stylów, takie jak: .post-entry img { max-width:200px; max-height:300px; }jest to bardziej uniwersalne i skuteczne niż poleganie na rozmiarze samego obrazu - TO DUŻO czasu na Photoshop.

  2. Szablon: możesz zmienić plik szablonu, w którym generowane są dane wyjściowe HTML i określić rozmiar obrazu:

zobacz tę dokumentację na WordPress: https://codex.wordpress.org/Function_Reference/the_post_thumbnail

aequalsb
źródło
0

Cześć - miałem podobny problem. WooCommerce używa obrazów katalogu do katalogów i powiązanych obrazów produktów. To nie jest idealne, ponieważ tracisz jakość obrazu lub szybkość. Próbowałem więc dodać czwartą kategorię zdjęć dla moich powiązanych produktów. Howdy McGee rozwiązał problem. Proszę spojrzeć na odpowiedź Howdy McGees:

Zmodyfikuj pokrewne rozmiary obrazu produktu: przeczytaj jego kod !

Sprawdziło się doskonale dla moich potrzeb. W przypadku twojego problemu można zastosować tę samą logikę. Mam nadzieję że to pomoże.

Pozdrowienia,

Theo

** Dodatek: **

Znalazłem rozwiązanie, które działa.

Krok 1: Przypisz nowy rozmiar miniatury w pliku functions.php. Sprawdź referencję: 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
}

Uwaga: „kciuk”, później użyjesz tej nazwy zmiennej

Krok 2: Następnie dodaj następujący kod wszędzie tam, gdzie chcesz wyświetlać polecane produkty:

    <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>

Odnośnik i informacje: ( www.haloseeker.com/display-woocommerce-featured-products-with--shortcode/ )

Umieściłem go w index.php (mojej stronie głównej) mistyle wootheme. Nie zapomnij użyć „kciuka” on-line:

<?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>

Krok 3: Ponownie wygeneruj miniatury, użyj wtyczki https://wordpress.org/plugins/regenerate-thumbnails/

Krok 4: Odśwież przeglądarkę, sprawdź DOM i porównaj wartości

W zależności od motywu możesz zmienić nazwy znaczników i klas. Przetestowałem powyższą metodę i działa ona dobrze.

Jedyne, czego do tej pory nie mogłem zrobić, to dodać przycisk „dodaj do koszyka”, ponieważ nie wiem, jak zapisać zmienną w skrócie przycisku „dodaj do koszyka”. To jest kod:

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

Mam nadzieję, że to pomoże.

Z pewnością jest to bardziej elegancki sposób. Na przykład z funkcją w pliku functions.php

Pozdrowienia,

Theo

timholz
źródło