Tambahkan ukuran gambar jika templat halaman


13

Saya sedang membangun situs web anggota dengan WordPress Multisite. Apakah mungkin untuk membatasi berapa banyak gambar yang dihasilkan tergantung pada templat yang dipilih?

Saya telah mencoba baris kode berikut untuk menghasilkan gambar tertentu pada templat galeri:

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

Ini tidak berhasil. Saya telah melakukan riset dan sepertinya tidak dapat menemukan apa pun tentang masalah ini. Jika Anda bisa mengarahkan saya ke arah yang benar, saya akan sangat menghargainya.


1
Ada juga Dynamic Image Resizer Otto yang memungkinkan Anda menentukan ukuran gambar sebanyak yang Anda inginkan, tetapi hanya menghasilkan gambar pada ukuran tertentu ketika dibutuhkan. SO untuk contoh Anda thumbnail galeri hanya akan dihasilkan untuk gambar yang muncul pada halaman-gallery.php template.
Helgatheviking

2
Hanya ingin menyebutkan dua opsi hebat lainnya: @ Dynamic Image Resize dari @ kaiser dan layanan Photon di JetPack.
birgire

Jawaban:


13

Ini selalu menjadi momok bagi saya - kurangnya ukuran gambar berdasarkan permintaan, dan jumlah file selanjutnya yang bisa Anda dapatkan jika Anda memiliki banyak ukuran!

Saya dapat melihat logika di balik upaya Anda - masalahnya adalah, add_image_sizehanya benar-benar berperan saat pengunggahan. Karena itu, is_page_template(..)akan selalu ada false.

Google cepat menggali Aqua Resizer , sebuah skrip yang dirancang untuk mengatasi masalah ini. Daripada menggunakan add_image_size, Anda menggunakan aq_resizelangsung dalam tema Anda, dan jika ukuran untuk gambar tidak ada, itu dibuat dan di-cache saat itu juga.

Sebenarnya saya telah menggunakan teknik yang serupa, walaupun berbeda, pada beberapa situs dengan banyak ukuran gambar. Anda masih menyimpan overhead WordPress yang menghasilkan setiap ukuran untuk setiap gambar yang diunggah - mereka dihasilkan saat itu juga (& di-cache) saat dan ketika diminta. Perbedaannya adalah, Anda cukup menggunakan semua fungsi gambar standar dan tag templat WP seperti biasa!

Juga, seperti yang disebutkan @Waqas, menggunakan Aqua Resizer akan meninggalkan file yatim ketika Anda menghapus gambar dari perpustakaan media Anda. Dengan teknik saya, semua file akan dihapus, karena disimpan ke database & dikenali oleh 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 );

Dan dalam praktiknya:

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!

Saya bermaksud mengubah ini menjadi sebuah plugin yang secara otomatis akan mengubah semua add_image_sizepanggilan menjadi pengubahan ukuran sesuai permintaan, jadi perhatikan ruang ini!


Terima kasih telah meluangkan waktu untuk meninggalkan jawaban yang luar biasa. Saya pasti akan mencobanya. Sangat penting saya melakukan ini dengan benar sebelum membuka server saya ke beberapa pengguna. Saya akan memberi Anda teriakan jika saya memiliki pertanyaan lebih lanjut.
Sam

2
Saya mencoba ini dengan the_post_thumbnail (); dan itu bekerja dengan sempurna. Satu masalah: Ketika saya menghapus gambar, ia meninggalkan gambar yang telah diukur ulang oleh skrip Anda. Ada ide?
Sam

5


Penafian:
- Ini sebenarnya bukan jawaban.
- Hal ini dimaksudkan untuk membantu Anda dengan penelitian tambahan Anda pada topik.
- Selanjutnya adalah mencerminkan - setidaknya merasa - akhir-akhir ini lebih sering terjadinya pertanyaan serupa mengenai masalah yang sama.


Informasi tambahan mengenai topik ini tentang Pengembangan Wordpress:

Catatan: Daftar ini tidak disusun dan komprehensif dengan cara apa pun.


3

Jika Anda ingin membuat thumbs on the fly, Anda dapat menggunakan resizer gambar Aqua , Tetapi ada kelemahan dari skrip mini ini. Jempol yang dibuat tidak akan dihapus setelah menghapus gambar dari perpustakaan. Tapi ini bukan masalah besar. Jika perlu, Anda dapat melakukannya melalui perintah SHH


1
Poin bagus tentang file tidak dihapus. Solusi saya tidak akan menderita dari ini! (lihat jawaban yang diperbarui).
TheDeadMedic

1

Itu bukan jawaban langsung untuk masalah Anda. Tetapi saya akan membantu Anda membuat gambar sesuai dengan kebutuhan Anda.

Saat Anda menggunakan add_image_size, itu tidak mengubah ukuran gambar yang ada. ini hanya berfungsi untuk gambar baru yang akan diunggah setelah menambahkan fungsi add_image_size Anda.

Jadi kode Anda tidak akan menghasilkan gambar baru untuk fungsi is_page_template.

Tetapi Anda dapat menggunakan kelas php sederhana untuk menyelesaikan masalah Anda .... ini adalah kelas php terkenal yang digunakan untuk banyak tema premium di luar sana untuk WordPress. Ini disebut Aqua-Resizer.

Anda dapat menemukan detail lebih lanjut di sini https://github.com/syamilmj/Aqua-Resizer Wiki: https://github.com/syamilmj/Aqua-Resizer/wiki

Masalah yang mungkin timbul:

Fungsi ini berfungsi seperti ini ....

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

Jadi ketika itu tidak dapat memotong (untuk gambar kecil yang tinggi atau lebar Anda ditentukan) itu tidak menunjukkan apa-apa. Anda dapat mengatasi situasi ini dengan memeriksa apakah Anda mendapatkan nilai nol setelah melewati url dalam fungsi ini dengan sangat mudah seperti milik saya di sini ....

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

Dengan cara ini Anda dapat memastikan bahwa gambar spesifik akan dihasilkan untuk templat halaman tertentu dan dengan cara ini situs web Anda akan jauh lebih bersih.

PS: kelas php ini menggunakan sistem pemotongan inti WordPress sehingga tidak ada masalah keamanan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.