Làm thế nào để trình tải lên phương tiện WP tạo ra 3 hình ảnh có kích thước khác nhau và làm cách nào tôi có thể sao chép nó


17

Cuối cùng tôi cũng có !! có được điều này tôi đã thử khoảng 12 lần để thực hiện và 12 cách khác nhau, nhưng cuối cùng nó cũng hoạt động, ... sắp xếp.

Tôi đã tạo một metabox tùy chỉnh để tải lên và đính kèm hình ảnh vào bài đăng và nó không yêu cầu bạn sử dụng trình tải lên phương tiện truyền thông hộp dày khủng khiếp được tích hợp trong WP. Tôi ghét điều đó. Không, những gì tôi đã làm chỉ là một nhóm đầu vào (tiêu đề, mô tả, tệp), mà bạn cũng có thể sao chép, để thêm các tệp đính kèm bổ sung nếu bạn muốn. Vì vậy, bạn điền vào các trường, chọn một hình ảnh để tải lên và lưu bản nháp hoặc xuất bản bài đăng. Khi có tệp đính kèm được thêm vào bài đăng, metabox sẽ hiển thị các trường đầu vào, cùng với hình ảnh xem trước của hình ảnh đính kèm cho mỗi tệp đính kèm bạn đã thêm. Các trường tiêu đề và mô tả được sử dụng để tạo dữ liệu meta tệp, không có gì được lưu dưới dạng post_meta, mà tôi biết. Đó là tất cả những gì tôi đã làm việc cho đến nay.

Tôi cần làm cho nó để khi bạn lưu / xuất bản một bài đăng, tải lên / tạo các tệp đính kèm, nó sẽ tạo ra ba kích thước hình ảnh như trình tải lên wp mặc định sẽ, hình thu nhỏ, trung bình, lớn và giữ hình ảnh kích thước đầy đủ . Nếu điều đó có thể bằng cách nào đó. Nếu không, tôi muốn sử dụng add_image_size()để tạo / xác định kích thước tùy chỉnh mới và thay vào đó, hãy tạo chúng theo cách đó, khi tải lên.

Tôi không chắc chức năng nào là lý tưởng nhất để sử dụng trong trường hợp này, có thể image_make_intermediate_size()chức năng sẽ tốt hơn, wp_create_thumbnail()hoặc wp_crop_image()... ai biết !!

Tôi không thể tìm ra cách thực hiện điều đó, nếu tôi cần chạy wp_handle_upload()chức năng cho từng người, hoặc có thể một cái gì đó liên quan đến wp_generate_attachment_metadata()chức năng. Thật khó hiểu với tôi vì 3 kích thước hình ảnh được liên kết thành các biến thể của cùng một tệp đính kèm và cách thực hiện điều đó.

Tôi đã lướt web, đọc nguồn của mọi tệp liên quan đến phương tiện / tải lên / hình ảnh wp và chỉ chơi với mọi chức năng dành cho công cụ tải lên phương tiện và không thể tìm thấy cách WP tạo 3 kích thước hình ảnh ở bất cứ đâu hoặc làm như thế nào Bản thân mình.

Trong wp-gộp / media.php, image_resize()chức năng có vẻ như sẽ tốt nhất vì nó chính xác là như vậy. Tôi chỉ không thể tìm ra cuộc sống của tôi những gì tôi đang thiếu hoặc đã cố gắng làm nhưng đã làm sai để tạo hình thu nhỏ.

Đây là chức năng làm việc của tôi để thực hiện wp_handle_upload()công cụ và mọi thứ, nhưng nó cũng cần tạo ngón tay cái 100px và tạo một phiên bản thay đổi kích thước của hình ảnh có chiều rộng tối đa như 500px và được lưu dưới dạng tệp mới của tệp được tải lên.

function update_attachment(){
  global $post;

  wp_update_attachment_metadata( $post->ID, $_POST['a_image'] );

  if( !empty( $_FILES['a_image']['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $url = wp_handle_upload( $_FILES['a_image'], $override );

    // $medium = image_make_intermediate_size( $uploaded_file['url'], 500, 400, true );
    // $thumb = = image_make_intermediate_size( $uploaded_file['url'], 100, 100, true );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $array_type = wp_check_filetype
    $allowed_file_types = array('image/jpg','image/jpeg','image/gif','image/png');

    $name_parts = pathinfo( $name );
    $name = trim( substr( $name, 0, - ( 1 + strlen( $name_parts['extension'] )) ));

    $type = $file['type'];
    $file = $file['file'];
    $title = $_POST['a_title'] ? $_POST['a_title'] : $name;
    $content = $_POST['a_desc']

    $post_id = $post->ID;
    $attachment = array(
      'post_title' => $title,
      'post_type' => 'attachment',
      'post_content' => $content,
      'post_parent' => $post_id,
      'post_mime_type' => $type,
      'guid' => $url['url']
    );


    // Save the data
    $id = wp_insert_attachment( $attachment, $_FILES['a_image'][ 'file' ]/*, $post_id - for post_thumbnails*/);

    if ( !is_wp_error( $id )) {
      $attach_meta = wp_generate_attachment_metadata( $id, $uploaded_file['url'] );
      wp_update_attachment_metadata( $attach_id, $attach_meta );
    }
    update_post_meta( $post->ID, 'a_image', $uploaded_file['url'] );
  }
}

Bất cứ ai cũng có thể giúp tôi cuối cùng sửa nó để nó hoạt động tốt sẽ được yêu thích. Tôi đã dành quá nhiều thời gian vô lý vô số lần khác nhau để cố gắng phát triển thứ này và tài liệu thật tệ, và thực sự không có bài viết hay nào ở bất cứ đâu về cách thực hiện.

Cảm ơn


Kiểm tra các ý kiến ​​về các câu trả lời khác nhau dưới đây và tôi nghĩ rằng tôi hoặc @ בנ or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or
MikeSchinkel

Có ai đã giải quyết điều này ?? Có một vấn đề tương tự, đã được phổ biến trên web từ lâu về vấn đề này.

Câu trả lời:


6

Xin chào @jaredwilli:

Anh bạn! Nỗ lực tuyệt vời, và công việc tốt đẹp. Tất cả trong tất cả nó có thể là một bổ sung tuyệt vời cho WordPress.

Bạn đã ở rất gần, nhưng bạn đã có khoảng từ 5 đến 10 giả định hoặc mã không thành công giống như bạn đã bắt đầu nhưng không quay lại vì nó không hoạt động. Tôi đã làm lại chức năng của bạn nhiều như tôi cần để sửa nó. Giải pháp theo sau và tôi sẽ để so sánh song song với bạn hoặc ai đó ít bị kiệt sức hơn. :)

function update_attachment() {
  global $post;
  wp_update_attachment_metadata( $post->ID, $_POST['a_image'] );
  if( !empty( $_FILES['a_image']['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $file = wp_handle_upload( $_FILES['a_image'], $override );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $file_type = wp_check_filetype($_FILES['a_image']['name'], array(
      'jpg|jpeg' => 'image/jpeg',
      'gif' => 'image/gif',
      'png' => 'image/png',
    ));
    if ($file_type['type']) {
      $name_parts = pathinfo( $file['file'] );
      $name = $file['filename'];
      $type = $file['type'];
      $title = $_POST['a_title'] ? $_POST['a_title'] : $name;
      $content = $_POST['a_desc'];

      $post_id = $post->ID;
      $attachment = array(
        'post_title' => $title,
        'post_type' => 'attachment',
        'post_content' => $content,
        'post_parent' => $post_id,
        'post_mime_type' => $type,
        'guid' => $file['url'],
      );

      foreach( get_intermediate_image_sizes() as $s ) {
        $sizes[$s] = array( 'width' => '', 'height' => '', 'crop' => true );
        $sizes[$s]['width'] = get_option( "{$s}_size_w" ); // For default sizes set in options
        $sizes[$s]['height'] = get_option( "{$s}_size_h" ); // For default sizes set in options
        $sizes[$s]['crop'] = get_option( "{$s}_crop" ); // For default sizes set in options
      }

      $sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes );

      foreach( $sizes as $size => $size_data ) {
        $resized = image_make_intermediate_size( $file['file'], $size_data['width'], $size_data['height'], $size_data['crop'] );
        if ( $resized )
          $metadata['sizes'][$size] = $resized;
      }

      $attach_id = wp_insert_attachment( $attachment, $file['file'] /*, $post_id - for post_thumbnails*/);

      if ( !is_wp_error( $id )) {
        $attach_meta = wp_generate_attachment_metadata( $attach_id, $file['file'] );
        wp_update_attachment_metadata( $attach_id, $attach_meta );
      }
      update_post_meta( $post->ID, 'a_image', $file['url'] );
    }
  }
}

Này, tại sao không phô trương và kiếm cho mình một bản sao của PhpStorm ? Bạn có thể dễ dàng tự giải quyết vấn đề này, bạn rất gần gũi, nếu bạn có thể truy tìm mã như tôi bây giờ có thể. Nếu bạn làm như vậy, đừng lãng phí thời gian của bạn vào XDEBUG rất lỗi và thay vào đó hãy tải xuống Zend Debugger .

PS Đây là câu trả lời trước đây của tôi. Tôi đã đăng bài này trước khi tôi nhận ra chính xác những gì Jared đang hỏi. Nó là chính xác, nhưng không liên quan đến câu hỏi của anh ấy. :)


Tôi nghĩ những gì bạn đang tìm kiếm là add_image_size():

add_image_size( $size_id, $width, $height, $crop );

Ví dụ:

add_image_size('headshot', 130, 150);
add_image_size('large-headshot', 260, 300);

Bằng cách thiết lập WordPress này sẽ tạo ra các kích thước đó tự động. Những gì bạn cần?


Tôi không chắc về điều đó, anh ta đang yêu cầu tạo ra các kích cỡ phương tiện mặc định.
Bai Internet

Hừm. Các chức năng wp_generate_attachment_metadata()làm điều đó nếu add_image_size()được thiết lập. Có lẽ anh ta đã không thử sử dụng add_image_size()để đặt kích thước hình ảnh?
MikeSchinkel

vâng, nhưng jaredwilli đang nói rằng các kích thước tích hợp mặc định của WordPress (lớn, trung bình, hình thu nhỏ) sẽ không được tạo sau đó chắc chắn các kích thước được thêm vào bằng cách sử dụng add_image_size () sẽ không được tạo.
Bai Internet

hoặc có lẽ tôi không nhận được câu hỏi nào cả :)
BaiNET

@ בנ Tôi nghĩ rằng chúng ta cần chờ đến đây để làm rõ từ @jaredwilli.
MikeSchinkel

0

Nếu tôi hiểu câu hỏi của bạn, bạn cần có danh sách kích thước đầu tiên như thế này:

$image_sizes = get_intermediate_image_sizes();

cái này trả về một mảng của tất cả các kích thước hình ảnh đã đăng ký (mặc định: lớn, trung bình, hình thu nhỏ, bất kỳ kích thước tùy chỉnh nào được đăng ký bằng cách sử dụng "add_image_size ()", sau đó tất cả những gì bạn phải làm là lặp lại từng máng và tạo một hình ảnh cho kích thước đó như điều này:

$foreach ($image_sizes as $size){
    images[] = image_make_intermediate_size($file, $size['width'], $size['height'], $crop); 
}

thay thế tệp $ bằng đường dẫn tệp đã tải lên và $ crop bằng true hoặc false nếu bạn muốn cắt hình ảnh sang kích thước mới hoặc sai để thay đổi kích thước.


@ בניית אתרים - Nếu bạn có một cái nhìn tại các mã cho wp_generate_attachment_metadata()trong /wp-admin/includes/image.phpbạn sẽ thấy nó thực hiện chính xác những gì bạn được đăng trên, và ông đã gọi đó. Vì vậy, nếu những thứ đó không được tạo ra thì có lẽ anh ta đã có một plugin lọc chúng bằng 'intermediate_image_sizes_advanced'hook?
MikeSchinkel

Tôi thực sự đã không thử sử dụng get_inter liền_image_sizes (); Tôi không biết rằng nó có tất cả các kích cỡ đã đăng ký. Đó là tốt đẹp để biết bây giờ. Tôi vẫn không hiểu làm thế nào các kích thước hình ảnh được tạo ra được liên kết với một tệp đính kèm cụ thể, như khi tôi tìm trong thư viện phương tiện, bạn thấy 3 tùy chọn kích thước, khi chọn một trong số đó, nó sẽ biết hình ảnh nào cần lấy . Idk, điều đó không quan trọng. Trừ khi nó là. Sau khi thực hiện vòng lặp foreach đó, tôi sẽ sử dụng biến nào để thêm tệp đính kèm? $ hình ảnh ['ngón tay cái'] hoặc một cái gì đó (bất kỳ kích thước tôi muốn)?
jaredwilli

@ בנ - Cả hai chúng tôi đã bỏ lỡ vấn đề thực sự lúc đầu. Vấn đề thực sự là khoảng 7 hoặc 8 lỗi mã trong ví dụ ban đầu. Xem câu trả lời cập nhật của tôi.
MikeSchinkel

Phải đó là muộn ở đây và tôi đã chết não.
Bai Internet

@ בנ Same Same Same Same Same Same :)
MikeSchinkel
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.