Programming

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

    < ? 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”

    댓글 한 개

    답글 남기기