태터툴즈 고쳐쓰기 #10 - 최근 리퍼러 보여주기

예전에는 태터의 리퍼러를 수시로 확인하곤 했는데 요즘은 한달에 한번이나 들여다볼까.. 데이터는 자꾸 쌓이는데 쓰이지 못하는게 안타까워 메인 화면으로 빼봤다. 추가하는 과정은 예전에 썼던 방명록 최근글 보여주기와 99% 비슷함.

1. inc_presswork.php 파일에 아래의 함수를 추가
function get_referer_rep() {
    global $db, $dbid;
    unset($p);

    $p_rct_refer_cnt = 10;     // 몇개까지 표시할지 결정
    $p_rct_refer_trunc = 24;   // 길이를 몇바이트에서 자를지 결정

    $sql = "select distinct host, refer from t3_".$dbid."_referlog order by regdate desc limit 0, $p_rct_refer_cnt";
    // print $sql;
    $result = @mysql_query($sql);
    while(list($host, $referer) = @mysql_fetch_array($result)) {
        $p_rep = $GLOBALS["skin"]->s_referer_rep;
        $p_rep = str_replace("[##_referer_rep_link_##]", $referer, $p_rep);
        $p_rep = str_replace("[##_referer_rep_favicon_##]", "http://$host/favicon.ico", $p_rep);
        $p_rep = str_replace("[##_referer_rep_url_##]", str_cut(urldecode(substr($referer,7)), $p_rct_refer_trunc, 1), $p_rep);
        $p .= $p_rep;
    }
    return $p;
}

2. inc_function.php 파일 120번째줄에 아래의 코드를 삽입한다. (정확한 위치를 모르면 비슷하게 생긴 코드들 사이에 추가하면 됨)
list($sval, $this->s_referer_rep) = cut_skintag($sval, "s_referer_rep");

3. index.php 파일 512번째줄 근처로 가서 아래의 코드를 삽입한다 (역시 비슷하게 생긴놈들 사이에 끼워넣기)
if (strpos($d1, "[##_s_referer_rep_##]")) $d1 = str_replace("[##_s_referer_rep_##]", get_referer_rep(), $d1);

4. 마지막으로 스킨파일을 수정한다. 096_quan 스킨을 예로 들면 이렇게 수정한다
<div class="h3"><img src="./images/left.gif" align="absmiddle"> 최근에 방문한 경로</div>
<div style="padding:0 0 0 20"><s_referer_rep><a href="[##_referer_rep_link_##]" target="_blank" style="line-height:13pt">[##_referer_rep_url_##]</a><br></s_referer_rep></div>

이렇게 하면 일단 기본 작업은 끝이고 이곳 처럼 URL 앞에 favicon을 표시하려면 [##_referer_rep_favicon_##] 치환자를 사용하면 된다. 예를들면 이런식으로..
<img src="[##_referer_rep_favicon_##]" width="16" height="16" onerror="this.onerror=null;this.src='./images/favicon.ico'">
favicon 가져올때의 문제점은 예를들어 URL이 http://search.daum.net 으로 시작하는 경우에는 http://search.daum.net/favicon.ico 를 찾기때문에 favicon을 가져오지 못한다. 이럴땐 http://daum.net/favicon.ico 를 가져오도록 만든다던가 하는 방법이 있지만 가장 단순하고 무식한 방법은 아래처럼 일일히 값을 조사해서 해당 favicon으로 연결해주는 방법이다. (일단 구글, 다음, 네이버만 적용..)
function get_referer_rep() {
    global $db, $dbid;
    unset($p);

    $p_rct_refer_cnt = 10;     // 몇개까지 표시할지 결정
    $p_rct_refer_trunc = 24;   // 길이를 몇바이트에서 자를지 결정

    $sql = "select distinct host, refer from t3_".$dbid."_referlog order by regdate desc limit 0, $p_rct_refer_cnt";
    // print $sql;
    $result = @mysql_query($sql);
    while(list($host, $referer) = @mysql_fetch_array($result)) {
        $p_rep = $GLOBALS["skin"]->s_referer_rep;
        $p_rep = str_replace("[##_referer_rep_link_##]", $referer, $p_rep);
        if( eregi("^(www.)?google.", $host) )
            $p_rep = str_replace("[##_referer_rep_favicon_##]", "http://www.google.com/favicon.ico", $p_rep);
        else if( eregi("daum.net$", $host) )
            $p_rep = str_replace("[##_referer_rep_favicon_##]", "http://www.daum.net/favicon.ico", $p_rep);
        else if( eregi("naver.com$", $host) )
            $p_rep = str_replace("[##_referer_rep_favicon_##]", "http://www.naver.com/favicon.ico", $p_rep);
        else
            $p_rep = str_replace("[##_referer_rep_favicon_##]", "http://$host/favicon.ico", $p_rep);
        $p_rep = str_replace("[##_referer_rep_url_##]", str_cut(urldecode(substr($referer,7)), $p_rct_refer_trunc, 1), $p_rep);
        $p .= $p_rep;
    }
    return $p;
}

이로서 실시간 리퍼러 스토킹도 시작됐으니 많이많이 찾아주세요;;
태그 :