WP 미디어 업 로더는 3 가지 크기의 이미지를 어떻게 만들며 어떻게 복제 할 수 있습니까?


17

나는 마침내있다!! 12 가지 방법으로 12 가지 방법을 시도했지만 마침내 작동하게되었습니다.

게시물에 이미지를 업로드하고 첨부하기 위해 사용자 정의 메타 박스를 만들었으며 WP에 내장 된 끔찍한 thickbox 미디어 업 로더를 사용할 필요가 없습니다. 나는 그게 싫어. 아니요, 내가 한 일은 입력 그룹 (제목, 설명, 파일)입니다. 복제 할 수 있으며 원하는 경우 추가 첨부 파일을 추가 할 수 있습니다. 따라서 필드를 채우고 업로드 할 이미지를 선택한 다음 초안을 저장하거나 게시물을 게시하십시오. 게시물에 첨부 파일이 추가되면 메타 박스에 추가 한 각 첨부 파일에 대한 첨부 이미지의 미리보기 이미지와 함께 입력 필드가 표시됩니다. 제목 및 설명 필드는 파일 메타 데이터를 생성하는 데 사용되며 내가 아는 post_meta로 아무것도 저장되지 않습니다. 그것은 지금까지 내가 지금까지 얻은 모든 것입니다.

게시물을 저장 / 게시 할 때 첨부 파일을 업로드 / 생성 할 때 기본 wp 업 로더가 썸네일, 중간, 큰, 전체 크기 이미지를 유지하는 것처럼 세 가지 이미지 크기를 생성하도록해야합니다. . 그것이 어떻게 든 가능하다면. 그렇지 않으면 다른 방법으로 사용하고 싶습니다.add_image_size() 업로드시 새 사용자 정의 크기를 작성 / 정의하고 대신 그 방법으로 생성하고 .

이 경우 어떤 기능이 가장 이상적인지 잘 모르겠습니다. 어쩌면 image_make_intermediate_size()기능이 더 좋을지, wp_create_thumbnail()또는wp_crop_image() ... 누가 알 겠어!

wp_handle_upload()각각에 대해 함수 를 실행해야 하거나 wp_generate_attachment_metadata()함수 와 관련된 것이 필요한 경우 어떻게 해야하는지 알 수 없습니다 . 3 개의 이미지 크기가 동일한 첨부 파일의 변형으로 연결되어 있고 그렇게하는 방법에 대해 혼란 스럽습니다.

웹을 닦고 모든 wp 미디어 / 업로드 / 이미지 관련 파일의 소스를 읽었으며 미디어 업로드 항목에 대한 모든 기능을 사용하여 재생했으며 WP가 3 개의 이미지 크기를 어디서나 만드는 방법 또는 수행 방법을 찾을 수 없음 나 자신.

wp-includes / media.php에서 image_resize()함수는 정확히 무엇이기 때문에 가장 좋을 것 같습니다. 나는 내가 잃어버린 또는 내가 뭘 시도했지만 이미지 썸네일을 만들기 위해 잘못했는지를 내 인생에서 알 수 없습니다.

여기에 wp_handle_upload()물건과 일을 하는 작업 기능이 있지만 100px 엄지 손가락을 만들고 500px와 같은 최대 너비의 이미지 크기를 조정하고 업로드 된 파일의 새 파일로 저장해야합니다.

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

내가 마침내 이것을 고칠 수 있도록 도와 줄 수있는 사람이라면 제대로 작동 할 것입니다. 나는이 일을 개발하기 위해 수많은 다른 시간을 엄청나게 많은 시간을 보냈고 문서가 빨라지고 그것을 수행하는 방법에 대한 좋은 게시물이 실제로 없습니다.

감사


아래의 다양한 답변에 대한 의견을 확인하면 I 또는 @ בניית אתרים 또는 두 사람 모두 필요한 것에 혼란 스럽다고 생각합니다.
MikeSchinkel

누구든지 이것을 해결 했습니까 ?? 비슷한 문제가 발생하여 웹을 오랫동안 사용하고 있습니다.

답변:


6

안녕하세요 @jaredwilli :

친구! 용감한 노력과 훌륭한 일. 전체적으로 WordPress에 큰 도움이 될 수 있습니다.

당신은 너무 가까웠지만, 당신이 시작한 것처럼 보이지만 작동하지 않아서 돌아 가지 않은 5 ~ 10 개의 작은 가정이나 코드가 어딘가에있었습니다. 함수를 수정하는 데 필요한만큼만 기능을 재 작업했습니다. 해결책이 따르고, 나는 당신이나 다른 사람과 나란히 비교합니다. :)

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

이봐, 왜 너 자신을 PhpStorm 의 사본을 얻으려고 ? 내가 할 수있는 것처럼 코드를 추적 할 수 있다면 쉽게 해결할 수 있었고, 너무 가깝습니다. 그렇다면 버그가 많은 XDEBUG 에서 시간을 낭비하지 말고 대신 Zend Debugger 를 다운로드하십시오 .

추신. 이것은 나의 전 대답이다. 나는 정확하게 Jared가 요구하는 것을 깨닫기 전에 이것을 게시했습니다. 정확하지만 그의 질문과 관련이 없습니다. :)


나는 당신이 찾고있는 것이라고 생각합니다 add_image_size():

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

예를 들면 다음과 같습니다.

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

이 WordPress를 설정하면 해당 크기가 자동으로 생성됩니다. 그게 뭐야?


나는 그것이 확실하지 않다, 그는 기본 미디어 크기의 생성을 요구하고있다.
Bainternet

흠. 설정된 wp_generate_attachment_metadata()경우 기능 add_image_size()이 수행됩니다. 어쩌면 그는 add_image_size()이미지 크기를 설정하기 위해 사용하지 않았 습니까?
MikeSchinkel

그러나 jaredwilli는 기본 WordPress 내장 크기 (대형, 중형, 썸네일)가 생성되지 않고 add_image_size ()를 사용하여 추가 된 크기도 생성되지 않는다고 말합니다.
Bainternet

아니면 어쩌면 나는 전혀 질문을받지 못할 것입니다 :)
Bainternet

@ בניית אתרים-나도 혼란스러워합니다. @jaredwilli의 설명을 기다릴 필요가 있다고 생각합니다.
MikeSchinkel

0

질문을 이해하면 먼저 다음과 같이 크기 목록을 가져와야합니다.

$image_sizes = get_intermediate_image_sizes();

이것은 등록 된 모든 이미지 크기의 배열을 반환합니다 (기본값 : large, medium, thumbnail, "add_image_size ()"를 사용하여 등록 된 모든 사용자 정의 크기 이:

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

이미지를 새로운 크기로 자르거나 크기를 조정하려면 false를 입력하려면 $ file을 업로드 된 파일 경로로 바꾸고 $ crop를 true 또는 false로 바꾸십시오.


@ בניית אתרים - 당신이 코드를 살펴 경우 wp_generate_attachment_metadata()/wp-admin/includes/image.php당신은 당신이 위의 게시 정확히 수행 볼 것이다, 그가 이미이라고합니다. 그래서 그것들이 생성되지 않는다면 아마도 'intermediate_image_sizes_advanced'후크를 사용하여 필터링하는 플러그인이 있습니까?
MikeSchinkel

실제로 get_intermediate_image_sizes ()를 사용해 보지 못했습니다. 등록 된 크기가 모두 있다는 것을 알지 못했습니다. 지금 알고있는 것이 좋습니다. 미디어 라이브러리를 살펴보면 3 가지 크기 옵션이 표시됩니다. 그중 하나를 선택할 때 어떤 이미지를 가져올 지 알고 있습니다. . Idk, 그것은 중요하지 않습니다. 그렇지 않으면. 그 foreach 루프를 수행 한 후에 첨부 파일을 추가하는 데 어떤 변수를 사용해야합니까? $ images [ 'thumb'] 또는 무엇인가 (내가 원하는 크기)?
jaredwilli

@ בניית אתרים-우리 둘 다 처음에는 실제 문제를 놓쳤다. 실제 문제는 원래 예제에서 약 7 또는 8 코드 오류였습니다. 업데이트 된 답변을 참조하십시오.
MikeSchinkel

네, 여기 늦었고 뇌가 죽었습니다.
Bainternet

@ בניית אתרים-동일합니다. :)
MikeSchinkel 2012 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.