EUC-KR 트랙백 Plugin

아직도 네이버 같은 블로그는 트랙백 encoding으로 euc-kr을 쓰고 있습니다. 몇번을 건의했었지만, 네이버측에서는 아직까지 고쳐지지 않고 있네요. encoding이 어려운 일인지는 모르겠지만, 최근 대문을 바꾼 네이버를 보면서, 그러한 세부기술에서의 발전은 없고, 그냥 대문디자인에서만 css를 좀 더 잘 이용한 수준밖에는 안보이는군요. 그래서 조금 실망스럽습니다.

아무튼 그래도 몇몇분의 좋은 블로거중에 네이버 블로그를 쓰시는 분들이 있습니다. 이런 분들과 트랙백 통신을 하려면, 네이버의 수정이 절대적으로 필요했었지만, 우연히도 오늘 euc-kr로 트랙백을 보낼 수 있는 plugin을 발견했습니다.

082NET님의 EUC-KR 트랙백 Plugin인데요, 참 반가운 Plugin이네요. 사실 이런 플러그인이 필요가 없음에도 불구하고, 네이버의 게으름인지 기술부족인지를 오히려 WordPress가 극복하게 하는군요. 참 아이러니하지 않을 수 없습니다.

자세한 것은 위의 링크를 통해 보시면 되구요, 설명에 의하면, euc-kr로 통신하는 블로그는 euc-kr로 하고, utf-8으로 통신하는 블로그는 utf-8으로 통신하는 것 같습니다. 만일 문제가 발생되는 블로그는 트랙백 주소 앞에 !를 붙여주면 된다고 하네요. 참 편리한 플러그인듯 싶습니다. 082NET님께 감사합니다. 🙂

워드프레스 플러그인: Keyword Link Plugin (V0.6) 수정

키워드에 따라 자동으로 하이퍼링크를 만들어 주는 플러그인을 찾다가 마침내, Keyword Link Plugin 1 2 를 발견했습니다.

이것은 제가 그동안 찾고 싶었던 플러그인인데요, 제가 촛점으로 맞춘 기능은 다음과 같습니다.

  • 키워드를 넣고 거기에 따른 하이퍼링크를 자동으로 추가할 것
  • UTF-8을 지원할 것
  • 새창으로 열기 옵션이 있을 것

다 좋았는데, utf-8을 완벽하게 지원하지 안는 것 같았습니다. 그래서 몇가지 수정을 했구요, 또 “EDIT” 버튼을 눌렀을 때, 제대로 옵션을 표현하지 못하는 버그도 있고 해서 수정했습니다. 이 글은 제가 수정한 것을, 첫째는 저를 위한 노트가 될 듯 싶구요, 둘째는 이 수정을 다른 분들과 공유하고자 하여 글을 올립니다.

1. 버그: 옵션을 저장할때 제대로 기록하지 않는다.

Export/Import CSV를 이용하면, 이 문제가 사라지지만, 폼을 이용하여 수정하고 추가할때는 발생하는 문제입니다. 옵션을 선택하고 이것을 저장할때, 워드프레스의 option 테이블에 잘못된 정보를 기록하는 것이 문제였습니다. 문제를 보면, 예를 들어 플러그인 세팅 페이지에서 다음과 같이 입력하면,

Wordpress keyword link plugin option selection

정보가 사실은 “0|0|1|1|0” 와 같이 되어야 하지만, 실제 저장이 “||new window|ignore case|” 이와 같이 됩니다. 그래서 다시 EDIT 버튼을 누르면, 다음과 같이 나옵니다.

bug picture when edit button is clicked.

이 문제를 해결하기 위해 bm_getvalue() 함수를 추가했구요, bm_keywordlink_savenew() 함수를 다음과 같이 수정했습니다.

function bm_getvalue($var) {
     if ($var) {
	  return "1";
     } else {
	  return "0";
     }
}

function bm_keywordlink_savenew()
{
      $links = get_option(BM_KEYWORDLINK_OPTION);

		$keyword = $_POST['keyword'];
		$link = $_POST['link'];
		$nofollow = bm_getvalue($_POST['nofollow']);
 		$firstonly = bm_getvalue($_POST['firstonly']);
 		$newwindow = bm_getvalue($_POST['newwindow']);
 		$ignorecase = bm_getvalue($_POST['ignorecase']);
 		$isaffiliate = bm_getvalue($_POST['isaffiliate']); 

		if ($keyword == '' || $link == '')
		{
		  bm_keywordlink_topbarmessage(__('Please enter both a keyword and URL'));
		  return;
		}

		if (isset($links[$keyword]))
		{
		  bm_keywordlink_topbarmessage(__('Existing keyword has been updated'));
		}

 		/* Store the link */
	  $links[$keyword] = implode('|',array($link,$nofollow,$firstonly,$newwindow,$ignorecase,$isaffiliate));
	  update_option(BM_KEYWORDLINK_OPTION,$links);
}

이 이후에는 동작을 잘 했습니다.

2. UTF-8 지원문제

2-1. readme.txt에 있는 가이드라인을 따라하기

readme.txt에 보면, 아시아 언어를 쓰기 원한다면, bm_keywordlink.php에 있는 $regEx 변수값을 수정해야 한다고 되어 있습니다. 관련된 함수는 bm_keywordlink_replace() 인데요, 거의 마지막 부분에 다음을

$regEx = ''(?!((<.*?)|(<>]*?)>)|([^>]*?))'s' . $case;

다음으로 수정해 줍니다.

$regEx = ''(?!((<.*?)|(<>]*?)>)|([^>]*?))'s' . $case;

2-2. UTF-8을 지원하기 위한 decode64 추가

이미 javascript로 decode64() 함수가 이 플러그인에 있지만, 아시아 언어와는 동작을 제대로 하지 않는 것 같습니다. 그래서, 아시아언어를 같이 지원하기 위해 다른 javascript code를 WebToolKit site에서 가져왔습니다. 다음은 그 부분입니다.

/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/

var Base64 = {

    // private property
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

    // public method for encoding
    encode : function (input) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;

        input = Base64._utf8_encode(input);

        while (i < input.length) {

            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 =[1] {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

        }

        return output;
    },

    // public method for decoding
    decode : function (input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;

        input = input.replace(/[^A-Za-z0-9+/=]/g, "");

        while (i < input.length) {

            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 =[2] {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) |[3];
                i += 3;
            }

        }

        return string;
    }

}
&#91;/sourcecode&#93;</pre>
또한, BMEditKeyword() 함수를 다음과 같이 수정합니다.
<pre>
function BMEditKeyword(keyword,url,nofollow,firstonly,newwindow,ignorecase,isaffiliate)
		{
 			 document.bm_keywordadd.keyword.value      = Base64.decode(keyword);
			 document.bm_keywordadd.link.value         = Base64.decode(url);
			 document.bm_keywordadd.nofollow.checked   = (nofollow==1);
			 document.bm_keywordadd.firstonly.checked  = (firstonly==1);
			 document.bm_keywordadd.newwindow.checked  = (newwindow==1);
			 document.bm_keywordadd.ignorecase.checked = (ignorecase==1);
			 document.bm_keywordadd.isaffiliate.checked= (isaffiliate==1);
			 window.location.hash = "keywordeditor";
		}

2.1 와 2.2 는 utf-8을 지원하기 위해 반드시 필요한 작업이었습니다. 이 이후에 “EDIT” 버튼을 누르면, 기존에는 아시아문자 (예:한국어)를 가져오지 못했지만, 이제는 폼으로 잘 가져오게 되네요.

이제 키워드를 등록하고 자동으로 하이퍼링크를 만들어주는 플러그인을 즐기시면 됩니다. 🙂

  1. Plugin Homepage: WordPress Keyword Link Plugin
  2. WordPress Plugin Page: BlogMechanics KeywordLink
  1. chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2 []
  2. enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } output = Base64._utf8_decode(output); return output; }, // private method for UTF-8 encoding _utf8_encode : function (string) { string = string.replace(/rn/g,"n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if((c > 127) && (c < 2048 []
  3. c2 & 63) << 6) | (c3 & 63 []

WordPress Plugin: Keyword Link Plugin Modification (V0.6)

I have been researching to find keyword link plugin which is able to add a hyperlink automatically for a specific keyword, and finally, found that Keyword Link Plugin[1][2]

This is great plugin what I have been looking for. The features I have focused when I search the plugin are

  • Putting a keyword which will be added with hyperlink automatically.
  • Supporing UTF-8 encoding/decoding.
  • Opening target with _blank (new window).

However, it does not seem to fully support UTF-8. In order to make it work correctly, I had to modify the plugin. Also, I found there is a bug in current 0.6 version when “EDIT” is clicked. So, here I note for myself to modify the plugin and want to share this with others.

1. Bug: It does not record option correctly when it stores information.

This is not a problem when import/export CSV is being used. This happens when adding/modifying in the form in the plugin setting page is being used. When it stores keyword with options, it writes them incorrect format in wordpress option table. For example, if you put like this in the plugin setting page,

Wordpress keyword link plugin option selection

then, the stored information for option is supposed to be “0|0|1|1|0”, but it stores like “||new window|ignore case|”, so when I click the “EDIT” button, it shows like this way always

bug picture when edit button is clicked.

So, I have added following function of bm_getvalue() and modify bm_keywordlink_savenew() function like this:

function bm_getvalue($var) {
     if ($var) {
	  return "1";
     } else {
	  return "0";
     }
}
 
function bm_keywordlink_savenew()
{
      $links = get_option(BM_KEYWORDLINK_OPTION);
 
		$keyword = $_POST['keyword'];
		$link = $_POST['link'];
		$nofollow = bm_getvalue($_POST['nofollow']);
 		$firstonly = bm_getvalue($_POST['firstonly']);
 		$newwindow = bm_getvalue($_POST['newwindow']);
 		$ignorecase = bm_getvalue($_POST['ignorecase']);
 		$isaffiliate = bm_getvalue($_POST['isaffiliate']); 
 
		if ($keyword == '' || $link == '')
		{
		  bm_keywordlink_topbarmessage(__('Please enter both a keyword and URL'));
		  return;     		  
		}
 
		if (isset($links[$keyword]))
		{
		  bm_keywordlink_topbarmessage(__('Existing keyword has been updated'));
		}
 
 		/* Store the link */ 
	  $links[$keyword] = implode('|',array($link,$nofollow,$firstonly,$newwindow,$ignorecase,$isaffiliate));
	  update_option(BM_KEYWORDLINK_OPTION,$links);      
}

After this, it works.

2. Support UTF-8

2-1. Following readme.txt suggestion in the plugin

In readme.txt, it mentioned that if you want it to recognize Asian language, it requires modify $regEx variable in bm_keywordlink.php. Actually, it is needed to modify it. The part of function in the file is bm_keywordlink_replace(), and go to the end of the line, you can find where is needed to modify. You need to modify from

$regEx = '\'(?!((<.*?)|(<a.*?)))(\b'. $cleankeyword . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'s' . $case;

to

$regEx = '\'(?!((<.*?)|(<a.*?)))('. $cleankeyword . ')(?!(([^<>]*?)>)|([^>]*?</a>))\'s' . $case;

as readme.txt suggestion.

2-2. Adding decode64 for UTF-8 support

It already provides decode64() javascript function there, but it does not seems to work with Asian language. In order to work with utf-8 correctly, I brought the decode javascript code from WebToolKit site. Here is the part of it

/**
/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/
 
var Base64 = {
 
    // private property
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
 
    // public method for encoding
    encode : function (input) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;
 
        input = Base64._utf8_encode(input);
 
        while (i < input.length) {
 
            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);
 
            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;
 
            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }
 
            output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
 
        }
 
        return output;
    },
 
    // public method for decoding
    decode : function (input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;
 
        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
 
        while (i < input.length) {
 
            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));
 
            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;
 
            output = output + String.fromCharCode(chr1);
 
            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }
 
        }
 
        output = Base64._utf8_decode(output);
 
        return output;
 
    },
 
    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";
 
        for (var n = 0; n < string.length; n++) {
 
            var c = string.charCodeAt(n);
 
            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
 
        }
 
        return utftext;
    },
 
    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;
 
        while ( i < utftext.length ) {
 
            c = utftext.charCodeAt(i);
 
            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }
 
        }
 
        return string;
    }
 
}

And, modify function of BMEditKeyword() like following:

		function BMEditKeyword(keyword,url,nofollow,firstonly,newwindow,ignorecase,isaffiliate)
		{
 			 document.bm_keywordadd.keyword.value      = Base64.decode(keyword);
			 document.bm_keywordadd.link.value         = Base64.decode(url);
			 document.bm_keywordadd.nofollow.checked   = (nofollow==1);
			 document.bm_keywordadd.firstonly.checked  = (firstonly==1);
			 document.bm_keywordadd.newwindow.checked  = (newwindow==1);
			 document.bm_keywordadd.ignorecase.checked = (ignorecase==1);
			 document.bm_keywordadd.isaffiliate.checked= (isaffiliate==1);
			 window.location.hash = "keywordeditor"; 
		}

2.1 and 2.2 are needed to support utf-8 fully. After this, when you click “EDIT” button, it will bring Asian Character correctly in the form.

I hope the author to add above, but until then, I am satisfied with it.

  1. Plugin Homepage: WordPress Keyword Link Plugin []
  2. WordPress Plugin Page: BlogMechanics KeywordLink []

WordPress Plugin: Custom Field Template

Custom Field Template: http://wordpress.org/extend/plugins/custom-field-template/

WordPress 의 Custom Field Template을 소개합니다.

WordPress에서 Posting을 할때 Custom Field라는 것이 있습니다. 이 Custom Field를 잘 활용하면, theme에서 이 Post에 해당하는 특별한 기능을 수행 할 수 있습니다.

Worpress의 Custom Field에 대해서 알아 보시려면, Using Custom Fields 혹은 Working with Multiple Themes Outside of the WordPress Installation Directory 에서 잘 표현되어 있으니 참고하시기 바랍ㄴ다.

이 Custom Field에는 항상 key값과 value를 넣어주게 되어 있는데, 늘 기억하기도 그렇고, 혹은 실수로 잘못 입력할 수도 있습니다. 이 plugin은 이런 것을 미연에 방지하고자 custom field 의 template을 만들어 두고 편리하게 쓸 수 있게 합니다. 원래는 Custom Field GUI 에서 온 것인데, 이 기능을 저자인 Hiroaki가 확장하여 만들었습니다.

실제 써 보니, 무척 편리하네요. 🙂

TinyMCE Advanced: WordPress Plugin

WordPress의 Plugin중의 하나인 TinyMCE Advanced를 소개합니다. 원래 WordPress는 WYSIWYG Tool을 쓰고 있는데, 이것은 그것을 더 확장하여 Horizontal Line, Anchor, Font Size, Font Style등에 대한 기능을 더 추가할 수 있도록 하는 기능을 가지고 있습니다. 기존의 WordPress TinyMCE의 Tool에서도 더 많은 Option을 제공하여 더 많은 일을 수행할 수 있네요.

Plugin Website는 WordPress Plugin의 Web Site에 있습니다.

다음은 Plugin Web Site에서 가져온 Screenshot 입니다.

TinyMCE Screenshot