Yêu cầu kích thước tối thiểu cho hình ảnh nổi bật?


14

Tôi đang tạo một trang web bóng chày với nhiều tác giả. Từ kinh nghiệm trong quá khứ, cho dù bạn biết rõ về ai đó như thế nào, điều đó không có nghĩa là họ sẽ làm theo hoặc thậm chí đọc hướng dẫn của bạn.

Điều đó đang được nói, tôi muốn yêu cầu bất kỳ hình ảnh nào mà Tác giả quyết định "Sử dụng làm hình ảnh nổi bật" phải rộng tối thiểu 640px và cao tối thiểu 360px.

Tôi đã yêu cầu mỗi bài đăng phải có Ảnh nổi bật bằng cách sử dụng plugin WyPiekacz ; bài viết sẽ không xuất bản mà không có hình ảnh nổi bật. Tôi đã chặn khả năng Tác giả liên kết đến một trang web khác bằng cách xóa tab "Từ URL" trong Thêm phương tiện bằng mã Bai Bai.

Bây giờ tôi cần yêu cầu bất kỳ hình ảnh nào được sử dụng làm hình ảnh nổi bật ít nhất là 640px x 360px. Tôi không có nghĩa là một lập trình viên, nhưng tôi đã chơi xung quanh và cố gắng sử dụng mã của Maor Barazany làm điểm khởi đầu, nhưng không có kết quả. Mã của anh ấy buộc kích thước tối thiểu cho bất kỳ hình ảnh được tải lên .


Không thể trả lời câu hỏi của bạn, nhưng tôi phải nói lời cảm ơn vì bộ sưu tập các bộ lọc và chức năng tiện dụng;)
Ole Henrik Skogstrøm

ditto, Ole Henrik :)
brasofilo

Gì về những hình ảnh được gắn vào bài viết, nhưng không có ý định để được sử dụng như các bài viết nổi bật hình ảnh? Có phải là hoàn toàn không thểmỗi bài viết sẽ chỉ có hình ảnh nổi bật được đính kèm?
Chip Bennett

Không, nhưng mỗi bài đăng được yêu cầu phải có một hình ảnh đặc trưng. Đây là lý do chính khiến mã của Maor Barazany (liên kết ở trên) để buộc min. kích thước khi tải lên sẽ không hoạt động (hoặc mã ungestaltbar bên dưới). Các đoạn mã đó buộc TẤT CẢ các hình ảnh được tải lên ở kích thước tối thiểu. Người dùng có thể thêm hình ảnh bổ sung vào bài đăng của mình, nhưng "Hình ảnh nổi bật" phải đủ lớn để phù hợp với chủ đề mà không kéo dài. Đây cũng là lý do tại sao tôi muốn có cột "Kích thước hình ảnh" trên tab "Thư viện phương tiện" của trình tải lên. Người dùng sẽ nhanh chóng có thể chọn một hình ảnh đủ lớn cho một hình ảnh đặc trưng.
Travis Pflanz

Tôi nhận được rằng bạn muốn tất cả các bài viết có một hình ảnh nổi bật. Nhưng đó sẽ luôn là hình ảnh duy nhất gắn liền với bài viết? Hoặc có thể bài viết có hình ảnh khác trong Ngoài ra để các hình ảnh nổi bật?
Chip Bennett

Câu trả lời:


2

tốt nếu bạn đang sử dụng plugin WyPiekacz; như bạn đã nói để kiểm tra xem hình ảnh nổi bật đã được tải lên chưa, bạn có thể tinh chỉnh nó một chút để kiểm tra xem nếu có hình ảnh nổi bật thì đó là những điều tối thiểu như bạn yêu cầu.

$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') );
            }

Bạn có thể thay đổi mã ở trên trong wypiekacz.php thành,

$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') );
        }

tôi cũng không hiểu ý của bạn về "Tab thư viện phương tiện".


Bạn là một người đàn ông đẹp! Hoạt động hoàn hảo! "Tab Thư viện phương tiện" nằm trong màn hình tải lên phương tiện, như khi bạn nhấp vào "Đặt hình ảnh nổi bật" hoặc "Tải lên / Chèn" cho phương tiện. Đây là một ảnh chụp màn hình về ý tưởng của tôi - picasaweb.google.com/lh/photo/ từ
Travis Pflanz

Tôi đã thực hiện một thay đổi. list($url, $width, $height) = wp_get_attachment_image_src($post_id, 'full');đã thay đổi để list($url, $width, $height) = wp_get_attachment_image_src(get_post_thumbnail_id( $post->ID ), "Full"); echo $imgsrc[0];kiểm tra kích thước của Chỉ hình ảnh nổi bật và không phải tất cả hình ảnh đính kèm.
Travis Pflanz

@TravisPflanz Đây là chức năng xuất ra hàng "Tab thư viện trung gian" codex.wordpress.org/Function_Reference/get_media_item Không có bộ lọc nào ở đây nên tôi không nghĩ bạn có thể thay đổi nó khi móc vào tệp wordpress .... Trả lời / upvote nếu hữu ích ......
Rajeev Vyas

2

Tôi đã kiểm tra lõi và dường như có rất ít chỗ để điều động.

/wp-admin/includes/media.php là nơi tạo các tab Thêm phương tiện

Hàm get_media_item trong dòng 1034 là hàm hiển thị bảng đính kèm / phương tiện. Tôi không thể thấy bất kỳ bộ lọc nào có sẵn trong đó hoặc các chức năng trước đó gọi bộ lọc này.

Một số tài liệu tham khảo và mẫu mã xung quanh vấn đề.

Tôi đoán một giải pháp thay thế sẽ là thay đổi tiêu đề của hình ảnh được tải lên và nối thêm kích thước của nó. Tôi không chắc chắn về việc thay đổi post_title của tệp đã tải lên, nhưng có thể đổi tên tệp bằng hai bộ lọc này: sanitize_file_namewp_handle_upload_prefilter


Vì vậy, những gì bạn đang nói là nó có thể ... Có thể? Tôi thực sự không phải là lập trình viên, vì vậy tôi rất thương xót người khác khi nói về chức năng viết. Bất kỳ hỗ trợ sẽ là tuyệt vời.
Travis Pflanz

1

Không phải là một câu trả lời đầy đủ và không phải cho tiền thưởng, chỉ là một bằng chứng cho thấy khái niệm cơ bản hoạt động:

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

Chỉ cần 60 giây giây và có một vấn đề lớn: Điều này sẽ kích hoạt cho mỗi lần tải lên và không chỉ khi có ai đó thêm hình ảnh nổi bật, bởi vì chúng tôi không có cách nào để có được bối cảnh của trình tải lên hình ảnh. Có một số cách để làm việc xung quanh nó, về cơ bản với một số thao tác js.

Tôi nên làm việc ngay bây giờ và không có thời gian để thử nghiệm nó. Nhưng tôi muốn giúp đỡ hết mức có thể, và có lẽ đây là điểm khởi đầu cho những người khác.

chúc mừng


Cảm ơn bạn đã trả lời, mã của bạn thực chất là những gì mã của Maor Barazany làm (được liên kết trong câu hỏi), mặc dù mã của bạn tốt hơn nhiều.
Travis Pflanz

1

Đây không phải là câu trả lời tao nhã nhất ... nhưng nó hoạt động! Plugin 'WyPiekacz', mặc dù tuyệt vời, đã không được cập nhật trong ba năm.

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

Giải pháp thanh lịch nhất với trải nghiệm người dùng tốt nhất sẽ sử dụng JavaScript để xử lý vấn đề này cho cả Chỉnh sửa nhanh và trang chỉnh sửa bài đăng. Sau đó, để may mắn, tôi đã thêm một cái gì đó vào update_post_metadatabộ lọc (hoàn toàn hoạt động để ngăn hình ảnh nổi bật nhưng sẽ không đưa ra cảnh báo vì nó chạy với AJAX).

Thông báo của quản trị viên sẽ không hiển thị vì WordPress chuyển hướng và thậm chí sau đó sẽ không hiển thị trên Chỉnh sửa nhanh (phương pháp của tôi không hiển thị cảnh báo về Chỉnh sửa nhanh mặc dù nó không được tạo kiểu).


Điều này đã được thử nghiệm? Tôi không cần phải làm điều này trong một thời gian, nhưng thật tuyệt khi đánh dấu trang.
Travis Pflanz

Có thể vào thứ Hai tôi có thể chạy nó trên máy chủ dàn dựng của chúng tôi, nhưng tôi có một cái gì đó tương tự 99% với cái này đang chạy trên sản xuất.
Ryan Taylor

0

Đây là một cách để đảm bảo có một hình thu nhỏ có kích thước phù hợp trước khi hiển thị nó.

Đầu tiên, tạo chức năng trợ giúp này:

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

Sau đó, bạn có thể kiểm tra trước khi hiển thị hình thu nhỏ của bài đăng:

if( has_post_thumbnail_of_size(640, 360) ) {
    the_post_thumbnail();
}

Tôi cần hạn chế người dùng đính kèm một hình ảnh quá nhỏ, không hạn chế nó hiển thị nếu nó quá nhỏ. Mỗi bài viết PHẢI bao gồm một hình ảnh. Mỗi bài viết sẽ hiển thị một hình ảnh.
Travis Pflanz

Sẽ phải thực hiện các thử nghiệm nhưng có một cách tôi thấy cách này có thể được thực hiện: Bất cứ khi nào tải lên thành công, WP sẽ lấy dữ liệu tệp đính kèm qua ajax để hiển thị biểu mẫu chi tiết đính kèm sau đó. Điều này có nghĩa là hình ảnh đã được chèn dưới dạng tệp đính kèm và siêu dữ liệu có sẵn. IDEA: Người ta có thể móc vào tệp đính kèm_fields_to_edit, lấy đối tượng đính kèm làm đối số, sau đó kiểm tra chiều cao và chiều rộng siêu dữ liệu, nếu kiểm tra này không hiển thị biểu mẫu chi tiết đính kèm như bình thường, thay vào đó hãy hiển thị thông báo lỗi và xóa tệp đính kèm . chỉ là một ý tưởng
ungestaltbar

@ungestaltbar, nghe có vẻ như bạn có ý kiến ​​đúng. Tôi không phải là lập trình viên, vì vậy tôi rất thương xót cộng đồng.
Travis Pflanz

0

Điều này sẽ làm whatcha cần :)

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

Việc sử dụng get_the_post_thumbnail cũng có thể giúp bạn vì vậy bạn không cần phải tạo một loạt mã fn mà WordPress có thể xử lý cho bạn, chỉ là một suy nghĩ.

Điều này sử dụng $thumbnails = get_posts(array('numberposts'=>1,'orderby'=>'rand','meta_key' => '_thumbnail_id'));để lấy một cái ngẫu nhiên nếu không có mặt, điều này có thể giúp bạn tiến về phía trước.

Bit này echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) ));thông báo rằng 'small-thumb'nó được khớp với các add_image_size fn mà chúng ta ghép lại thành một vài dòng. Vì vậy, nếu bạn có add_image_size( 'small-square', 100, 100, true );bạn có thể gọi 'small-square'thay thế.

Chúc mừng


Cảm ơn vi đa trả lơi. Điều này không làm những gì tôi cần, tuy nhiên. Trang web này là một trang web bóng chày MLB, vì vậy một bức ảnh ngẫu nhiên về Albert Pujols sẽ không hoạt động để được thêm vào một bài viết về Prince Fielder, nếu bạn hiểu ý tôi ... Ngoài ra, như tôi đã đề cập ở trên, tôi sử dụng plugin WyPiekacz để buộc người dùng thêm một hình ảnh đặc trưng. Vì vậy, vấn đề không phải là họ có thêm hình ảnh hay không, mà thay vào đó tôi muốn buộc họ thêm hình ảnh rộng hơn 640 và cao 360.
Travis Pflanz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.