Bug Ketika Menggunakan WP 2.7.1 dan Windows Live Writer

Blogging, Freeware on February 27th, 2009 10 Comments
20px|Windows Live Logo 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:

  1. Anda menggunakan WordPress 2.7.1 (seingat saya ketika masih versi 2.7 tidak ada masalah).
  2. Anda menulis dengan Windows Live Writer (WLW) yang ketika publish article memanfaatkan XML-RPC.
  3. 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:

tmp74A9

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 :-D

Solusi ketiga: patch WordPress anda! Perlu diingat bahwa ini bukan patch resmi dari WP. Ada 3 file yang perlu di patch:

  1. blogger.php (direktori wpadmin/import)
  2. class-IXR.php, dan
  3. 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 patch
  2: 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("&lt;","&#60;",$xml );
  8: $xml =str_replace("&gt;","&#62;",$xml );
  9: $xml =str_replace("&amp;","&#38;",$xml );
 10: }
 11: //end Fix
 12: 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 patch
 19:   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("&lt;","&#60;",$xml );
 25:   $xml =str_replace("&gt;","&#62;",$xml );
 26:   $xml =str_replace("&amp;","&#38;",$xml );
 27:   }
 28:   //end Fix
 29:   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 declaration
  3:     $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 account
  9:     xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);
 10:     // Set XML parser callback functions
 11:     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 patch
 16:     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("&lt;","&#60;",$this->message );
 22:     $this->message =str_replace("&gt;","&#62;",$this->message );
 23:     $this->message =str_replace("&amp;","&#38;",$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 any
 34:     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, die
  4: 	#
  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 object
 17: 	# setup handlers
 18: 	#
 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 patch
 26:   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("&lt;","&#60;",$source );
 32:   $source =str_replace("&gt;","&#62;",$source );
 33:   $source =str_replace("&amp;","&#38;",$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.

Patch yang saya berikan hanya untuk WordPress 2.7.1. Jika anda menggunakan WP versi lain, upgrade terlebih dahulu atau patch manual dengan cara di atas!

Backup ketiga file tersebut sebelum di patch. Jika ternyata bermasalah, cukup upload kembali file backup tersebut.

Download WordPress libxml patch: wp_libxml_pacth.zip (23.45 KB).

Referensi:

Related Posts

Tags: ,

10 Responses to “Bug Ketika Menggunakan WP 2.7.1 dan Windows Live Writer”

  1. dawiecool says:

    saya pakai 2.7.1
    tidak memakai windowns live writer
    dan kelihatannya serem download gak resmi nya…
    hehehe…

    • blaszta says:

      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.. :-D

  2. Heri Cahyono says:

    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.

  3. alief says:

    wah…, fersi baru kok malah bermasalah ya?????

  4. uwiwu says:

    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

  5. uwiwu says:

    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

  6. [...] 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 [...]

Leave a Reply