本文描述的狀況僅適用以下條件者: 1.使用big5編碼裝Gallery者 2.使用WP Gallery RSS Plugin者.
前陣子裝上了Gallery RSS Plugin想把早就存在的Gallery整合到WP上, 但是發現了幾個讓我很煩的問題. 首先是Gallery吐出來的RSS會吃掉Big5的中文字, 這又得回溯回Gallery為何使用Big5 Encoding的問題, 第二個是Gallery RSS就算吃下UTF-8 Well format的Gallery RSS, 還是會把中文吃掉; 另外一個小問題是我常用Gallery存一些Blog用的雜圖, 這些雜圖因為更新的頻繁所以老是被排到前頭去.
所以追本溯源想要做個Dirty Hack, 首先先看Gallery中的rss.php. 問題果然出在惡名昭彰的preg_replace上, 先改成下面這樣
< ?php function removeUnprintable($string) { return ereg_replace("/[^[:print:]]/", "", $string); } ?>
簡單說就是把 preg_ replace 換成 ereg_ replace, 這樣就可以輸出Big5的內容了. 但是問題還沒完, 餵Big5的RSS給Gallery RSS Plugin還是會被瞎轉一通然後變成????, 所以最好還是把RSS的Encoding都換成UTF-8, 相對的中文字也要過轉換.
< ?php function removeUnprintable($string) { $string = iconv("BIG5", "UTF-8", $string); return ereg_replace("/[^[:print:]]/", "", $string); } ?>
變成這樣之後, 還要把下面吐XML Header的部分, 改成UTF-8
< ?php if ($gallery->locale == 0) { // $gallery->locale = 'ISO-8859-1'; $gallery->locale = 'UTF-8'; } ?>
這樣一來Gallery部分就可以吐出正常且正確的RSS Feeds了. 接著砍掉cache_ gallery_ rss中的cache在Reload, 發現中文字是出來了, 但是變成????. 這點要從Gallery RSS Plugin所用的Magipe RSS Engine上動手腳, 在rss_ parse.inc 中有個 strtoupper把$in_enc破壞掉, 造成轉碼錯誤, 這個只要comment起來就好.
< ?php function php4_create_parser($source, $in_enc, $detect) { if ( !$detect ) { return array(xml_parser_create($in_enc),$source); } if (!$in_enc) { if ( preg_match('/< ?xml.*encoding=[\'"](.*?)[\'"].*?>/m8217, $source, $m)) { //$in_enc = strtoupper($m[1]); $this->source_encoding = $in_enc; } else { $in_enc = 8216UTF-88242; } } ?>
接著砍掉cache_ gallery_ rss, 然後Reload WP首頁, 完全正確的Encoding就出來摟.
接下來要克服暫存Album被丟上Gallery RSS Plugin的問題. 直接改 ~/wp-content/plugin/gallery_rss.php 就可以, 先在Global Scope加入
< ?php $gallery_exclude_url = array( "https://blog.nekobe.tw/gallery/temp" ); ?>
然後在gallery_rss這個function的最前面global宣告部分加入
< ?php global $magpie_install_dir, $gallery_rss_url, $cache_timeout, $gallery_rss_cache_dir, $gallery_exclude_url; ?>
然後在下面for迴圈的最前面加入
< ?php foreach ($gallery_exclude_url as $exclude) { if ($item['link'] == $exclude) { continue 2; } } ?>
就大功告成啦!
因為實在是Dirty hack, 所以也不commit回去給作者了, 希望對大家有幫助摟~~