필립, 마음이 편 해지면 무엇이든 가능합니다. WordPress 이미지 편집기 클래스를 확장하여 문제를 해결할 수 있습니다.
참고 WordPress 3.7을 사용하고 있습니다. 이전 버전과 최신 3.8 릴리스에서 아래 코드를 확인하지 않았습니다.
이미지 편집기 기본
WordPress에는 이미지 조작을 처리하는 두 가지 내장 클래스가 있습니다.
WP_Image_Editor_GD
( /wp-includes/class-wp-image-editor-gd.php
)
WP_Image_Editor_Imagick
( /wp-includes/class-wp-image-editor-imagick.php
)
이 두 클래스 WP_Image_Editor
는 서로 다른 이미지 엔진 (각각 GD 및 ImageMagick)을 사용하여 이미지를로드, 크기 조정, 압축 및 저장하기 때문에 확장 됩니다.
기본적으로 WordPress는 일반적으로 PHP의 기본 GD 엔진보다 선호되므로 PHP 확장이 필요한 ImageMagick 엔진을 먼저 사용하려고합니다. 대부분의 공유 서버에는 ImageMagick 확장 기능이 활성화되어 있지 않습니다.
이미지 편집기 추가
사용할 엔진을 결정하기 위해 WordPress는 내부 함수 __wp_image_editor_choose()
(에있는 /wp-includes/media.php
)를 호출합니다 . 이 함수는 모든 엔진을 반복하여 요청을 처리 할 수있는 엔진을 확인합니다.
이 함수에는 다음 wp_image_editors
과 같이 더 많은 이미지 편집기를 추가 할 수 있는 필터 가 있습니다.
add_filter("wp_image_editors", "my_wp_image_editors");
function my_wp_image_editors($editors) {
array_unshift($editors, "WP_Image_Editor_Custom");
return $editors;
}
우리가하고 있습니다 붙이는 우리의 사용자 정의 이미지 편집기 클래스를 WP_Image_Editor_Custom
우리의 엔진은 다른 엔진을 테스트하기 전에 크기를 조정 처리 할 수 있는지 워드 프레스 확인 있도록.
이미지 편집기 만들기
이제 이미지 편집기를 작성하여 파일 이름을 결정할 수 있습니다. 파일 이름 지정은 메소드에 의해 처리되므로 WP_Image_Editor::generate_filename()
(두 엔진 모두이 메소드를 상속 받음 ), 커스텀 클래스에서 덮어 써야합니다.
파일 이름 변경 만 계획하고 있으므로 기존 엔진 중 하나를 확장해야 휠을 재발 명할 필요가 없습니다. WP_Image_Editor_GD
ImageMagick 확장 기능이 활성화되어 있지 않을 수도 있으므로 예제에서 확장하겠습니다 . 코드는 ImageMagick 설정과 호환됩니다. 다른 설정에서 테마를 사용하려는 경우 두 가지를 모두 추가 할 수 있습니다.
// Include the existing classes first in order to extend them.
require_once ABSPATH.WPINC."/class-wp-image-editor.php";
require_once ABSPATH.WPINC."/class-wp-image-editor-gd.php";
class WP_Image_Editor_Custom extends WP_Image_Editor_GD {
public function generate_filename($prefix = NULL, $dest_path = NULL, $extension = NULL) {
// If empty, generate a prefix with the parent method get_suffix().
if(!$prefix)
$prefix = $this->get_suffix();
// Determine extension and directory based on file path.
$info = pathinfo($this->file);
$dir = $info['dirname'];
$ext = $info['extension'];
// Determine image name.
$name = wp_basename($this->file, ".$ext");
// Allow extension to be changed via method argument.
$new_ext = strtolower($extension ? $extension : $ext);
// Default to $_dest_path if method argument is not set or invalid.
if(!is_null($dest_path) && $_dest_path = realpath($dest_path))
$dir = $_dest_path;
// Return our new prefixed filename.
return trailingslashit($dir)."{$prefix}/{$name}.{$new_ext}";
}
}
위 코드의 대부분은 WP_Image_Editor
클래스 에서 직접 복사되었으며 편의를 위해 주석 처리되었습니다. 실제 변경 사항은 접미사가 이제 접두사라는 것입니다.
또는 전화 parent::generate_filename()
를 사용 mb_str_replace()
하여 접미사를 접두사로 변경할 수는 있지만 더 잘못되는 경향이 있다고 생각했습니다.
메타 데이터에 대한 새로운 경로 저장
업로드 후 업로드 image.jpg
폴더는 다음과 같습니다.
2013/12/150x150/image.jpg
2013/12/300x300/image.jpg
2013/12/image.jpg
여태까지는 그런대로 잘됐다. 그러나와 같은 기본 기능을 호출하면 wp_get_attachment_image_src()
모든 이미지 크기가 image.jpg
새 디렉토리 경로없이 저장됩니다 .
새 폴더 구조를 이미지 메타 데이터 (파일 이름이 저장된 위치)에 저장하여이 문제를 해결할 수 있습니다. 데이터는 wp_generate_attachment_metadata
데이터베이스에 삽입되기 전에 다양한 필터를 통해 실행 되지만 이미 사용자 정의 이미지 편집기를 구현하고 있으므로 이미지 크기 메타 데이터 소스로 다시 이동할 수 있습니다 WP_Image_Editor::multi_resize()
. 다음과 같은 배열을 생성합니다.
Array (
[thumbnail] => Array (
[file] => image.jpg
[width] => 150
[height] => 150
[mime-type] => image/jpeg
)
[medium] => Array (
[file] => image.jpg
[width] => 300
[height] => 300
[mime-type] => image/jpeg
)
)
우리는 multi_resize()
우리의 커스텀 클래스에서 메소드를 덮어 쓸 것입니다 :
function multi_resize($sizes) {
$sizes = parent::multi_resize($sizes);
foreach($sizes as $slug => $data)
$sizes[$slug]['file'] = $data['width']."x".$data['height']."/".$data['file'];
return $sizes;
}
보시다시피, 코드를 교체하지 않아도됩니다. 부모 메서드를 호출하여 메타 데이터를 생성하도록합니다. 그런 다음 결과 배열을 반복 file
하고 각 크기 의 값을 조정합니다 .
이제를 wp_get_attachment_image_src($att_id, array(300, 300))
반환합니다 2013/12/300x300/image.jpg
. 만세!
마지막 생각들
이것이 여러분이 자세히 설명 할 수있는 좋은 근거가 되었기를 바랍니다. 그러나 이미지가 지정된 크기 (예 : 280x300)보다 작 으면 생성 된 접미사 (이 경우 접두사) 및 이미지 크기는 300x300이 아니라 280x300입니다. 작은 이미지를 많이 업로드하면 다른 폴더가 많이 생깁니다.
좋은 해결책은 크기 슬러그를 폴더 이름 ( small
, medium
등)으로 사용하거나 코드를 확장하여 가장 가까운 선호하는 이미지 크기로 반올림하는 것입니다.
너비 만 디렉토리 이름으로 사용하고 싶다고 언급했습니다. 그러나 플러그인이나 테마는 너비는 같지만 높이가 다른 두 가지 크기를 생성 할 수 있습니다.
또한 설정> 미디어에서 '업로드를 월별 및 연도 별 폴더로 구성'을 비활성화하거나 generate_filename
추가 로 조작하여 년 / 월 폴더를 제거 할 수 있습니다 .
도움이 되었기를 바랍니다. 행운을 빕니다!