워드프레스 post 이미지를 featured 이미지로 바꾸는 방법.

Posted on by pkchan

워드프레스에서 테마를 바꾸거나 새로운 테마를 개발할 때 Featured 이미지를 사용할 때가 있습니다. 요즘은 거의 사용하는 추세죠. 포스트 등록할 때 설정한 featured 이미지가 포스트의 헤더 이미지로 바뀌곤 합니다. 하지만 과거에 등록해둔 포스트들은 featured 이미지를 설정하지 않았기 때문에 공백으로 나오겠죠. 일일이 하나하나 featured 이미지를 등록해주면 좋겠지만 어마어마한 양의 포스트들을 수정하기란 쉽지 않습니다.

새로운 레이아웃에 맞추기 위해, 또는 새로운 테마에 적용하기 위해 포스트의 첫 번째 이미지를 자동으로 Featured 이미지로 등록해주는 방법입니다.

function auto_featured_image() {
          global $post;
 
          if (!has_post_thumbnail($post->ID)) {
                    $attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
                     
            if ($attached_image) {
                                foreach ($attached_image as $attachment_id => $attachment) {
                                           set_post_thumbnail($post->ID, $attachment_id);
                                }
                     }
          }
}
global $post;

전역변수 $post에 담긴 오브잭트를 호출합니다. global변수는 워드프레스 DB의 거의 모든 부분을 호출 할 수 있습니다.

if (!has_post_thumbnail($post->ID))

$post의 인자인 id값을 가지고 포스트에 썸네일 이미지가 등록되어있는지 확인합니다. has_post_thumbnail 함수는 워드프레스에서 기본으로 제공하는 컨디션을 확인할 수 있는, 즉 true와 false를 반환하는 변수입니다.
UI부분에서 Featured image로 등록하는 이미지는 CODE에서는 post_thumbnail이라는 이름을 가지고 있습니다.

$attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );

현재 포스트의 contents에서 첫 번째로 등록된 이미지를 $attached_image에 저장합니다. 구지 코드를 직역하면 부모 포스트가 현재 포스트이고, 포스트 타입은 첨부, 첨부 형식은 이미지, 중에 첫 번째 아이를 가져와라 정도 되겠네요.
자, 그러면 현재 포스트에 썸네일 이미지가 없으면 contents의 첫 번째 등장하는 이미지를 가져와 변수로 저장하는 부분까지 완성했습니다.

set_post_thumbnail($post->ID, $attachment_id);

포스트에 썸네일 이미지를 설정합니다. set_post_thumbnail 함수는 워드프레스에서 제공하는 썸네일 이미지를 등록하는 함수입니다. 쉽게 등록하고 삭제할 수 있습니다. *(delete_post_thumbnail($post))

 

이제 함수를 실행해야 합니다. 워드프레스에서 함수를 호출하는 방법은 많습니다. 대표적인 방법으로 add_action에 추가해주는 방법이 있고, post가 호출 될때 직접 실행되도록 index.php나 archive.php 혹은 content.php에 넣어 줄 수도 있겠네요. 어느 시점에서 실행시키냐의 차이입니다. index.php에 넣어준다면 실제 포스트가 화면에 뿌려질 그 시점에 썸네일 이미지가 없으면 content의 첫번째 이미지를 저장하고 뿌려줍니다. add_action으로 등록하면 더욱 다양한 시점에 등록이 가능합니다.

add_action('the_post', 'auto_featured_image'); // 포스트가 화면에 뿌려질때 the_post 함수가 실행됩니다. loop안에 있는 함수 이기 때문에 한페이지에 10개의 포스트에도 각각 적용됩니다. 
add_action('save_post', 'auto_featured_image'); // 포스트를 저장할때
add_action('draft_to_publish', 'auto_featured_image'); //포스트가 draft되는 시점에
add_action('new_to_publish', 'auto_featured_image'); // 포스트를 새로 발행할때
add_action('pending_to_publish', 'auto_featured_image'); // 보류할때.
add_action('future_to_publish', 'auto_featured_image'); // 예약할때.

add_action은 한 액션에 여러 함수를 담는다고 생각하시면 쉽습니다. 예를들어 the_post는 포스트를 인댁싱하여 루프안에서 뿌려주는 역할을 하는 함수입니다. 이곳에 필요한 다양한 함수들이 모여 있습니다. 그리고 add_action으로 방금 만들어낸 auto_featured_image함수를 추가 할 수 있습니다.
그러면 the_post함수가 호출 될 때, add_action으로 등록한 auto_featured_image함수도 같이 실행됩니다.

function auto_featured_image() {
          global $post;
 
          if (!has_post_thumbnail($post->ID)) {
                    $attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
                     
            if ($attached_image) {
                                foreach ($attached_image as $attachment_id => $attachment) {
                                           set_post_thumbnail($post->ID, $attachment_id);
                                }
                     }
          }
}
add_action('the_post', 'auto_featured_image');

완성된 코드입니다.
각 테마에는 테마의 최상위 폴더에 function.php 파일이 존재합니다. function.php의 맨 밑에 완성된 코드를 추가하면 끝입니다.
에디터나 FTP를 사용하지 않아도, Admin > Appearance > Editor 로도 접근이 가능합니다.

 

 

참조 : https://www.gavick.com/blog/wordpress-automatically-set-post-featured-image

Leave a Reply