Archive for December, 2005

글자 중간을 자르는 오류 수정

Wednesday, December 28th, 2005

이 문제는 2.0.1버전에서 해결되었습니다(2006. 2. 2)

Ticket #1647
Ticket #2163
Chageset [3368]
Chageset [3369]

unfusion님의 도움으로 문제를 해결하였습니다
깐미씨의 도움으로 영어로 문제 보고를 하였습니다

워드프레스 트랙백 핵 1.5.2 TE 버전에서 수정되었던 사항입니다
1.5.2버전에서 Wordpress측에 버그 보고를 하였으나 전달이 잘 안되었는지 2.0버전에서 엉뚱한 곳만 수정되었습니다
2.1버전에선 꼭 고쳐져서 나오도록 다시 버그 보고를 하겠습니다

적용파일(/wp-includes/functions-post.php) : 다운

워드프레스에서 트랙백을 보낼때 substr이란 함수로 포스트의 내용중에서 253바이트를 자르고 …을 더해서 보내게 됩니다. 1바이트의 문자일때는 상관이 없는데 UTF-8같은 멀티바이트의 문자에선 글자 중간을 자르게 되는 경우도 발생합니다. 그래서 마지막 문자는 깨진 상태로 보내지는데 트랙백을 받는 쪽에서는 그냥 마지막 한글자만 ?로 나오게 될 뿐입니다. 그렇지만 워드프레스는 mb_convert_encoding이란 함수를 통해 자체적으로 트랙백의 인코딩을 변환합니다. 마지막 깨진 문자때문에 워드프레스는 이 트랙백을 UTF-8이 아닌것으로 인식하고 UTF-8로 재변환을 하게 됩니다. 그래서 결과적으로 트랙백이 깨지게 됩니다.

이 hack은 mbstring 모듈을 설치한 블로그에서만 작동됩니다. 만약 설치가 되지 않았다면 hack을 하지 않은 상태와 같이 작동합니다. mbstring 모듈이 설치가 안되었을 경우 부득이한 경우가 아니라면 호스팅업체에 설치 요청을 할 것을 권장합니다. 워드프레스의 자체의 트랙백 변환은 mbstring에서만 작동하고 제가 만든 트랙백 변환은 iconv에서도 작동하지만 mbstring에서 보다 안정적으로 작동합니다.

만약 mb_strcut 함수를 사용할 수 있는 경우 이 함수를 이용하여 글자를 253바이트 이내에서 자른다. mb_strcut과 substr의 차이점은 mb_strcut은 글자를 인코딩이 깨지지 않게 잘라준다.

/wp-includes/functions-post.php를 열어 do_trackback함수 내의

$excerpt = substr($excerpt, 0, 252) . '...';

를 아래와 같이 바꾼다

if ( function_exists('mb_strcut') )
$excerpt = mb_strcut($excerpt, 0, 252, get_settings('blog_charset')) . '...';
else $excerpt = substr($excerpt, 0, 252) . '...';

워드프레스 2.x 트래백핑 인코딩 문제 해결

Tuesday, December 27th, 2005

Wordpress를 사용하다보면 UTF-8과 EUC-KR로 인코딩된 블로그간에 트랙백을 받거나 보낼때 글씨가 깨지게 된다. 이 hack은 다르게 인코딩된 블로그 사이의 트랙백이 깨지지 않게 하기 위한 것이다. UTF-8로 인코딩된 Wordpress 2.0 버전을 기준으로 작성되었다.

새로운 버전의 워드프레스가 나왔을 때 대처하는 요령

이 포스트에 새로운 버전에 대한 파일이 올라오지 않았을 경우 예전 버전용 파일을 업그레이드한 워드프레스에 덧씌우지 마세요. wp-trackback.php 파일과 functions.php 파일만 예전 버전이므로 제대로 작동할리 만무할뿐 아니라 치명적인 오류를 유발할 수 있습니다. 새버전의 파일에서 포스트의 내용에 나온 부분만 수동으로 고치는 방법만이 안전합니다. 이 포스트의 소스를 Copy해서 에디터에 Paste 할 경우에 작은따옴표(’)를 수정하셔야 합니다. mbstring 모듈 사용자는 wp-trackback.php 파일의 $charset에 EUC-KR을 추가함으로써 간단히 받는 트랙백 문제를 해결할 수 있습니다.

다운로드

Wordpress 1.5x용 : 링크
Wordpress 2.0용 : 다운
Wordpress 2.0용 자르는 문제 해결 통합(mbstring사용시 권장) : 다운 설명
Wordpress 2.0.1용 : 다운
Wordpress 2.0.2용 : 다운
Wordpress 2.0.3용 : 다운
Wordpress 2.0.4용 : 다운
Wordpress 2.0.5용 : 다운
Wordpress 2.0.6용 : 다운
Wordpress 2.0.7용 : 다운
Wordpress 2.1 이상 : 링크

다른 해결방법

영팔님이 약간의 hack이 필요한 플러그인을 만드셨습니다.
워드프레스 EUC-KR 트랙백 플러그인(HACK)

정태영님이 받는 트랙백용 플러그인을 만드셨습니다.
Korean Trackback Plugin

사용방법

받는 트랙백은 자동으로 변환된다.
2.0용 버전에서는 보내는 트랙백 사용방법이 바뀌었다. 트랙백 받는 블로그가 내 블로그와 다른 인코딩을 사용할 경우 트랙백 보내는 주소 앞에 !를 붙여서 사용한다. Send trackbacks to: 의 트랙백 주소 적는 곳에 !http://트랙백주소 를 넣는다.
예) !http://www.windlike.net/blog/236/trackback/
데이타베이스에도 인코딩변환되어 나간 트랙백 주소는 !http://…형태로 !이 붙어서 남는다.

같은 인코딩일 경우 그냥 트랙백 주소만 적는다. !를 붙여서 인코딩을 변환하면 오히려 깨진다.
예) http://www.windlike.net/blog/236/trackback/
상대의 인코딩을 알아내는 방법은 브라우져의 보기 - 인코딩 메뉴를 보면 알 수 있다.

주의사항

적용대상 :
- PHP 4.0.6 이상
- mbstring 모듈이나 iconv 모듈 둘 중 하나가 설치되어 있어야 함

확인방법 :
- 직접 호스팅 업체에 문의
- 다음 코드를 에디터를 이용하여 test.php로 저장한 후 브라우져에서 실행한다(미리 작성된 파일 : 다운)

<?php
echo 'PHP version: ' . phpversion() . '<br />';
if ( function_exists('mb_convert_encoding') ) echo 'mbstring OK!<br />';
else echo 'mbstring fail..<br />';
if ( function_exists('iconv') ) echo 'iconv OK!<br />';
else echo 'iconv fail..<br />';
?>

mbstring OK! 가 나오면 mbstring 모듈을 이용할 수 있다(둘 다 OK일 경우 이방법을 권장)
iconv OK! 가 나오면 iconv 모듈을 이용할 수 있다(mbstring fail 일 경우 이 방법으로 한다)
둘다 fail이면 호스팅 업체에서 둘 중 하나를 설치해 줄때까지 불가능하다

라이센스

Wordpress가 GPL이기 때문에 이 hack 역시 GPL을 따른다. 수정 및 재배포 모두 가능함.

지금까지 도움주신 분들

아거님, 입명이님, H.Moon님, BluedSnow님, 지윤님, UNFGroup님, unfusion님, 영팔

받는 트랙백핑 문제 해결(mbstring)

/wp-trackback.php를 열어 $charset에 EUC-KR을 추가한다

$charset = 'ASCII, UTF-8, EUC-KR, ISO-8859-1, JIS, EUC-JP, SJIS’;
mbstring 모듈을 사용할 수 있을 경우 직접 수정해서 사용하면 편리하다.

받는 트랙백핑 문제 해결(iconv)

정규식을 이용한 is_utf8 함수를 만들어 UTF-8인지 확인한 후 iconv 함수로 인코딩을 변환한다.

/wp-trackback.php를 열어 // trackback is done by a POST 위에 아래의 코드를 추가한다. 이는 이해를 돕기 위치이므로 굳이 이곳이 아니라도 적당한 곳에 추가하면 된다.

// Returns true if $string is valid UTF-8 and false otherwise.
function is_utf8($string) {
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs’, $string);
} // function is_utf8

위 방법은 워드프레스 기본 함수인 seems_utf8()를 사용할 수 있으므로 삭제(참고 : http://082net.com/2006/769/euckr-trackback-hack/)

/wp-trackback.php를 열어

if ( function_exists('mb_convert_encoding') ) {
$title = mb_convert_encoding($title, get_settings('blog_charset'), $charset);
$excerpt = mb_convert_encoding($excerpt, get_settings('blog_charset'), $charset);
$blog_name = mb_convert_encoding($blog_name, get_settings('blog_charset'), $charset);
}

아래에 다음을 추가한다

else if ( function_exists('iconv') ) {
if ( !seems_utf8($title) )
$title = iconv('EUC-KR', 'UTF-8', $title);
if ( !seems_utf8($excerpt) )
$excerpt = iconv('EUC-KR', 'UTF-8', $excerpt);
if ( !seems_utf8($blog_name) )
$blog_name = iconv('EUC-KR', 'UTF-8', $blog_name);
}

보내는 트랙백핑 문제 해결

/wp-includes/functions.php를 열어 trackback 함수를 찾는다

function trackback($trackback_url, $title, $excerpt, $ID) {
global $wpdb, $wp_version;
if ( empty($trackback_url) )
return;
$title = urlencode($title);
$excerpt = urlencode($excerpt);
$blog_name = urlencode(get_settings(’blogname’));
$tb_url = $trackback_url;

를 아래와 같이 바꾼다(굵은 글자가 추가되거나 바뀌는 부분)
$tb_url = $trackback_url;이 위치를 바꾸는 것과
$blog_name = get_settings(’blogname’);이 두부분으로 나뉘어 수정되는것 주의

function trackback($trackback_url, $title, $excerpt, $ID) {
global $wpdb, $wp_version;
if ( empty($trackback_url) )
return;
$blog_name = get_settings(’blogname’);
$tb_url = $trackback_url;
if($trackback_url[0] == ‘!’) {
$trackback_url = substr($trackback_url, 1);
if ( function_exists(’mb_convert_encoding’) ) {
$title = mb_convert_encoding($title, ‘EUC-KR’, ‘UTF-8′);
$excerpt = mb_convert_encoding($excerpt, ‘EUC-KR’, ‘UTF-8′);
$blog_name = mb_convert_encoding($blog_name, ‘EUC-KR’, ‘UTF-8′);
}
else if ( function_exists(’iconv’) ) {
$title = iconv(’UTF-8′, ‘EUC-KR’, $title);
$excerpt = iconv(’UTF-8′, ‘EUC-KR’, $excerpt);
$blog_name = iconv(’UTF-8′, ‘EUC-KR’, $blog_name);
}
}

$title = urlencode($title);
$excerpt = urlencode($excerpt);
$blog_name = urlencode($blog_name);

워드프레스 2.0 업그레이드 방법

Tuesday, December 27th, 2005

Wordpress 2.0.1 버전 추가 내용(2006. 2. 2)
2.0에서 2.0.1로 업그레이드 할 경우 반드시 wp-content/cache 폴더를 지워야 한다
(1.x에서는 이 폴더가 없으므로 신경 안써도 된다)
이 부분만 주의하고 나머지는 같습니다

http://codex.wordpress.org/Upgrading_WordPress 의 내용을 그까이꺼 머 대충 요약(번역이 아님 정확한 내용은 직접 확인하삼)

1. 데이타베이스를 백업하세요

2. 모든 워드프레스 파일을 백업하세요
워드프레스가 들어있는 폴더 전체를 백업하는게 안전합니다.

3. 백업이 잘 되었나 확인하세요

4. 모든 플러그인을 끕니다
관리자 화면에서 Plugin 탭을 누르고 켜져있는 플러그인 모두 Deactivate를 누릅니다

5. 앞의 4단계를 마치지 않고 다음 단계로 넘어가지 마세요

6. 워드프레스 2.0 다운로드 받기
http://wordpress.org/download/ 여기서 받아서 압축을 푸세요

7. 예전 워드프레스 파일 지우기

지우지 말하야 할 파일
* wp-config.php 파일
* wp-content 폴더
* wp-images 폴더
* wp-includes/languages/ 폴더 - 랭귀지 파일을 사용하고 있다면 이 폴더를 지우지 마세요
* .htaccess file - 퍼머링크를 변경해 사용하거나 이 파일에 다른 것들을 적용했을때는 지우지 마세요
* 사용자의 자료들이나 플러그인 등등

지워야 할 파일
* wp-*, readme.html, wp.php, xmlrpc.php, and license.txt 등등 워드프레스가 깔려있는 루트폴더의 파일들(wp-config.php와 .htaccess 파일을 제외)
* wp-admin 폴더
* wp-includes 폴더 단, 랭귀지 파일을 사용한다면 wp-includes/languages/ 폴더는 지우지 마세요

8. 워드프레스 2.0 업로드

9. 업그레이드
http://워드프레스 주소/wp-admin/upgrade.php를 실행합니다

10. 퍼머링크와 .htaccess 업데이트
필요한 사람만 하면됩니다

11. 플러그인 업데이트
워드프레스 2.0에서 사용가능한 플러그인 목록
단, 최신버전인지 확인하세요. 위 목록에 나와있는 플러그인의 최신버전은 2.0에서도 바로 사용가능합니다

12. 플러그인 재사용
관리자 화면의 Plugin탭에서 activate를 눌러 필요한 플러그인을 다시 사용합니다
새로 추가된 WordPress Database Backup Plugin을 사용하기 위해선 wp-content 폴더의 퍼미션을 666이나 777로 변경해야 합니다

13. 새롭게 변경된 사항들에 대해 알아봅니다
머 굳이 알아볼꺼 까지야..