
대개 워드프레스로 포스트를 작성하면서 이미지도 함께 첨부합니다. 그러나 종종 포스트를 삭제했을 때, 이미지는 여전히 남아있게 되는데, 오늘은 “포스트 이미지 자동 삭제”라는 주제에 대해 깊이 있게 살펴보겠습니다.
포스트를 삭제해도 이미지는 삭제되지 않는 이유
포스트를 삭제했음에도 불구하고 이미지가 남아있는 이유는, 이미지와 포스트가 데이터베이스 내에서 서로 다르게 처리되기 때문입니다. 포스트를 삭제할 때, WordPress는 해당 포스트의 메타 정보와 콘텐츠를 삭제하지만, 이와 연결된 이미지는 별도로 관리되는 첨부파일로 취급됩니다. 따라서 기본적으로 이미지는 남아있게 됩니다.
여기서 문제가 발생하는데, 포스트와 관련된 이미지가 계속해서 남아있을 경우, 저장공간이 낭비되고 사이트의 속도 저하 등의 문제를 일으킬 수 있지요.
매번 불필요한 이미지를 Image Library (미디어 라이브러리)에서 삭제하는 것은 번거롭기도 하고, 포스트가 많아지면 관리하기가 어렵습니다.
포스트 이미지 자동 삭제를 위한 함수 소개
아래는 포스트 삭제 시 연결된 모든 이미지를 삭제하기 위한 함수 코드입니다.
function delete_images_with_post( $post_id ) {
// 리비전은 무시
if ( wp_is_post_revision( $post_id ) ) {
return;
}
// 대표 이미지 삭제
$thumbnail_id = get_post_thumbnail_id( $post_id );
if ( $thumbnail_id ) {
wp_delete_attachment( $thumbnail_id, true );
}
// 본문에 첨부된 모든 이미지 삭제
$attachments = get_attached_media( 'image', $post_id );
if ( $attachments ) {
foreach ( $attachments as $attachment ) {
wp_delete_attachment( $attachment->ID, true );
}
}
}
add_action( 'before_delete_post', 'delete_images_with_post' );
함수의 작동 방식
위의 함수는 `add_action( ‘before_delete_post‘, ‘delete_images_with_post’ );` 구문에 의해 `before_delete_post`라는 액션 훅에 연결됩니다. 이 훅은 포스트가 삭제되기 직전에 실행되며, 이 때에 ‘delete_image_with_post‘ 함수가 실행되도록 한 것으로, 이 함수에서 포스트와 연결된 이미지를 찾아 삭제하는 작업을 수행하도록 한 것입니다.
1. **리비전 무시**: 함수는 먼저, 삭제된 포스트가 리비전인지 확인합니다. 리비전은 포스트가 수정될 때마다 자동으로 생성되는 이전 버전이므로, 이러한 비즈니스 로직을 통해 필요없는 리비전을 건너뜁니다.
2. **대표 이미지 삭제**: 포스트와 연결된 대표 이미지를 찾기 위해 `get_post_thumbnail_id` 함수를 사용합니다. 만약 대표 이미지가 존재한다면, `wp_delete_attachment` 함수를 통해 해당 이미지를 삭제합니다.
3. **본문의 모든 이미지 삭제**: 본문에 첨부된 모든 이미지를 찾기 위해 `get_attached_media` 함수를 사용합니다. 여기서 ‘image’ 타입을 지정해 모든 이미지 형식을 추출한 후, 각각의 이미지를 삭제하는 루프를 실행합니다.
사용된 액션 훅 및 관련 훅 소개
`before_delete_post` 라는 액션 훅은 포스트가 삭제되기 직전에 실행되는 것으로, 이 훅이 작동할 때 실행시키고자 하는 기능을 함수로 정의하여 호출하는 형태로 워드프레스에서 필요한 기능들을 추가할 수 있습니다. 워드프레스 기능 향상을 이끄는 여러 플러그인들도 이러한 ‘훅 (Hook)‘ 을 사용하여 기능을 구현합니다.
유사한 액션 훅
1. **after_delete_post**: 이 훅은 포스트가 삭제된 후에 실행됩니다. 이 시점에서 추적이나 로그 기록 등 후처리가 필요할 경우 유용합니다.
2. **delete_attachment**: 이 훅은 첨부파일이 삭제될 때 발생합니다. 이미지를 삭제하는 기능에 사용할 수 있습니다.
3. **before_delete_attachment**: 첨부파일이 삭제되기 전에 실행되며, 특정 조건에 따라 삭제를 막거나 추가 작업을 할 수 있습니다.
어떻게 사용할까?
위 코드를 테마 폴더에 있는 functions.php 파일에 위 함수를 추가해 넣기만 하면 됩니다. functions.php 수정과 관련해서는 아래 글을 참고해 주세요.
functions.php 에 위 코드가 추가되고 난 이후에는, 포스트를 삭제하면 포스트에 포함되어 있던 이미지 들도 모두 같이 삭제됩니다. (데이터베이스 기록에서도 제거되고, 서버에 저장되어 있던 이미지 파일도 삭제됩니다.)
참고 사항
- ‘휴지통’ 으로 보내는 ‘삭제’ 때는 작동하지 않습니다. ‘영구히 삭제’ 를 할 때 작동합니다.
- 같은 이미지가 다른 포스트에서도 사용되고 있는 경우에는, 다른 포스트에서 이미지가 표시되지 않게 됩니다. 같은 이미지를 여러 포스트에 같이 사용하고 있는 경우에는 사용하지 않는 것이 좋겠습니다.
마치며
포스트와 연결된 이미지를 자동으로 삭제하는 방법은 매우 유익하며, 블로그 관리에 큰 도움이 됩니다. 코드 작성을 통해 데이터베이스의 효율성을 극대화하고, 사이트의 전반적인 성능도 향상시킬 수 있습니다.
포스트를 삭제할 때 남아있는 이미지 문제는 귀찮음이지만, 위의 방법을 적용하면 손쉽게 해결할 수 있습니다. 실제로 적용할 때는 위 코드를 functions.php 파일에 추가해 초 간단하게 활용해 보세요!
[wp_is_post_revision] : 포스트가 리비전인지 확인하는 기능으로, 리비전인 경우 특정 작업을 건너뛴다.
[get_post_thumbnail_id] : 특정 포스트의 대표 이미지 ID를 가져오는 함수다.
[wp_delete_attachment] : 특정 첨부파일을 삭제하는 함수로, 두 번째 매개변수로 강제 삭제 여부를 설정할 수 있다.
[get_attached_media] : 특정 포스트에 첨부된 미디어의 목록을 가져오는 함수다.