Persyaratan Dimensi Minimum untuk Gambar Unggulan?

14

Saya membuat situs web bisbol dengan banyak Penulis. Dari pengalaman masa lalu, tidak peduli seberapa baik Anda mengenal seseorang secara pribadi, itu tidak berarti mereka akan mengikuti atau bahkan membaca instruksi Anda.

Oleh karena itu, saya ingin meminta agar gambar apa pun yang diputuskan oleh Penulis untuk "Gunakan sebagai gambar unggulan" minimal memiliki lebar 640px dan tinggi minimum 360px.

Saya mengharuskan setiap posting memiliki Gambar Pilihan menggunakan plugin WyPiekacz ; posting tidak akan dipublikasikan tanpa Gambar Unggulan. Saya telah memblokir kemampuan seorang Penulis untuk melakukan hotlink ke situs lain dengan menghapus tab "Dari URL" di Add Media menggunakan kode Bainternet.

Sekarang saya perlu meminta gambar apa pun yang digunakan sebagai gambar unggulan setidaknya 640px x 360px. Saya tidak berarti seorang pembuat kode, tetapi saya telah bermain-main dengan dan mencoba menggunakan kode Maor Barazany sebagai titik awal, tetapi tidak berhasil. Kode-nya memaksa dimensi minimum untuk gambar apa pun yang diunggah .

Travis Pflanz
sumber
Tidak dapat menjawab pertanyaan Anda, tetapi saya harus mengucapkan terima kasih atas koleksi filter dan fungsi praktis yang bagus;)
Ole Henrik Skogstrøm
juga, Ole Henrik :)
brasofilo
Bagaimana dengan gambar yang dilampirkan pada posting, tetapi tidak dimaksudkan untuk digunakan sebagai Gambar Unggulan Posting? Apakah benar - benar mustahil bahwa setiap postingan hanya akan memiliki Post Featured Images yang dilampirkan?
Chip Bennett
Tidak, tetapi setiap kiriman harus memiliki gambar unggulan. Ini adalah alasan utama kode Maor Barazany (tautan di atas) untuk memaksa min. dimensi saat unggahan tidak berfungsi (atau kode ungestaltbar di bawah). Cuplikan kode tersebut memaksa SEMUA gambar yang diunggah ke dimensi minimum. Pengguna dapat menambahkan gambar tambahan ke posting mereka, tetapi "Gambar Unggulan" harus cukup besar agar sesuai dengan tema tanpa peregangan. Ini juga mengapa saya ingin kolom "Dimensi Gambar" pada tab "Perpustakaan Media" dari pengunggah. Pengguna akan dengan cepat dapat memilih gambar yang cukup besar untuk gambar unggulan.
Travis Pflanz
Saya mendapatkan bahwa Anda ingin semua posting memiliki sebuah gambar Pilihan. Tetapi apakah itu akan selalu menjadi satu - satunya gambar yang dilampirkan pada posting? Atau bisa posting memiliki gambar lain di samping untuk Gambar Pilihan?
Chip Bennett

Jawaban:

2

baik jika Anda menggunakan plugin WyPiekacz; seperti yang Anda katakan untuk memeriksa bahwa gambar yang ditampilkan diunggah, Anda dapat mengubah sedikit untuk memeriksa bahwa jika ada gambar yang ditampilkan, itu memiliki dimensi minimum seperti yang Anda inginkan.

$has_thumbnail = false;
            if ( ( $post_id > 0 ) && function_exists( 'has_post_thumbnail' ) ) {
                $has_thumbnail = has_post_thumbnail( $post_id );
            }

            $has_thumbnail = apply_filters( 'wypiekacz_check_thumbnail', $has_thumbnail, $post_id, $post_data );

            if ( !$has_thumbnail ) {
                $this->errors[] = array( 'post_thumbnail', __('Post thumbnail (Featured image) is required.', 'wypiekacz') );
            }

Anda dapat mengubah kode di atas di wypiekacz.php menjadi,

$has_thumbnail_proper_dimension = false;
        if ( ( $post_id > 0 ) && function_exists( 'has_post_thumbnail' ) ) {
            $has_thumbnail = has_post_thumbnail( $post_id );
              list($url, $width, $height) = wp_get_attachment_image_src(get_post_thumbnail_id( $post->ID ), "Full");
                echo $imgsrc[0];
              if($width>=640 and $height>=360){
                  $has_thumbnail_proper_dimension=true;
               }
        }

        $has_thumbnail = apply_filters( 'wypiekacz_check_thumbnail', $has_thumbnail, $post_id, $post_data );

        if ( !$has_thumbnail ) {
            $this->errors[] = array( 'post_thumbnail', __('Post thumbnail (Featured image) is required.', 'wypiekacz') );
        }
        if ( !$has_thumbnail_proper_dimension ) {
            $this->errors[] = array( 'post_thumbnail', __('Post thumbnail (Featured image) should be atleast 640x360.', 'wypiekacz') );
        }

baik saya tidak mengerti apa yang Anda maksud dengan "Media Library Tab".

Rajeev Vyas
sumber
Kamu pria yang cantik! Bekerja dengan sempurna! "Tab Perpustakaan Media" ada di layar unggah media, seperti saat Anda mengklik "Set Featured Featured" atau "Upload / Insert" untuk media. Ini adalah screenshot dari ide saya - picasaweb.google.com/lh/photo/…
Travis Pflanz
Saya memang membuat satu perubahan. list($url, $width, $height) = wp_get_attachment_image_src($post_id, 'full');diubah menjadi list($url, $width, $height) = wp_get_attachment_image_src(get_post_thumbnail_id( $post->ID ), "Full"); echo $imgsrc[0];untuk memeriksa dimensi hanya Gambar Unggulan, dan tidak semua gambar terlampir.
Travis Pflanz
@ TravisPflanz Ini adalah fungsi yang menampilkan deretan "Medial Library Tab" codex.wordpress.org/Function_Reference/get_media_item Tidak ada filter di sini jadi saya tidak berpikir Anda dapat mengubahnya tanpa menghubungkan ke file wordpress .... Anda dapat menerima jawab / upvote jika berguna ......
Rajeev Vyas
2

Saya memeriksa intinya dan ternyata ada sedikit ruang untuk bermanuver.

/wp-admin/includes/media.php adalah tempat tab Add Media dibuat

Fungsi get_media_item pada baris 1034 adalah fungsi yang menjadikan tabel lampiran / media. Saya tidak dapat melihat filter yang tersedia di dalamnya atau fungsi-fungsi sebelumnya yang memanggil yang ini.

Beberapa referensi dan contoh kode seputar masalah ini.

Saya kira solusi alternatifnya adalah mengubah judul gambar yang diunggah dan menambahkan dimensinya. Saya tidak yakin tentang mengubah post_title dari file yang diunggah, tetapi mengubah nama file itu sendiri dapat dicapai dengan dua filter ini: sanitize_file_name dan wp_handle_upload_prefilter

brasofilo
sumber
Jadi, apa yang Anda katakan adalah bahwa itu mungkin ... Mungkin? Saya benar-benar bukan pembuat kode, jadi saya berada di tangan orang lain dalam hal fungsi menulis. Dukungan apa pun akan luar biasa.
Travis Pflanz
1

Bukan jawaban yang lengkap dan bukan untuk hadiah, hanya bukti bahwa konsep dasar bekerja:

function wpse_attachment_dimension_check( $form_fields, $post ) {

    $meta = wp_get_attachment_metadata($post->ID);

    if ( !empty[$meta['width']] )
        if ( $meta['width'] <= 999 or $meta['height'] <= 349 ) 
        {   
            echo '<p class="error">Image dimensions ...bla</p>';
            exit;
        }
        else
        {
             // Return all form fields
             return $form_fields;
        }
}

add_filter( 'attachment_fields_to_edit', 'wpse_attachment_dimension_check', 10, 2 );

Hanya 60secondsSnippet dan memiliki satu masalah besar: Ini akan diaktifkan untuk setiap unggahan, dan tidak hanya jika seseorang mau menambahkan gambar unggulan, karena kami tidak punya cara untuk mendapatkan konteks pengunggah gambar. Ada beberapa cara untuk mengatasinya, pada dasarnya dengan beberapa manipulasi js.

Saya harus bekerja sekarang, dan tidak punya waktu untuk bereksperimen dengannya. Tetapi saya ingin membantu sebanyak mungkin, dan mungkin ini adalah titik awal bagi orang lain.

Bersulang

ungestaltbar
sumber
Terima kasih atas jawabannya, kode Anda pada dasarnya melakukan apa yang dilakukan kode Maor Barazany (yang ditautkan dalam pertanyaan), meskipun kode Anda jauh lebih baik.
Travis Pflanz
1

Ini bukan jawaban yang paling elegan ... tetapi berhasil! Plugin 'WyPiekacz', meskipun keren, belum diperbarui dalam tiga tahun.

add_action('transition_post_status', 'check_featured_image_size_after_save', 10, 3);

function check_featured_image_size_after_save($new_status, $old_status, $post){
  $run_on_statuses = array('publish', 'pending', 'future');
  if(!in_array($new_status, $run_on_statuses))
    return;

  $post_id = $post->ID;
  if ( wp_is_post_revision( $post_id ) )
    return; //not sure about this.. but apparently save is called twice when this happens

  $image_data = wp_get_attachment_image_src( get_post_thumbnail_id( $post_id ), "Full" );
  if(!$image_data)
    return; //separate message if no image at all. (I use a plugin for this)

  $image_width = $image_data[1];
  $image_height = $image_data[2];

  // replace with your requirements.
  $min_width = 900;
  $min_height = 400;
  if($image_width < $min_width || $image_height < $min_height){
    // Being safe, honestly $old_status shouldn't be in $run_on_statuses... it wouldn't save the first time!
    $reverted_status = in_array($old_status, $run_on_statuses) ? 'draft' : $old_status;
    wp_update_post(array(
      'ID' => $post_id,
      'post_status' => $reverted_status,
    ));
    $back_link = admin_url("post.php?post=$post_id&action=edit");
    wp_die("Featured Image not large enough, must be at least ${min_width}x$min_height. Reverting status to '$reverted_status'.<br><br><a href='$back_link'>Go Back</a>");
  }
}

Solusi paling elegan dengan pengalaman pengguna terbaik akan menggunakan JavaScript untuk menangani ini baik untuk Edit Cepat dan halaman edit posting. Maka untuk keberuntungan saya akan menambahkan sesuatu ke update_post_metadatafilter (yang benar-benar berfungsi untuk mencegah gambar yang ditampilkan tetapi tidak akan memberikan peringatan karena dijalankan dengan AJAX).

Pemberitahuan admin tidak akan muncul karena WordPress mengarahkan ulang, dan bahkan kemudian tidak akan muncul di Edit Cepat (metode saya tidak menampilkan peringatan pada Edit Cepat meskipun tidak ditata).

Ryan Taylor
sumber
Apakah ini sudah diuji? Saya tidak perlu melakukan ini dalam beberapa saat, tetapi senang untuk membookmark.
Travis Pflanz
Mungkin pada hari Senin saya dapat menjalankannya di server pementasan kami, tetapi saya memiliki sesuatu yang 99% mirip dengan ini berjalan pada produksi.
Ryan Taylor
0

Berikut adalah salah satu cara untuk memastikan ada thumbnail berukuran tepat sebelum menampilkannya.

Pertama, buat fungsi pembantu ini:

function has_post_thumbnail_of_size($width, $height) {
    $thumbnail_id = get_post_thumbnail_id();
    if( $thumbnail_id ) {
        $thumbnail_metadata = wp_get_attachment_metadata( $thumbnail_id );
        if( $thumbnail_metadata['height'] >= $height && $thumbnail_metadata['width'] >= $width ) {
            return true;
        }
    }
    return false;
}

Maka sekarang Anda dapat memeriksa sebelum menampilkan thumbnail posting:

if( has_post_thumbnail_of_size(640, 360) ) {
    the_post_thumbnail();
}
Sam Margulies
sumber
Saya perlu membatasi pengguna dari melampirkan gambar yang terlalu kecil, tidak membatasi itu menampilkan jika terlalu kecil. Setiap posting HARUS menyertakan gambar. Setiap posting akan menampilkan gambar.
Travis Pflanz
Harus melakukan tes tetapi ada satu cara saya melihat bagaimana ini bisa dilakukan: Setiap kali unggahan berhasil, WP akan mengambil data lampiran melalui ajax untuk menampilkan formulir rincian lampiran setelahnya. Ini berarti gambar telah dimasukkan sebagai lampiran dan metadata tersedia. IDEA: Orang bisa menghubungkan ke attachments_fields_to_edit, yang menjadikan objek lampiran sebagai argumen, lalu memeriksa metadata tinggi dan lebar, jika pemeriksaan ini gagal jangan tampilkan formulir rincian lampiran seperti biasa, tampilkan pesan kesalahan dan hapus lampiran langsung . hanya sebuah ide.
ungestaltbar
@ungestaltbar, sepertinya Anda punya ide yang tepat. Saya bukan pembuat kode, jadi saya berada di tangan komunitas.
Travis Pflanz
0

Ini akan melakukan apa yang dibutuhkan :)

//Adding script to deligate Thumbnail Size
if ( function_exists( 'add_theme_support' ) ) {
  add_theme_support( 'post-thumbnails' );
    set_post_thumbnail_size( 960, 276, true ); // default Post Thumbnail dimensions   
}
//Set different Thumbnail Sizes for Later
if ( function_exists( 'add_image_size' ) ) { 
  add_image_size( 'large-thumb', 960, 276, true ); //(cropped)  
  add_image_size( 'medium-thumb', 605, 174, true ); //(cropped) 
  add_image_size( 'small-thumb', 288, 83, true ); //(cropped) 
  add_image_size( 'small-square', 100, 100, true ); //(cropped) 
}

<?php if ( has_post_thumbnail() ) {
      global $post; //I usually define this in the function that outputs this, fyi
      echo '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( $post->post_title ) . '">';
      echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) ));
      echo '</a>'; 
      } else {

      $thumbnails = get_posts(array('numberposts'=>1,'orderby'=>'rand','meta_key' => '_thumbnail_id'));
      foreach ($thumbnails as $thumbnail) {
      echo '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( $post->post_title ) . '">';
      echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) ));
      echo '</a>';
      }           
    }   
    ?>

Ini menggunakan get_the_post_thumbnail yang juga dapat membantu Anda sehingga Anda tidak perlu membuat banyak kode fn yang WordPress sudah bisa tangani untuk Anda, hanya sebuah pemikiran.

Ini digunakan $thumbnails = get_posts(array('numberposts'=>1,'orderby'=>'rand','meta_key' => '_thumbnail_id'));untuk mengambil yang acak jika tidak ada, ini dapat membantu Anda bergerak maju.

echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) ));Pemberitahuan ini sedikit 'small-thumb'dicocokkan dengan add_image_size fn kita mengumpulkan beberapa baris. Jadi, jika Anda punya, add_image_size( 'small-square', 100, 100, true );Anda bisa menelepon 'small-square'alternatif.

Bersulang

David
sumber
Terima kasih balasannya. Ini tidak melakukan apa yang saya butuhkan. Situs web ini adalah situs bisbol MLB, jadi gambar acak Albert Pujols tidak akan berfungsi untuk ditambahkan ke artikel tentang Pangeran Fielder, jika Anda mengerti maksud saya ... Juga, seperti yang saya sebutkan di atas, saya menggunakan plugin WyPiekacz untuk memaksa pengguna untuk menambahkan gambar unggulan. Jadi, masalahnya bukan apakah mereka menambahkan gambar, melainkan saya ingin memaksa mereka untuk menambahkan gambar yang lebih besar dari lebar 640 dan tinggi 360.
Travis Pflanz