Home 게시판 커뮤니티 Q&A 인코딩관련 질문입니다.

12개 답변, 2 voices Last updated by Avatar of 082net082net 17 years, 8 months 전
  • Avatar of 무시못할석2무시못할석2
    Participant
    @무시못할석2
    #1608

    082님 감사합니다.

    새로 알려주신 메일함수를 플러그인 형태로 수정하는 것이 더 간결할 것 같네요.. (물론, 가방끈이 짧아서 다 이해는 안되지만요.. ^^)

    그리고 필터를 추가하는 것은 기존에 정의된 필터에 관련 필터를 추가하는 역할을 하는것 같네요.. (제가 바로 이해했나 모르겠네요.. ^^) 덕분에 또 새로운 방법을 하나 배운 것 같습니다. 얼마전에 autop 필터를 직접 수정해서 사용하고 있었는데, 플러그인으로 처리가 가능할 것도 같습니다.

    플러그인의 매력에 빠져들것 같습니다. 지금 시간많이 쓰면 안되는데, 중독성이 있는 것 같네요.. ^^

    다시한번 친절한 답변 감사드립니다.
    편안한 밤 되세요.. *^^*

    Avatar of 무시못할석2무시못할석2
    Participant
    @무시못할석2
    #1609

    안녕하세요..
    인코딩관련 질문이 있어 글을 올립니다.
    번거로우시겠지만 좀 알려주시면 감사하겠습니다.

    1번) 댓글이 달리면 관리자에게 메일을 쏘도록 했는데, 메일제목이랑 보낸사람 부분의 한글이 깨집니다. 내용에 있는 한글은 이상이 없구요.. 메일보내는 함수부분에서 제목과 보낸사람 부분의 인코딩을 어떻게 수정해주면 될 것 같은데, 덜컥 손댈 실력이 안됩니다.

    2번) 제 블로그에서 익스플로러를 통해 소스보기를 하면 메모장에서 한글이 전부 깨져서 보입니다.(파이어폭스에서는 제대로 보이구요) 전에는 물론 소스보기해도 한글이 제대로 표시가 되었구요.. 테마를 다른 걸로 바꿔주니까 괜찮더군요.. 아마도 제가 수정한 파일중에 utf-8 형식으로 저장이 안 된 파일이 있어서 그런것 같은데,, 사용중인 테마 파일을 모두 열어서 utf-8 형식으로 저장을 했는데도 도저히 찾을 수가 없습니다.
    혹시나 파일이 utf-8로 인코딩되었는지를 확인할 수 있는 스크립트나 프로그램이 있을까요??
    아, 그리고 혹시 제 메모장 설정에 문제가 있는건 아닐까요?? 번거로우시겠지만 제 블로그(http://cys.pe.kr)에 가셔서 소스보기 함 해주세요..

    끝까지 읽어주셔서 감사드립니다.
    존 하루되세요.. *^^*

    Avatar of 무시못할석2무시못할석2
    Participant
    @무시못할석2
    #1615

    안녕하세요..
    인코딩관련 질문이 있어 글을 올립니다.
    번거로우시겠지만 좀 알려주시면 감사하겠습니다.

    1번) 댓글이 달리면 관리자에게 메일을 쏘도록 했는데, 메일제목이랑 보낸사람 부분의 한글이 깨집니다. 내용에 있는 한글은 이상이 없구요.. 메일보내는 함수부분에서 제목과 보낸사람 부분의 인코딩을 어떻게 수정해주면 될 것 같은데, 덜컥 손댈 실력이 안됩니다.

    2번) 제 블로그에서 익스플로러를 통해 소스보기를 하면 메모장에서 한글이 전부 깨져서 보입니다.(파이어폭스에서는 제대로 보이구요) 전에는 물론 소스보기해도 한글이 제대로 표시가 되었구요.. 테마를 다른 걸로 바꿔주니까 괜찮더군요.. 아마도 제가 수정한 파일중에 utf-8 형식으로 저장이 안 된 파일이 있어서 그런것 같은데,, 사용중인 테마 파일을 모두 열어서 utf-8 형식으로 저장을 했는데도 도저히 찾을 수가 없습니다.
    혹시나 파일이 utf-8로 인코딩되었는지를 확인할 수 있는 스크립트나 프로그램이 있을까요??
    아, 그리고 혹시 제 메모장 설정에 문제가 있는건 아닐까요?? 번거로우시겠지만 제 블로그(http://cys.pe.kr)에 가셔서 소스보기 함 해주세요..

    끝까지 읽어주셔서 감사드립니다.
    존 하루되세요.. *^^*

    Avatar of 082net082net
    Keymaster
    @082net
    #1610

    무시못할석2 Escribi

    Avatar of 082net
    Facebook 사용자 모임 그룹 도 함께 운영되고 있으며, 격 주로 미트업과 스터디를 진행하고 있으니 관심 있으신 분들의 많은 참여 바랍니다 🙂
    Avatar of 082net082net
    Keymaster
    @082net
    #1616

    무시못할석2 Escribi

    Avatar of 082net
    Facebook 사용자 모임 그룹 도 함께 운영되고 있으며, 격 주로 미트업과 스터디를 진행하고 있으니 관심 있으신 분들의 많은 참여 바랍니다 🙂
    Avatar of 무시못할석2무시못할석2
    Participant
    @무시못할석2
    #1611

    082net님 고맙습니다.

    덕분에 잘 해결했습니다.

    소스보기시 글자깨지는 건 예상하신것 처럼 http://cys.pe.kr/js 부분에 문제가 있었습니다.

    js 파일을 저장할 때 utf-8로 저장하지 않았던 모양입니다.

    파일 내용중에 한글이 있었으면 제가 알았을 텐데, 한글이 없어서 몰랐었나 봅니다.

    감사합니다 *^^*

    두번째, 메일쏠때 글자 깨지는 건 제가 질문을 좀 잘 못 올린 것 같습니다. 메일제목은 괜찮고, 보낸사람 이름 부분만 깨졌었니다.

    From: "?뚯뒪?? <wordpress@yourhome.com>

    먼저 알려주신대로 해 보았으나 해결이 되지 않았습니다. 알려주신 내용을 토대로 파일을 검색하던 중에, pluggable-functions.php의 338번째줄(2.0.2 영문버전)에서 아래와 같은 코드를 발견했습니다.

    if ( '' == $comment->comment_author ) {
       $from = "From: "$blogname" <$wp_email>";
          if ( '' != $comment->comment_author_email )
             $reply_to = "Reply-To: $comment->comment_author_email";
        } else {
          $from = "From: "$comment->comment_author" <$wp_email>";
          if ( '' != $comment->comment_author_email )
             $reply_to = "Reply-To: "$comment->comment_author_email" <$comment->comment_author_email>";
        }

    위에서 보면 $from = "From: "$blogname" <$wp_email>"; 와 $from = "From: "$comment->comment_author" <$wp_email>"; 부분을 착안해서 아래와 같이 해 봤더니 해결이 된 것 같습니다.

       if ( '' == $comment->comment_author ) {
         $from_name = "=?UTF-8?B?".base64_encode($blogname)."?=";  // 변경부분
         $from = "From: "$from_name" <$wp_email>";               // 변경부분
    //   $from = "From: "$blogname" <$wp_email>";                // 기존부분주석처리
          if ( '' != $comment->comment_author_email )
             $reply_to = "Reply-To: $comment->comment_author_email";
        } else {
         $from_name = "=?UTF-8?B?".base64_encode($comment->comment_author)."?="; // 변경부분
          $from = "From: "$from_name" <$wp_email>";                             // 변경부분
    //   $from = "From: "$comment->comment_author" <$wp_email>";               // 기존부분주석처리
          if ( '' != $comment->comment_author_email )
             $reply_to = "Reply-To: "$comment->comment_author_email" <$comment->comment_author_email>";
        }

    하나는 트랙백으로 온 걸 가공하는 과정같고 하나는 코멘트로 온 걸 과공하는 과정 같습니다. 코멘트는 테스트 해보니 아래처럼 아주 만족스럽게 나오네요.. 트랙백은 테스트를 못 해봤는데, 별 문제 없지 않을까 싶습니다.

    From: "=?UTF-8?B?7YWM7Iqk7Yq4?=" <wordpress@yourhome.com> 메일 원본소스에서는 이렇게 보이고,
    From: "테스트" <wordpress@yourhome.com> 화면에서는 이렇게 보입니다.

    082net님, 덕분에 눈에 걸리던게 해결되서 너무 감사하고 있습니다.
    휴일 마무리 잘하시길 바랍니다.

    Avatar of 무시못할석2무시못할석2
    Participant
    @무시못할석2
    #1617

    082net님 고맙습니다.

    덕분에 잘 해결했습니다.

    소스보기시 글자깨지는 건 예상하신것 처럼 http://cys.pe.kr/js 부분에 문제가 있었습니다.

    js 파일을 저장할 때 utf-8로 저장하지 않았던 모양입니다.

    파일 내용중에 한글이 있었으면 제가 알았을 텐데, 한글이 없어서 몰랐었나 봅니다.

    감사합니다 *^^*

    두번째, 메일쏠때 글자 깨지는 건 제가 질문을 좀 잘 못 올린 것 같습니다. 메일제목은 괜찮고, 보낸사람 이름 부분만 깨졌었니다.

    From: "?뚯뒪?? <wordpress@yourhome.com>

    먼저 알려주신대로 해 보았으나 해결이 되지 않았습니다. 알려주신 내용을 토대로 파일을 검색하던 중에, pluggable-functions.php의 338번째줄(2.0.2 영문버전)에서 아래와 같은 코드를 발견했습니다.

    if ( '' == $comment->comment_author ) {
       $from = "From: "$blogname" <$wp_email>";
          if ( '' != $comment->comment_author_email )
             $reply_to = "Reply-To: $comment->comment_author_email";
        } else {
          $from = "From: "$comment->comment_author" <$wp_email>";
          if ( '' != $comment->comment_author_email )
             $reply_to = "Reply-To: "$comment->comment_author_email" <$comment->comment_author_email>";
        }

    위에서 보면 $from = "From: "$blogname" <$wp_email>"; 와 $from = "From: "$comment->comment_author" <$wp_email>"; 부분을 착안해서 아래와 같이 해 봤더니 해결이 된 것 같습니다.

       if ( '' == $comment->comment_author ) {
         $from_name = "=?UTF-8?B?".base64_encode($blogname)."?=";  // 변경부분
         $from = "From: "$from_name" <$wp_email>";               // 변경부분
    //   $from = "From: "$blogname" <$wp_email>";                // 기존부분주석처리
          if ( '' != $comment->comment_author_email )
             $reply_to = "Reply-To: $comment->comment_author_email";
        } else {
         $from_name = "=?UTF-8?B?".base64_encode($comment->comment_author)."?="; // 변경부분
          $from = "From: "$from_name" <$wp_email>";                             // 변경부분
    //   $from = "From: "$comment->comment_author" <$wp_email>";               // 기존부분주석처리
          if ( '' != $comment->comment_author_email )
             $reply_to = "Reply-To: "$comment->comment_author_email" <$comment->comment_author_email>";
        }

    하나는 트랙백으로 온 걸 가공하는 과정같고 하나는 코멘트로 온 걸 과공하는 과정 같습니다. 코멘트는 테스트 해보니 아래처럼 아주 만족스럽게 나오네요.. 트랙백은 테스트를 못 해봤는데, 별 문제 없지 않을까 싶습니다.

    From: "=?UTF-8?B?7YWM7Iqk7Yq4?=" <wordpress@yourhome.com> 메일 원본소스에서는 이렇게 보이고,
    From: "테스트" <wordpress@yourhome.com> 화면에서는 이렇게 보입니다.

    082net님, 덕분에 눈에 걸리던게 해결되서 너무 감사하고 있습니다.
    휴일 마무리 잘하시길 바랍니다.

    Avatar of 082net082net
    Keymaster
    @082net
    #1612

    해결되었다니 다행입니다. 소스보기 인코딩건은 소 뒷걸음질치다 쥐잡은거였습니다.. ^^;

    해결 내용을 자세하게 올려주셔서 같은 문제로 고민하실 분들께 많은 도움이 되겠네요. 😉

    Avatar of 082net
    Facebook 사용자 모임 그룹 도 함께 운영되고 있으며, 격 주로 미트업과 스터디를 진행하고 있으니 관심 있으신 분들의 많은 참여 바랍니다 🙂
    Avatar of 082net082net
    Keymaster
    @082net
    #1618

    해결되었다니 다행입니다. 소스보기 인코딩건은 소 뒷걸음질치다 쥐잡은거였습니다.. ^^;

    해결 내용을 자세하게 올려주셔서 같은 문제로 고민하실 분들께 많은 도움이 되겠네요. 😉

    Avatar of 082net
    Facebook 사용자 모임 그룹 도 함께 운영되고 있으며, 격 주로 미트업과 스터디를 진행하고 있으니 관심 있으신 분들의 많은 참여 바랍니다 🙂
    Avatar of 무시못할석2무시못할석2
    Participant
    @무시못할석2
    #1613

    wp/wp-includes/pluggable-functions.php 파일에 있는 wp_notify_postauthor 함수를 직접 수정하는 것보다 플러그인을 이용하는 것이 업그레이드 할 때 편리할 것 같아서 여기저기서 소스보면서 플러그인을 한번 만들어 봤습니다.

    if (!function_exists('wp_notify_postauthor')) {
    function wp_notify_postauthor($comment_id, $comment_type='') {

    ......(중략)......

       if ( '' == $comment->comment_author ) {
         $from_name = "=?UTF-8?B?".base64_encode($blogname)."?=";                   // 변경부분
         $from = "From: "$from_name" <$wp_email>";                                // 변경부분
    //   $from = "From: "$blogname" <$wp_email>";                                 // 기존부분주석처리
          if ( '' != $comment->comment_author_email )
             $reply_to = "Reply-To: $comment->comment_author_email";
        } else {
         $from_name = "=?UTF-8?B?".base64_encode($comment->comment_author)."?=";    // 변경부분
         $from = "From: "$from_name" <$wp_email>";                                // 변경부분
    //   $from = "From: "$comment->comment_author" <$wp_email>";                  // 기존부분주석처리
          if ( '' != $comment->comment_author_email )
             $reply_to = "Reply-To: "$comment->comment_author_email" <$comment->comment_author_email>";
        }

    ......(중략)......

    }
    }

    add_action('init', 'wp_notify_postauthor');

    일단 제 계정에서는 문제가 없는데, 기본 지식이 없이 만든거라 문제가 없을지 걱정입니다. 그리고 몇가지 궁금한것이 있어 질문을 드립니다.

    일단, 워드프레스 홈페이지에 보니 pluggable-functions.php 가 워드프레스 코어 파일을 건들지 않고, 수정할 수 있도록 했다는 것 같은데요. 영어가 좀 딸려서 정확한 개념이 이해가 안됩니다. 제가 한 것처럼 pluggable-functions.php 파일 내에 있는 함수들을 플러그인으로 수정하라는 것인지, 아니면 pluggable-functions.php 파일을 수정해서 쓰라는 것인지 잘 이해가 되지 않습니다. 정황상으로는 pluggable-functions.php 파일 내의 함수는 플러그인으로 수정해서 쓸수 있는 것 같은데, 확증이 없네요..

    두번째, 질문입니다.

    if (!function_exists('wp_notify_postauthor'))

    처음에 위에 있는 것처럼 젤 첫 줄을 빼고 하니까 플러그인 관리 페이지에서 활성화를 하면 함수정의가 중복되었다는 에러가 뜹니다. 그러나, 테스트 메일을 보내면 문제가 없이 잘 되구요. 결국 위의 코드로 한 번 감싸주니까 에러가 생기지 않했습니다.
    제가 워드프레스 홈페이지에 있는 문서를 봤을때는 플러그인이 실행된 후, pluggable-functions.php가 실행된다고 되어있었는데, 그렇다면 저렇게 함수중복 체크를 하지 않아도 에러가 발생하지 않아야 되지 않을까요? 즉, 플러그인의 함수가 먼저 정의되고 pluggable-functions.php의 함수가 정의될 때 함수존재여부를 체크하기 때문에 pluggable-functions.php의 함수는 정의가 되지 않아야(skip) 될 것이고, 함수가 중복정의되었다는 에러가 발생하지 않아야 될 것 같습니다.
    반대로 pluggable-functions.php의 함수가 먼저 정의되고, 플러그인의 함수가 나중에 정의된다면 현재 제가 짠 플러그인 내의 함수는 정의되지 않고, 물론 에러도 없고, 플러그인의 효과도 없어야 겠지만, 결과는 플러그인의 효과가 나타나게 됩니다.
    어느부분인가에서 제가 잘못알고 있는것 같은데, 어딘지를 모르겠습니다.

    마지막, 질문입니다. 위의 플러그인에서 일부분 수정을 위해서 wp_notify_postauthor 함수 전체를 새로 정의를 해줬습니다. 함수내에서 바뀐부분은 몇 줄 안되는데, 전체 함수를 바꾸는 난리를 쳤는데 이건 상당히 비효율적인것 같습니다. 혹시라도 플러그인으로 처리하면서도 부분만 바꾸는 방법은 없는지 알고 싶습니다. (사실, 개인적으로는 안될 것 같습니다만, 혹시나 제가 모르고 있나 싶어서요..)

    긴글 읽어주셔서 감사드립니다.
    너무 궁금해서 염치불구하고 질문 드렸습니다.
    존 하루되세요.. *^^*

    Avatar of 무시못할석2무시못할석2
    Participant
    @무시못할석2
    #1619

    wp/wp-includes/pluggable-functions.php 파일에 있는 wp_notify_postauthor 함수를 직접 수정하는 것보다 플러그인을 이용하는 것이 업그레이드 할 때 편리할 것 같아서 여기저기서 소스보면서 플러그인을 한번 만들어 봤습니다.

    if (!function_exists('wp_notify_postauthor')) {
    function wp_notify_postauthor($comment_id, $comment_type='') {

    ......(중략)......

       if ( '' == $comment->comment_author ) {
         $from_name = "=?UTF-8?B?".base64_encode($blogname)."?=";                   // 변경부분
         $from = "From: "$from_name" <$wp_email>";                                // 변경부분
    //   $from = "From: "$blogname" <$wp_email>";                                 // 기존부분주석처리
          if ( '' != $comment->comment_author_email )
             $reply_to = "Reply-To: $comment->comment_author_email";
        } else {
         $from_name = "=?UTF-8?B?".base64_encode($comment->comment_author)."?=";    // 변경부분
         $from = "From: "$from_name" <$wp_email>";                                // 변경부분
    //   $from = "From: "$comment->comment_author" <$wp_email>";                  // 기존부분주석처리
          if ( '' != $comment->comment_author_email )
             $reply_to = "Reply-To: "$comment->comment_author_email" <$comment->comment_author_email>";
        }

    ......(중략)......

    }
    }

    add_action('init', 'wp_notify_postauthor');

    일단 제 계정에서는 문제가 없는데, 기본 지식이 없이 만든거라 문제가 없을지 걱정입니다. 그리고 몇가지 궁금한것이 있어 질문을 드립니다.

    일단, 워드프레스 홈페이지에 보니 pluggable-functions.php 가 워드프레스 코어 파일을 건들지 않고, 수정할 수 있도록 했다는 것 같은데요. 영어가 좀 딸려서 정확한 개념이 이해가 안됩니다. 제가 한 것처럼 pluggable-functions.php 파일 내에 있는 함수들을 플러그인으로 수정하라는 것인지, 아니면 pluggable-functions.php 파일을 수정해서 쓰라는 것인지 잘 이해가 되지 않습니다. 정황상으로는 pluggable-functions.php 파일 내의 함수는 플러그인으로 수정해서 쓸수 있는 것 같은데, 확증이 없네요..

    두번째, 질문입니다.

    if (!function_exists('wp_notify_postauthor'))

    처음에 위에 있는 것처럼 젤 첫 줄을 빼고 하니까 플러그인 관리 페이지에서 활성화를 하면 함수정의가 중복되었다는 에러가 뜹니다. 그러나, 테스트 메일을 보내면 문제가 없이 잘 되구요. 결국 위의 코드로 한 번 감싸주니까 에러가 생기지 않했습니다.
    제가 워드프레스 홈페이지에 있는 문서를 봤을때는 플러그인이 실행된 후, pluggable-functions.php가 실행된다고 되어있었는데, 그렇다면 저렇게 함수중복 체크를 하지 않아도 에러가 발생하지 않아야 되지 않을까요? 즉, 플러그인의 함수가 먼저 정의되고 pluggable-functions.php의 함수가 정의될 때 함수존재여부를 체크하기 때문에 pluggable-functions.php의 함수는 정의가 되지 않아야(skip) 될 것이고, 함수가 중복정의되었다는 에러가 발생하지 않아야 될 것 같습니다.
    반대로 pluggable-functions.php의 함수가 먼저 정의되고, 플러그인의 함수가 나중에 정의된다면 현재 제가 짠 플러그인 내의 함수는 정의되지 않고, 물론 에러도 없고, 플러그인의 효과도 없어야 겠지만, 결과는 플러그인의 효과가 나타나게 됩니다.
    어느부분인가에서 제가 잘못알고 있는것 같은데, 어딘지를 모르겠습니다.

    마지막, 질문입니다. 위의 플러그인에서 일부분 수정을 위해서 wp_notify_postauthor 함수 전체를 새로 정의를 해줬습니다. 함수내에서 바뀐부분은 몇 줄 안되는데, 전체 함수를 바꾸는 난리를 쳤는데 이건 상당히 비효율적인것 같습니다. 혹시라도 플러그인으로 처리하면서도 부분만 바꾸는 방법은 없는지 알고 싶습니다. (사실, 개인적으로는 안될 것 같습니다만, 혹시나 제가 모르고 있나 싶어서요..)

    긴글 읽어주셔서 감사드립니다.
    너무 궁금해서 염치불구하고 질문 드렸습니다.
    존 하루되세요.. *^^*

    Avatar of 082net082net
    Keymaster
    @082net
    #1614

    정황상으로는 pluggable-functions.php 파일 내의 함수는 플러그인으로 수정해서 쓸수 있는 것 같은데, 확증이 없네요..

    http://wordpress.co.kr/wiki/index.php/Pluggable_Functions
    이 페이지를 보신듯 한데… 맞죠?
    어ㅤㅉㅐㅎ든 짧은 영어로 제 나름대로 이해한 내용으로는, 무시못할석2님의 예상이 맞습니다.

    1. 같은 이름을 가진 함수를 만들어서 플러그인으로 활성화 시키면 나중에 추가되는 pluggable-functions.php 내의 함수는 무시되게 됩니다.

    2. 워드프레스의 구조를 정확하게는 몰라서 왜 그 라인을 추가해애만 제대로 작동하는지는 모르겠지만. 관리페이지나 테마페이지에서 플러그인을 불러오는 과정에서 중복 문제가 발생하는듯 합니다. 특히 플러그인을 등록된 함수는 로딩할때마다 체크하기 때문인듯 하네요. 저는 그냥 codex페이지에서 그 라인을 추가해줘야 오류가 발생하지 않는다고 해서 그렇게 하고 있습니다 😉

    3. 비효율적이지는 않습니다. 어짜피 같은 이름의 함수가 플러그인을 존재하는지 확인해서 존재한다면 그 부분을 건너뛰기때문에 파일내의 함수를 수정하는것과 거의 같습니다.

    그 외에도 사용하신 방법과 조금 다른 접근 방법이 두가지 있습니다.

    하나는 wp_notify_postauthor() 함수만 수정하지 않고, wp_mail() 함수자체에서 인코딩 문제를 해결하는 것입니다.

    wp_mail 함수를 수정한 플러그인

    <?php
    /*
    Plugin Name: WP Mail Hack
    Plugin URI: http://082net.com/
    Description: Fix mail header for utf-8.
    Version: 1
    Author: Cheon, Young-Min
    Author URI: http://082net.com/
    */

    if ( !function_exists('wp_mail') && !function_exists('mail_header_to_utf8') ) :
    function wp_mail($to, $subject, $message, $headers = '') {
       if( $headers == '' ) {
          $headers = "MIME-Version: 1.0n" .
             "From: wordpress@" . preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])) . "n" .
             "Content-Type: text/plain; charset="" . get_settings('blog_charset') . ""n";
       }
       $subject = mail_header_to_utf8($subject);
       if(preg_match('/From:(s*?)"(.*?)"(s*?)<(.*?)>/ie', $headers, $match)) {
          $new = explode("n", $headers);
          $new_headers = "";
          for($i=0;$i<count($new); $i++) {
             if(!empty($new[$i])) {
                $new_headers .= (strpos('From: "', $new[$i]) !== false)?'From: "'.mail_header_to_utf8($match[2]).'" <'.$match[4].'>'."n":$new[$i]."n";
             }
          }
          $headers = $new_headers;
       }
       return @mail($to, $subject, $message, $headers);
    }

    function mail_header_to_utf8($text) {
       if(strpos(strtolower($text), "=?utf-8") === FALSE) {
          $text = "=?UTF-8?B?".base64_encode($text)."?=";
       }
       return $text;
    }
    endif;

    ?>

    wp_notify_postauthor()함수의 맨 마지막부분쯤에 apply_filters(‘….. 부분이 있더군요. 그에 따라 관련 필터를 추가하는 방법으로 인코딩을 변경하는것이 또 다른 방법이 될 수 있습니다.

    $subject = apply_filters('comment_notification_subject', $subject, $comment_id);
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment_id);

    필터기능을 이용한 플러그인.

    class UTF8Mail {

       function _subject($subject, $comment_id = 0) {
          return UTF8Mail::_to_utf8($subject);
       }

       function _header($headers, $comment_id = 0) {
          if(preg_match('/From:(s*?)"(.*?)"(s*?)<(.*?)>/ie', $headers, $match)) {
             $new = explode("n", $headers);
             $new_headers = "";
             for($i=0;$i<count($new); $i++) {
                if(!empty($new[$i])) {
                   $new_headers .= (strpos('From: "', $new[$i]) !== false)?'From: "'.UTF8Mail::_to_utf8($match[2]).'" <'.$match[4].'>'."n":$new[$i]."n";
                }
             }
             return $new_headers;
          }
          return $headers;
       }

       function _to_utf8($text) {
          if(strpos(strtolower($text), "=?utf-8") === FALSE) {
             $name = "=?UTF-8?B?".base64_encode($text)."?=";
          }
          return $text;
       }
    }

    add_filter('comment_notification_subject', array('UTF8Mail', '_subject'));
    add_filter('comment_notification_headers', array('UTF8Mail', '_header'));

    안그래도 방금전에 그림동화님과 워드프레스 한글 패키지 이야기 하면서 메일 인코딩 부분을 언급했던 했던 터라 나중을 위해서 만들어 본것 입니다. 🙂

    덧) preg_replace를 써보려고 했는데 등록자 이름에 큰따옴표가 들어가버리면 빈화면만 출력되는 오류가 발생하는데 해결법을 몰라 방법을 바꿨습니다.

    Avatar of 082net
    Facebook 사용자 모임 그룹 도 함께 운영되고 있으며, 격 주로 미트업과 스터디를 진행하고 있으니 관심 있으신 분들의 많은 참여 바랍니다 🙂
    Avatar of 082net082net
    Keymaster
    @082net
    #1620

    정황상으로는 pluggable-functions.php 파일 내의 함수는 플러그인으로 수정해서 쓸수 있는 것 같은데, 확증이 없네요..

    http://wordpress.co.kr/wiki/index.php/Pluggable_Functions
    이 페이지를 보신듯 한데… 맞죠?
    어ㅤㅉㅐㅎ든 짧은 영어로 제 나름대로 이해한 내용으로는, 무시못할석2님의 예상이 맞습니다.

    1. 같은 이름을 가진 함수를 만들어서 플러그인으로 활성화 시키면 나중에 추가되는 pluggable-functions.php 내의 함수는 무시되게 됩니다.

    2. 워드프레스의 구조를 정확하게는 몰라서 왜 그 라인을 추가해애만 제대로 작동하는지는 모르겠지만. 관리페이지나 테마페이지에서 플러그인을 불러오는 과정에서 중복 문제가 발생하는듯 합니다. 특히 플러그인을 등록된 함수는 로딩할때마다 체크하기 때문인듯 하네요. 저는 그냥 codex페이지에서 그 라인을 추가해줘야 오류가 발생하지 않는다고 해서 그렇게 하고 있습니다 😉

    3. 비효율적이지는 않습니다. 어짜피 같은 이름의 함수가 플러그인을 존재하는지 확인해서 존재한다면 그 부분을 건너뛰기때문에 파일내의 함수를 수정하는것과 거의 같습니다.

    그 외에도 사용하신 방법과 조금 다른 접근 방법이 두가지 있습니다.

    하나는 wp_notify_postauthor() 함수만 수정하지 않고, wp_mail() 함수자체에서 인코딩 문제를 해결하는 것입니다.

    wp_mail 함수를 수정한 플러그인

    <?php
    /*
    Plugin Name: WP Mail Hack
    Plugin URI: http://082net.com/
    Description: Fix mail header for utf-8.
    Version: 1
    Author: Cheon, Young-Min
    Author URI: http://082net.com/
    */

    if ( !function_exists('wp_mail') && !function_exists('mail_header_to_utf8') ) :
    function wp_mail($to, $subject, $message, $headers = '') {
       if( $headers == '' ) {
          $headers = "MIME-Version: 1.0n" .
             "From: wordpress@" . preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])) . "n" .
             "Content-Type: text/plain; charset="" . get_settings('blog_charset') . ""n";
       }
       $subject = mail_header_to_utf8($subject);
       if(preg_match('/From:(s*?)"(.*?)"(s*?)<(.*?)>/ie', $headers, $match)) {
          $new = explode("n", $headers);
          $new_headers = "";
          for($i=0;$i<count($new); $i++) {
             if(!empty($new[$i])) {
                $new_headers .= (strpos('From: "', $new[$i]) !== false)?'From: "'.mail_header_to_utf8($match[2]).'" <'.$match[4].'>'."n":$new[$i]."n";
             }
          }
          $headers = $new_headers;
       }
       return @mail($to, $subject, $message, $headers);
    }

    function mail_header_to_utf8($text) {
       if(strpos(strtolower($text), "=?utf-8") === FALSE) {
          $text = "=?UTF-8?B?".base64_encode($text)."?=";
       }
       return $text;
    }
    endif;

    ?>

    wp_notify_postauthor()함수의 맨 마지막부분쯤에 apply_filters(‘….. 부분이 있더군요. 그에 따라 관련 필터를 추가하는 방법으로 인코딩을 변경하는것이 또 다른 방법이 될 수 있습니다.

    $subject = apply_filters('comment_notification_subject', $subject, $comment_id);
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment_id);

    필터기능을 이용한 플러그인.

    class UTF8Mail {

       function _subject($subject, $comment_id = 0) {
          return UTF8Mail::_to_utf8($subject);
       }

       function _header($headers, $comment_id = 0) {
          if(preg_match('/From:(s*?)"(.*?)"(s*?)<(.*?)>/ie', $headers, $match)) {
             $new = explode("n", $headers);
             $new_headers = "";
             for($i=0;$i<count($new); $i++) {
                if(!empty($new[$i])) {
                   $new_headers .= (strpos('From: "', $new[$i]) !== false)?'From: "'.UTF8Mail::_to_utf8($match[2]).'" <'.$match[4].'>'."n":$new[$i]."n";
                }
             }
             return $new_headers;
          }
          return $headers;
       }

       function _to_utf8($text) {
          if(strpos(strtolower($text), "=?utf-8") === FALSE) {
             $name = "=?UTF-8?B?".base64_encode($text)."?=";
          }
          return $text;
       }
    }

    add_filter('comment_notification_subject', array('UTF8Mail', '_subject'));
    add_filter('comment_notification_headers', array('UTF8Mail', '_header'));

    안그래도 방금전에 그림동화님과 워드프레스 한글 패키지 이야기 하면서 메일 인코딩 부분을 언급했던 했던 터라 나중을 위해서 만들어 본것 입니다. 🙂

    덧) preg_replace를 써보려고 했는데 등록자 이름에 큰따옴표가 들어가버리면 빈화면만 출력되는 오류가 발생하는데 해결법을 몰라 방법을 바꿨습니다.

    Avatar of 082net
    Facebook 사용자 모임 그룹 도 함께 운영되고 있으며, 격 주로 미트업과 스터디를 진행하고 있으니 관심 있으신 분들의 많은 참여 바랍니다 🙂
13 글 보임 - 1에서 13 까지 (총 13 중에서)
  • 답변은 로그인 후 가능합니다.