WordPress.org

Plugin Directory

Changeset 306039


Ignore:
Timestamp:
10/30/10 21:09:37 (3 years ago)
Author:
duck_
Message:

maybe_unserialize postmeta and nav menu item classes, fallback to regex on bad XML

Location:
wordpress-importer/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • wordpress-importer/trunk/parsers.php

    r304726 r306039  
    1212class WXR_Parser { 
    1313    function parse( $file ) { 
    14         if ( extension_loaded( 'simplexml' ) ) 
     14        // Attempt to use proper XML parsers first 
     15        if ( extension_loaded( 'simplexml' ) ) { 
    1516            $parser = new WXR_Parser_SimpleXML; 
    16         else if ( extension_loaded( 'xml' ) ) 
     17            $result = $parser->parse( $file ); 
     18 
     19            // If SimpleXML succeeds or this is an invalid WXR file then return the results 
     20            if ( ! is_wp_error( $result ) || 'SimpleXML_parse_error' != $result->get_error_code() ) 
     21                return $result; 
     22        } else if ( extension_loaded( 'xml' ) ) { 
    1723            $parser = new WXR_Parser_XML; 
    18         else 
    19             $parser = new WXR_Parser_Regex; 
    20  
     24            $result = $parser->parse( $file ); 
     25 
     26            // If XMLParser succeeds or this is an invalid WXR file then return the results 
     27            if ( ! is_wp_error( $result ) || 'XML_parse_error' != $result->get_error_code() ) 
     28                return $result; 
     29        } 
     30 
     31        // We have a malformed XML file, so display the error and fallthrough to regex 
     32        if ( isset($result) && defined('IMPORT_DEBUG') && IMPORT_DEBUG ) { 
     33            echo '<pre>'; 
     34            if ( 'SimpleXML_parse_error' == $result->get_error_code() ) { 
     35                foreach  ( $result->get_error_data() as $error ) 
     36                    echo $error->line . ':' . $error->column . ' ' . esc_html( $error->message ) . "\n"; 
     37            } else if ( 'XML_parse_error' == $result->get_error_code() ) { 
     38                $error = $result->get_error_data(); 
     39                echo $error[0] . ':' . $error[1] . ' ' . esc_html( $error[2] ); 
     40            } 
     41            echo '</pre>'; 
     42            echo '<p><strong>' . __( 'There was an error when reading this WXR file', 'wordpress-importer' ) . '</strong><br />'; 
     43            echo __( 'Details are shown above. The importer will now try again with a different parser...', 'wordpress-importer' ) . '</p>'; 
     44        } 
     45 
     46        // use regular expressions if nothing else available or this is bad XML 
     47        $parser = new WXR_Parser_Regex; 
    2148        return $parser->parse( $file ); 
    2249    } 
     
    209236        if ( ! xml_parse( $xml, file_get_contents( $file ), true ) ) { 
    210237            $current_line = xml_get_current_line_number( $xml ); 
    211             $current_column = xml_get_current_column_number( $xml );         
     238            $current_column = xml_get_current_column_number( $xml ); 
    212239            $error_code = xml_get_error_code( $xml ); 
    213240            $error_string = xml_error_string( $error_code ); 
  • wordpress-importer/trunk/wordpress-importer.php

    r304726 r306039  
    66Author: wordpressdotorg 
    77Author URI: http://wordpress.org/ 
    8 Version: 0.3 
     8Version: 0.3-beta1 
    99License: GPL v2 - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 
    1010*/ 
     
    112112            echo '<p><strong>' . __( 'Sorry, there has been an error.', 'wordpress-importer' ) . '</strong></p>'; 
    113113            echo '<p>' . esc_html( $import_data->get_error_message() ) . '</p>'; 
    114             if ( defined('IMPORT_DEBUG') && IMPORT_DEBUG ) { 
    115                 echo '<pre>'; 
    116                 if ( 'SimpleXML_parse_error' == $import_data->get_error_code() ) { 
    117                     foreach  ( $import_data->get_error_data() as $error ) 
    118                         echo $error->line . ':' . $error->column . ' ' . esc_html($error->message) . "\n"; 
    119                 } else if ( 'XML_parse_error' == $import_data->get_error_code() ) { 
    120                     $error = $import_data->get_error_data(); 
    121                     echo $error[0] . ':' . $error[1] . ' ' . esc_html( $error[2] ); 
    122                 } 
    123                 echo '</pre>'; 
    124             } 
    125114            $this->footer(); 
    126115            die(); 
     
    171160            echo '<p><strong>' . __( 'Sorry, there has been an error.', 'wordpress-importer' ) . '</strong></p>'; 
    172161            echo '<p>' . esc_html( $import_data->get_error_message() ) . '</p>'; 
    173             if ( defined('IMPORT_DEBUG') && IMPORT_DEBUG ) { 
    174                 echo '<pre>'; 
    175                 if ( 'SimpleXML_parse_error' == $import_data->get_error_code() ) { 
    176                     foreach  ( $import_data->get_error_data() as $error ) 
    177                         echo $error->line . ':' . $error->column . ' ' . esc_html($error->message) . "\n"; 
    178                 } else if ( 'XML_parse_error' == $import_data->get_error_code() ) { 
    179                     $error = $import_data->get_error_data(); 
    180                     echo $error[0] . ':' . $error[1] . ' ' . esc_html( $error[2] ); 
    181                 } 
    182                 echo '</pre>'; 
    183             } 
    184162            return false; 
    185163        } 
     
    487465                            $term_id = $t['term_id']; 
    488466                        } else { 
    489                             echo sprintf( __( 'Failed to import %s %s', 'wordpress-importer' ), esc_html($term['term_taxonomy']), esc_html($term['term_taxonomy']) ); 
     467                            echo sprintf( __( 'Failed to import %s %s', 'wordpress-importer' ), esc_html($taxonomy), esc_html($term['name']) ); 
    490468                            if ( defined('IMPORT_DEBUG') && IMPORT_DEBUG ) 
    491469                                echo ': ' . $t->get_error_message(); 
     
    541519                    $key = apply_filters( 'import_post_meta_key', $meta['key'] ); 
    542520                    if ( $key ) { 
    543                         update_post_meta( $post_id, $key, $meta['value'] ); 
    544                         do_action( 'import_post_meta', $post_id, $key, $meta['value'] ); 
     521                        // export gets meta straight from the DB so could have a serialized string 
     522                        $value = maybe_unserialize( $meta['value'] ); 
     523 
     524                        update_post_meta( $post_id, $key, $value ); 
     525                        do_action( 'import_post_meta', $post_id, $key, $value ); 
    545526                    } 
    546527                } 
     
    550531 
    551532    function process_menu_item( $item ) { 
     533        // skip draft, orphaned menu items 
     534        if ( 'draft' == $item['status'] ) 
     535            return; 
     536 
    552537        $menu_slug = false; 
    553         // loop through terms, assume first nav_menu term is correct menu 
    554         foreach ( $item['terms'] as $term ) { 
    555             if ( 'nav_menu' == $term['domain'] ) { 
    556                 $menu_slug = $term['slug']; 
    557                 break; 
     538        if ( isset($item['terms']) ) { 
     539            // loop through terms, assume first nav_menu term is correct menu 
     540            foreach ( $item['terms'] as $term ) { 
     541                if ( 'nav_menu' == $term['domain'] ) { 
     542                    $menu_slug = $term['slug']; 
     543                    break; 
     544                } 
    558545            } 
    559546        } 
     
    594581            $_menu_item_menu_item_parent = 0; 
    595582        } 
     583 
     584        // wp_update_nav_menu_item expects CSS classes as a space separated string 
     585        $_menu_item_classes = maybe_unserialize( $_menu_item_classes ); 
     586        if ( is_array( $_menu_item_classes ) ) 
     587            $_menu_item_classes = implode( ' ', $_menu_item_classes ); 
    596588 
    597589        $args = array( 
Note: See TracChangeset for help on using the changeset viewer.