업로드 한 원본 이미지를 큰 이미지 크기로 자동 교체


13

사용자가 웹 사이트에서 사용할 최대 6MB의 이미지를 정기적으로 업로드하고 (먼저 이미지 크기를 조정하는 방법에 익숙하지 않음) WordPress는 원본을 저장하고 여러 크기로 크기를 조정합니다.

업로드 된 이미지를 가져 와서 더 관리하기 쉬운 크기로 조정 한 다음 원본을 대체하는 기능 또는 플러그인을 원합니다.

원본을 삭제하지만 대체하지 않는 일부 기능을 보았으므로 나중에 축소판을 다시 생성 할 수 없습니다. 사용자가 큰 이미지를 업로드 할 수 있도록 이것을 교체해야하며 필요한 경우 나중에 크기를 조정하기 위해 자동으로 크기가 조정되고 저장됩니다.

답변:


10

이것을 테마 폴더의 functions.php 파일에 추가하십시오. 설정에서 설정 한 큰 이미지로 원본 이미지를 대체합니다. 새 이미지 형식을 설정하고 새로운 원본 크기로 사용할 수 있습니다.

function replace_uploaded_image($image_data) {
      // if there is no large image : return
  if (!isset($image_data['sizes']['large'])) return $image_data;

  // paths to the uploaded image and the large image
  $upload_dir = wp_upload_dir();
  $uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
  // $large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file']; // ** This only works for new image uploads - fixed for older images below.
  $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
  $large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

  // delete the uploaded image
  unlink($uploaded_image_location);

  // rename the large image
  rename($large_image_location,$uploaded_image_location);

  // update image metadata and return them
  $image_data['width'] = $image_data['sizes']['large']['width'];
  $image_data['height'] = $image_data['sizes']['large']['height'];
  unset($image_data['sizes']['large']);

  return $image_data;
}

add_filter('wp_generate_attachment_metadata','replace_uploaded_image');

1
이 솔루션이 작동하면 플러그인을 만드는 것이 매우 유용합니다.
Alexey

방금 다시 시도했지만 2048x1536 (필요한 것만 큼 두 배) 인 새로운 크기 ( 'fullsize'라고 함)를 추가했으며 이제는 모두 작동합니다. 원본 이미지는 두 배로 저장됩니다 여러 번 대신 내가 필요로하는만큼 (나중에 보관하고 싶은) 감사!
Shaun

좋은 물건, 그것이 당신을 위해 일하게 된 것을 기쁘게 생각합니다!
Paul Phillips

이 코드는 functions.php 파일에서 모든 것을 삭제했습니다. WP 편집기와 FTP에서 확인했는데 파일이 비어있었습니다. 백업에서 파일을 복원해야했습니다. :(
jlg

1
@Ciprian 당신은 그들 모두를 반복 스크립트를 설정해야합니다. 모든 첨부 파일 정보를 얻는 WordPress 방법이 있다고 확신하지만 $ wpdb-> get_col ( 'wp_posts에서 ID를 선택하십시오. post_type = "attachment"ORDER BY id'); 이미지의 게시물 ID 목록을 얻는 데 효과적입니다. 아마 다음을 추가하십시오 : AND post_mime_type = "image / jpeg"도 jpeg로 제한하십시오. 각 이미지의 실제 위치는 wp_postmeta에 있습니다.
Paul Phillips

3

위의 솔루션에는 하나의 불쾌한 버그가 있습니다. 이 솔루션은 새 이미지의 매력으로 작동하지만 이전 이미지 $upload_dir['path']의 경우 현재 달의 현재 업로드 폴더이므로 절대 비교해서는 안됩니다 .

다음을 교체하십시오.

//$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];
$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];

2

위 답변의 코드를 업데이트 할 수 있습니까? 불행히도 최신 버전의 Wordpress에서는 키 '경로'가 더 이상 파일 크기에 제공되지 않습니다. 따라서 오래된 포스트 업로드에서 작동하게하려면 먼저 원본 이미지에서 현재 하위 디렉토리를 가져 와서 큰 이미지의 위치 경로를 만들어야합니다.

따라서이 줄을 바꾸십시오.

$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];

이 두 줄로 :

$current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
$large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

0

나는 이것을 매우 비슷한 질문에 게시했지만 다시 게시 할 가치가 있다고 생각했습니다.

위의 코드에 문제가 있었고 나를 위해 일한 것은 본질적 으로이 줄을 바꾸는 것이 었습니다. :

unlink($uploaded_image_location);
rename($large_image_location, $uploaded_image_location);

와:

    $file_to_be_copied = $large_image_location; 
    $copied_file_name = $uploaded_image_location;
  //make a copy of the large image and name that the title of the original image
    if (!copy($file_to_be_copied, $copied_file_name)) {
        echo "failed to copy $file...\n";
    }

전체 코드와 자세한 설명을 여기에 게시했습니다. 원본 이미지 삭제-축소판 그림을 유지 하시겠습니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.