解決Windows Live Writer(WLW)發佈至WordPress亂碼的問題

Windows Live Writer(WLW)這套部落格的文章編寫軟體想必很多人都有在用,不過丫湯在以前剛開始用美國主機的時候,都沒有什麼問題,自從搬回台灣主機時就出問題了,發佈文章後會變成亂碼,一開始有找到問題所在,但一直沒去修改,都是在WLW編碼後再將原始碼貼去Wordpress後台發文,最近又換了新主機,因此想說來修改一下,順便也做個筆記如果你的問題跟我有一樣的問題的話,也參考一下吧。

就像上圖一樣,發文之後一些Html的代碼都被轉換掉了,這是因為主機sever上的LibXML的版本過新所造成的,但由於我們不可能要求主機商降LibXML的版本,應該說主機商也不可能會降,因此我們必需配合LibXML的版本來修改Wordpress的源碼,或許再等Wordpress下次更新或者WLW更新就會解決也說不定。

修改Wordpress源碼:

我們總共要修改以下三個檔案(以下修改法僅於wordpress 2.71版本測試OK):

/wp-admin/import/blogger.php

/wp-includes/rss.php

/wp-includes/class-IXR.php

首先打開blogger.php,找到function parse($xml)

也就是圖上這一段語法,大約是913行~935行

取代為以下語法:
function parse($xml) {

global $app_logging;
array_unshift($this->ns_contexts, array());

$parser = xml_parser_create_ns();
xml_set_object($parser, $this);
xml_set_element_handler($parser, "start_element", "end_element");
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);
xml_set_character_data_handler($parser, "cdata");
xml_set_default_handler($parser, "_default");
xml_set_start_namespace_decl_handler($parser, "start_ns");
xml_set_end_namespace_decl_handler($parser, "end_ns");

$contents = "";

//xmllib 2.7.0 -2.7.3 stripping leading angle brackets bug patch
$xml =str_replace("<","<",$xml );
$xml =str_replace(">",">",$xml );
$xml =str_replace("&","&",$xml );
//end Fix

xml_parse($parser, $xml);

xml_parser_free($parser);

return true;
}

接下來修改Rss.php,找到function MagpieRSS ($source) {

下圖這段語法,大約是49行~90行

取代為以下語法:
function MagpieRSS ($source) {

# if PHP xml isn't compiled in, die
#
if ( !function_exists('xml_parser_create') )
trigger_error( "Failed to load PHP's XML Extension. http://www.php.net/manual/en/ref.xml.php" );

$parser = @xml_parser_create();

if ( !is_resource($parser) )
trigger_error( "Failed to create an instance of PHP's XML parser. http://www.php.net/manual/en/ref.xml.php");

$this->parser = $parser;

# pass in parser, and a reference to this object
# setup handlers
#
xml_set_object( $this->parser, $this );
xml_set_element_handler($this->parser,
'feed_start_element', 'feed_end_element' );

xml_set_character_data_handler( $this->parser, 'feed_cdata' );

//xmllib 2.7.0 -2.7.3 stripping leading angle brackets bug patch
$source =str_replace("<","<",$source );
$source =str_replace(">",">",$source );
$source =str_replace("&","&",$source );
//end fix

$status = xml_parse( $this->parser, $source );

if (! $status ) {
$errorcode = xml_get_error_code( $this->parser );
if ( $errorcode != XML_ERROR_NONE ) {
$xml_error = xml_error_string( $errorcode );
$error_line = xml_get_current_line_number($this->parser);
$error_col = xml_get_current_column_number($this->parser);
$errormsg = "$xml_error at line $error_line, column $error_col";

$this->error( $errormsg );
}
}

xml_parser_free( $this->parser );

$this->normalize();
}

最後再打開class-IXR.php,找到function parse() {

也就是下圖這段語法,約159行~185行

取代為以下語法:
function parse() {
// first remove the XML declaration
$this->message = preg_replace('//', '', $this->message);
if (trim($this->message) == '') {
return false;
}
$this->_parser = xml_parser_create();
// Set XML parser to take the case of tags in to account
xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);
// Set XML parser callback functions
xml_set_object($this->_parser, $this);
xml_set_element_handler($this->_parser, 'tag_open', 'tag_close');
xml_set_character_data_handler($this->_parser, 'cdata');

//xmllib 2.7.0 -2.7.3 stripping leading angle brackets bug patch
$this->message =str_replace("<","<",$this->message);
$this->message =str_replace(">",">",$this->message);
$this->message =str_replace("&","&",$this->message);
//end fix

if (!xml_parse($this->_parser, $this->message)) {
/* die(sprintf('XML error: %s at line %d',
xml_error_string(xml_get_error_code($this->_parser)),
xml_get_current_line_number($this->_parser))); */
return false;
}
xml_parser_free($this->_parser);
// Grab the error messages, if any
if ($this->messageType == 'fault') {
$this->faultCode = $this->params[0]['faultCode'];
$this->faultString = $this->params[0]['faultString'];
}
return true;
}

修改完之後再將檔案上傳覆蓋原本的檔案就可以囉,如果你有更好的方法記得也跟丫湯說一下哦~如果在修改之後依然無法使用的話,可能是某個外掛造成的,建議您可以先將全部的外掛停用,再發文試試,沒有問題的話,再一個個開啟,看看到底是哪一個外掛讓你卡到陰囉~

你可能對這些內容也有興趣

阿湯 作者:阿湯

對電腦 & 網路資訊充滿興趣與熱情、瘋了似的每日堅持發文,「阿湯」這個名字是由湯姆克魯斯而來的,雖然我沒有他帥氣,也不會演電影,但我會寫文章....

更多關於的文章》

9 個留言

  1. Avatar 淺草表示:

    您好,我現在升級到3.3.1版本,
    不過找不到您說的/wp-admin/import/blogger.php這個檔案,
    我改了後面兩個之後也是無效的,
    想請問您知道這個檔案在3.0版本之後的去向嗎?
    謝謝您

     

    阿湯說:

     

    應該不用改也不會亂碼了才對

  2. Avatar 布袋港表示:

    後來我在 http://www.ludou.org/wordpress-post-id-continuous.html 找到我問題的答案了!
    謝謝啦~

    阿湯說:

    不客氣

  3. Avatar 布袋港表示:

    阿湯,請教您透過 WLW 編輯文章中的圖片都是怎麼處理的呢?
    我試過,若是在部落格設定中選擇「上載圖片至我的部落格」的話,
    那麼每一張上傳的圖片就會佔據一個發文 ID !
    不知您知道該如何避免嗎?謝謝~

  4. Avatar Idoin表示:

    用你的方法解决我同样的问题,谢谢了。在2.8.4下通过,怎么没有Trackback?

  5. Avatar Katrin表示:

    你好啊, 我是用vista & firefox的, 用WLW時PUBLISH BLOG, 同樣出不到繁體字,全部變了問號, 請問有方便幫幫我嗎???

    PS.我的BLOG是XANGA, NOT WORDPRESS.

    阿湯說:

    不好意思,XANGA我就不清楚了,可能你要問問有架設這套的人…

  6. Avatar 拆組達人表示:

    原來是這樣的緣故啊!
    不過我是遇到另一個問題@@
    就是WLW只能抓取最新的20篇文章
    導致我要改舊文章都要到後台來改
    超麻煩的說!

    阿湯說:

    這邊有丫正老師介紹的外掛也不錯

    http://wordpress.org/extend/plugins/libxml2-fix/

  7. Avatar xD~碳表示:

    既然沙發被坐了,
    拿張板凳來坐,
    WLW碳碳還不知道是什麼東西,
    總之,只能說ㄚ湯太強了

    阿湯說:

    寫文章的好東東~~

    你有用WP應該也要摸一下@@

  8. Avatar Ausir表示:

    這個我也寫過啦 ^_^ 但是程式碼貼錯
    不過多一個紀錄比較好
    CC

    沒幫我打廣告~ 我自己來
    WordPress 搬家後 WLW 發佈文章一堆亂碼錯誤

    阿湯說:

    哈~~昨天超累的

    寫完就整個躺了……什麼都忘記了 = =

  9. Avatar 天仙表示:

    沙發啦!

    阿湯說:

    床與沙發可兼得~~

發表留言 »

姓名(*)
信箱(*)