Bug Ketika Menggunakan WP 2.7.1 dan Windows Live Writer
Image via Wikipedia
Setiap posting artikel akhir-akhir ini saya selalu kebingungan.. Tampilan artikel di blog kacau balau! Tapi setelah saya perhatikan, semua tanda “<” & “>” yang notabene sering sekali digunakan di HTML hilang semua! Wah pantas aja tampilannya jadi ajaib begini.
Usut punya usut dan browsing + googling, akhirnya ketemu masalahnya. Ada 3 hal yang jadi penyebabya:
- Anda menggunakan WordPress 2.7.1 (seingat saya ketika masih versi 2.7 tidak ada masalah).
- Anda menulis dengan Windows Live Writer (WLW) yang ketika publish article memanfaatkan XML-RPC.
- Libxml yang digunakan PHP pada sever anda adalah versi 2.7.x
Secara sederhana, permasalahan utama terletak pada bug di libxml yang digunakan oleh PHP (bahasa pemrograman yang digunakan WordPress). WLW memanfaatkan library libxml ketika mengupload artikel. Jika ada bug pada libxml, maka secara otomatis artikel yang di upload pasti jadinya salah. Saat ini diketahui bahwa libxml versi 2.7.0 hingga 2.7.3 bermasalah.
Bagaimana untuk tahu versi libxml pada server? Buat sebuah file dan berinama info.php dan isikan kode berikut:
<?php phpinfo(); ?>
Simpan file, & upload ke root directory lalu jalankan file tersebut di browser. Misalkan: www.namadomain.com/info.php
Seluruh tampilan konfigurasi PHP akan muncul pada layar. Pencet Ctrl + F untuk melakukan pencarian dan ketik “libxml” & pencet next beberapa kali jika terdapat beberapa kata libxml. Yang anda cari tampilannya akan seperti ini:

Dari tampilan di atas terlihat bahwa PHP di server saya menggunakan versi 2.7.3.
Point no. 3 ini sedikit merepotkan, apalagi jika anda menggunakan shared hosting dimana anda tidak mungkin mengubah-ubah konfigurasi server. Lalu bagaimana solusinya?
Solusi pertama: upgrade versi libxml di server ke versi yang lebih baru (namun tidak ada kepastian bahwa bug ini sudah diperbaikin) atau downgrade ke versi 2.6.32. Opsi ini tentu tidak dapat dilakukan jika anda tidak memiliki server blog anda sendiri.
Solusi kedua: jangan gunakan WLW, atau program blogging lain yang memanfaatkan libxml. Hmm.. ini sedikit repot buat saya, karena saya kadung jatuh cinta sama WLW
Solusi ketiga: patch WordPress anda! Perlu diingat bahwa ini bukan patch resmi dari WP. Ada 3 file yang perlu di patch:
- blogger.php (direktori wpadmin/import)
- class-IXR.php, dan
- rss.php (keduanya di direktori wp-includes)
Pada dasarnya patch ini adalah untuk memanipulasi string “<>&” sebelum fungsi xml_parse dipanggil:
1: //xmllib 2.7.0 -2.7.2 stripping leading angle brackets bug patch2: if(LIBXML_DOTTED_VERSION == '2.7.0' ||3: LIBXML_DOTTED_VERSION == '2.7.1' ||4: LIBXML_DOTTED_VERSION == '2.7.2' ||5: LIBXML_DOTTED_VERSION == '2.7.3'6: ){7: $xml =str_replace("<","<",$xml );8: $xml =str_replace(">",">",$xml );9: $xml =str_replace("&","&",$xml );10: }11: //end Fix12: xml_parse($parser, $xml);
Patch untuk blogger.php
Update fungsi parse menjadi:
1: function parse($xml) {2:3: global $app_logging;4: array_unshift($this->ns_contexts, array());5:6: $parser = xml_parser_create_ns();7: xml_set_object($parser, $this);8: xml_set_element_handler($parser, "start_element", "end_element");9: xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);10: xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);11: xml_set_character_data_handler($parser, "cdata");12: xml_set_default_handler($parser, "_default");13: xml_set_start_namespace_decl_handler($parser, "start_ns");14: xml_set_end_namespace_decl_handler($parser, "end_ns");15:16: $contents = "";17:18: //xmllib 2.7.0 -2.7.2 stripping leading angle brackets bug patch19: if(LIBXML_DOTTED_VERSION == '2.7.0' ||20: LIBXML_DOTTED_VERSION == '2.7.1' ||21: LIBXML_DOTTED_VERSION == '2.7.2' ||22: LIBXML_DOTTED_VERSION == '2.7.3'23: ){24: $xml =str_replace("<","<",$xml );25: $xml =str_replace(">",">",$xml );26: $xml =str_replace("&","&",$xml );27: }28: //end Fix29: xml_parse($parser, $xml);30:31: xml_parser_free($parser);32:33: return true;34: }
Patch untuk class-IXR.php
Update fungsi yang sama, namun kodenya sedikit berbeda:
1: function parse() {2: // first remove the XML declaration3: $this->message = preg_replace('/<\?xml(.*)?\?'.'>/', '', $this->message);4: if (trim($this->message) == '') {5: return false;6: }7: $this->_parser = xml_parser_create();8: // Set XML parser to take the case of tags in to account9: xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);10: // Set XML parser callback functions11: xml_set_object($this->_parser, $this);12: xml_set_element_handler($this->_parser, 'tag_open', 'tag_close');13: xml_set_character_data_handler($this->_parser, 'cdata');14:15: //xmllib 2.7.0 -2.7.2 stripping leading angle brackets bug patch16: if(LIBXML_DOTTED_VERSION == '2.7.0' ||17: LIBXML_DOTTED_VERSION == '2.7.1' ||18: LIBXML_DOTTED_VERSION == '2.7.2' ||19: LIBXML_DOTTED_VERSION == '2.7.3'20: ){21: $this->message =str_replace("<","<",$this->message );22: $this->message =str_replace(">",">",$this->message );23: $this->message =str_replace("&","&",$this->message );24: }25:26: if (!xml_parse($this->_parser, $this->message)) {27: /* die(sprintf('XML error: %s at line %d',28: xml_error_string(xml_get_error_code($this->_parser)),29: xml_get_current_line_number($this->_parser))); */30: return false;31: }32: xml_parser_free($this->_parser);33: // Grab the error messages, if any34: if ($this->messageType == 'fault') {35: $this->faultCode = $this->params[0]['faultCode'];36: $this->faultString = $this->params[0]['faultString'];37: }38: return true;39: }
Patch untuk rss.php
Update fungsi MagpieRSS:
1: function MagpieRSS ($source) {2:3: # if PHP xml isn't compiled in, die4: #5: if ( !function_exists('xml_parser_create') )6: trigger_error( "Failed to load PHP's XML Extension. http://www.php.net/manual/en/ref.xml.php" );7:8: $parser = @xml_parser_create();9:10: if ( !is_resource($parser) )11: trigger_error( "Failed to create an instance of PHP's XML parser. http://www.php.net/manual/en/ref.xml.php");12:13:14: $this->parser = $parser;15:16: # pass in parser, and a reference to this object17: # setup handlers18: #19: xml_set_object( $this->parser, $this );20: xml_set_element_handler($this->parser,21: 'feed_start_element', 'feed_end_element' );22:23: xml_set_character_data_handler( $this->parser, 'feed_cdata' );24:25: //xmllib 2.7.0 -2.7.2 stripping leading angle brackets bug patch26: if(LIBXML_DOTTED_VERSION == '2.7.0' ||27: LIBXML_DOTTED_VERSION == '2.7.1' ||28: LIBXML_DOTTED_VERSION == '2.7.2' ||29: LIBXML_DOTTED_VERSION == '2.7.3'30: ){31: $source =str_replace("<","<",$source );32: $source =str_replace(">",">",$source );33: $source =str_replace("&","&",$source );34: }35:36: $status = xml_parse( $this->parser, $source );37:38: if (! $status ) {39: $errorcode = xml_get_error_code( $this->parser );40: if ( $errorcode != XML_ERROR_NONE ) {41: $xml_error = xml_error_string( $errorcode );42: $error_line = xml_get_current_line_number($this->parser);43: $error_col = xml_get_current_column_number($this->parser);44: $errormsg = "$xml_error at line $error_line, column $error_col";45:46: $this->error( $errormsg );47: }48: }49:50: xml_parser_free( $this->parser );51:52: $this->normalize();53: }
Untuk memudahkan, saya memberikan ketiga file tersebut yang telah dimodifikasi dalam bentuk zip. Cukup diekstrak & di upload dengan FTP ke root directory blog anda.
Download WordPress libxml patch: wp_libxml_pacth.zip (23.45 KB).
Referensi:
- http://josephscott.org/archives/2008/12/problems-with-libxml2-for-wordpress-xml-rpc-users/
- http://josephscott.org/archives/2009/02/update-on-libxml2-issues/
- http://blog.hoofoo.net/2009/01/14/wordpress-patch-for-problamatic-libxml2-version/

saya pakai 2.7.1
tidak memakai windowns live writer
dan kelihatannya serem download gak resmi nya…
hehehe…
Yang paling utama versi libxml nya Mas Dawie…
Tapi kalau gak pake WLW (atau tool blogging sejenisnya) gak ngaruh kok bug libxml ini.
Omong2 patch yang bisa didownload ini bikinan saya sendiri. Kalau gak yakin isinya, silahkan buka pake notepad..
Saya juga pernah mengalami masalah yang sama dengan scribe fire, namun versi WP saya masih 2.7.0
Akhirnya scribefire nya ndak pernah saya pakai lagi.
Mungkin di cek dulu mas heri versi libxml di servernya.. Mas Heri kan jagoan *nix.. gampanglah
wah…, fersi baru kok malah bermasalah ya?????
Iya, saya juga heran… udah gitu bermasalahnya sama versi libxml yang baru, yang lama malah lancar… aneh…
waduh…ngak ada solusi lain selain nubah core wp. bahaya euy. sy nyari di codex.wordpress.org dulu….emang sih selain ngancurin snippet kita, parser baru ini juga bikin blogger yg make SVG nangis darah
siiip! sukses (akhirnya ngubah core wp pake cara lu). gw juga non aktifin plugin lama (“Preserve Code Formatting”) yg gw pake sebelum upgrade dari 2.6.1 ke 2.7.1 (hmm berapa versi minor tuh diloncatin)
plugin ini kayaknya bentrok dgn parser wp. Apalagi plugin ini belum diupdate sama auhornya…..tp gw ngak yakin juga. cuma pake quick and dirty gaya lu aja heheheh. danke.
btw, bir nya dikirim kemana nih ? hehhehe
Selamat ya udah sukses upgrade ke 2.7.1, senang bisa membantu..
Gak perlu kirim bir kok.. sering2 mampir aja!
[...] XmlRpc server. “Waduh Live Writer kenapa lagi nih?”, kata saya dalam hati. Saya jadi teringat masalah sebelumnya yang harus dituntaskan dengan memodifikasi sebuah file PHP di [...]