WordPress 輸出 Extended RSS (Export) 時的問題

WordPress 有自己的輸出格式可以當作備份檔使用,但輸出的檔案並不是正確的 XML,要做很多處理。

  • 首先他並不保證是 UTF-8 valid,所以要強制轉成 UTF-8 valid。在 PHP 裡可以用 $str = iconv('UTF-8', 'UTF-8', $str); 處理。除此之外,還要把某些特殊字元處理掉:$str = preg_replace('/[\x00-\x08\x0b\x0d-\x1f]/', '', $str);
  • 使用了 <excerpt:encoded> 但卻沒有在開頭定義 xmlns:excerpt。如果需要用到 excerpt:encoded 可以硬轉成 content:excerpt 處理;如果不需要,可以直接拿掉:$str = preg_replace('/<excerpt:encoded>.*?<\/excerpt:encoded>/', '', $str);。
  • wp:meta_value 沒有 encode 過,所以像 & 這類的字元會因為沒有 encode 而造成 XML library 抱怨,如果沒有使用到這些欄位,可以照上面的方法拿掉。如果有用到的話可以拿 htmlspecialchars() 處理後加回去。

把這三件事情處理完後似乎可以解決 WordPress 輸出的 Extended RSS 不合法的問題,用 PHP DOM 也不會跳錯誤訊息了。

其中第三個很明顯是 bug,晚點確認是 WordPress 問題並生出 patch 後得去開 ticket 修正。第二個也很嚴重,但是這個問題已經有人提出來,一直沒解:「WordPress Import Fix for Post Excerpts」,得去 ticket system 上檢查是不是有被提出來討論過。

Leave a Reply

Your email address will not be published. Required fields are marked *