Twitter for WordPress 플러그인의 한글 버그 수정
트위터(Twitter)를 WordPress와 연동해서 사용해보려고 Twitter for WordPress 플러그인을 설치했는데, 한글이 깨진다. 처음에는 UTF-8 인코딩을 사용하지 않아서 발생한 문제인가 싶었는데, 원인은 바로 WordPress의 라이브러리에 있었다.
트위터에서 발행하는 RSS 파일을 가져올 때 사용하는 함수가 fetch_rss()인데, 蛦와 같은 XML entity를 엉뚱한 로케일(locale)로 해석하여 ???와 같은 문자열로 반환하는 것이 문제의 원인이다.
이 플러그인의 PHP 스크립트 파일인 twitter.php를 열어보면 twitter_messages()라는 함수가 있는데, 이게 바로 화면 왼쪽에 보이는 트위터 위짓(widget)의 호출 함수이다.
이 함수 첫 부분은 다음과 같다.
function twitter_messages($username = '', $num = 1, $list = false, $update = true, $linked = '#', $hyperlinks = true, $twitter_users = true, $encode_utf8 = false) { global $twitter_options; include_once(ABSPATH . WPINC . '/rss.php'); $messages = fetch_rss('http://twitter.com/statuses/user_timeline/'.$username.'.rss'); if ($list) echo '
- ';
fetch_rss() 함수가 호출되고 있는 것을 확인할 수 있는데, 이것을 twitter_fetch_rss()로 대체한다. twitter_fetch_rss() 함수를 twitter_message() 함수 바로 위에 작성해 보자.
function twitter_fetch_rss($server, $url) { $data = new Message; $is_in_item = false; $message = array(); $fp = fsockopen($server, 80, $errno, $errstr, 10); $request_string = "GET $url HTTP/1.0\n"; $request_string .= "\n"; if (fputs($fp, $request_string)) { while (!feof($fp)) { $line = fgets($fp); if (preg_match("/^HTTP\/1\.\d \d+ OK/", $line)) { continue; } else if (preg_match("/^[A-Za-z\-]+: /", $line)) { continue; } else if (preg_match("/^HTTP\/1\.\d/", $line)) { print $line . "\n"; } if (preg_match("/^\s*<([^>]+)>\s*$/", $line, $matches)) { $key = $matches[1]; $value = $matches[2]; if ($key == "item") { $is_in_item = true; reset($message); } else if ($key == "/item") { $is_in_item = false; array_push($data->items, $message); } } else if (preg_match("/<([^>]+)>([^<]+)<[^>]+>/", $line, $matches)) { $key = $matches[1]; $value = $matches[2]; if ($is_in_item == true) { $message[strtolower($key)] = $value; } } } } return $data; }
이 함수는 XML 파싱(parsing)을 수행하도록 간단하게 작성된 것이다. 대충 만들었지만, 트위터에서 발생하고 있는 RSS는 이 정도로 간단한 파싱으로도 문제 없이 데이터를 수집할 수 있다.
호출 부분은 다음과 같이 변경한다.
$messages = twitter_fetch_rss("twitter.com", "http://twitter.com/statuses/user_timeline/" . $username . ".rss");
사이드바에 트위터 위짓을 설치하려면 다음 코드를 추가할 필요가 있다.
< ? twitter_messages('자기트위터아이디', 5, true, true, '#', true, true, false); ? >
물론 li나 h2, p와 같은 태그는 sidebar.php의 문맥에 따라 적당한 태그를 사용하면 되고, twitter_messages()함수를 적절히 선택하면 된다. 자세한 설명은 플러그인 홈페이지를 참고한다. 복잡하다면, 다음과 같이 호출해도 된다.
< ? twitter_messages('자기트위터아이디'); ? >
트위터는 한 클라이언트에서 시간 당 100번 이상의 RSS 요청을 허용하지 않으므로 일시적으로 “HTTP/1.1 400 Bad Request” 에러 메시지가 표시될 수도 있다.
다음 압축 파일을 다운로드하여 워드프레스 디렉토리에 설치하면 된다.
twitter-for-wordpress-mod-ko
관련 글: FantasyAmplifier님의 “트위터 메시지만 간단히 보여주는, Twitter for WordPress”
댓글 한 개
이상욱
감사합니다. 덕분에 쉽게 해결이 되었습니다.