WordPress.org

Make WordPress Core

Ticket #4025: import-wordpress.diff

File import-wordpress.diff, 3.3 KB (added by takayukister, 7 years ago)
  • wp-admin/import/wordpress.php

     
    33class WP_Import { 
    44 
    55        var $posts = array (); 
     6  var $posts_identified = array (); 
     7    // Array of arrays. [[0] => XML fragment, [1] => "Already processed" flag, [2] => New post ID] 
    68        var $file; 
    79        var $id; 
    810        var $mtnames = array (); 
     
    8688                $importdata = preg_replace("/(\r\n|\n|\r)/", "\n", $importdata); 
    8789                preg_match_all('|<item>(.*?)</item>|is', $importdata, $this->posts); 
    8890                $this->posts = $this->posts[1]; 
     91    foreach ($this->posts as $post) { 
     92      $post_ID = (int) $this->get_tag( $post, 'wp:post_id' ); 
     93      if ($post_ID) 
     94        $this->posts_identified[$post_ID][0] = &$post; 
     95    } 
    8996                preg_match_all('|<wp:category>(.*?)</wp:category>|is', $importdata, $this->categories); 
    9097                $this->categories = $this->categories[1]; 
    9198        } 
     
    210217        } 
    211218 
    212219        function process_posts() { 
    213                 global $wpdb; 
    214220                $i = -1; 
    215221                echo '<ol>'; 
    216222                foreach ($this->posts as $post) { 
     223      $this->process_post($post); 
     224                } 
    217225 
     226                echo '</ol>'; 
     227 
     228                wp_import_cleanup($this->id); 
     229 
     230                echo '<h3>'.sprintf(__('All done.').' <a href="%s">'.__('Have fun!').'</a>', get_option('home')).'</h3>'; 
     231        } 
     232   
     233  function process_post($post) { 
     234                global $wpdb; 
     235 
     236    $post_ID = (int) $this->get_tag( $post, 'wp:post_id' ); 
     237    if ($post_ID && $this->posts_identified[$post_ID][1] == 1) // Processed already 
     238      return 0; 
     239       
    218240                        // There are only ever one of these 
    219241                        $post_title     = $this->get_tag( $post, 'title' ); 
    220242                        $post_date      = $this->get_tag( $post, 'wp:post_date' ); 
     
    246268                                echo '<li>'; 
    247269                                printf(__('Post <i>%s</i> already exists.'), stripslashes($post_title)); 
    248270                        } else { 
     271 
     272        // If it has parent, process parent first. 
     273        $post_parent = (int) $post_parent; 
     274        if ($parent = $this->posts_identified[$post_parent]) { 
     275          if (!$parent[1]) $this->process_post($parent[0]); // If not yet, process the parent first. 
     276            $post_parent = $parent[2]; // New ID of the parent; 
     277        } 
     278 
    249279                                echo '<li>'; 
    250280                                printf(__('Importing post <i>%s</i>...'), stripslashes($post_title)); 
    251281 
     
    253283 
    254284                                $postdata = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_excerpt', 'post_status', 'comment_status', 'ping_status', 'post_modified', 'post_modified_gmt', 'guid', 'post_parent', 'post_type'); 
    255285                                $comment_post_ID = $post_id = wp_insert_post($postdata); 
     286 
     287      // Memorize old and new ID. 
     288      if ($post_id && $post_ID && $this->posts_identified[$post_ID]) { 
     289        $this->posts_identified[$post_ID][1] = 1; // Processed. 
     290        $this->posts_identified[$post_ID][2] = $post_id; // New ID. 
     291      } 
     292 
    256293                                // Add categories. 
    257294                                if (0 != count($categories)) { 
    258295                                        wp_create_categories($categories, $post_id); 
     
    292329                                        $value = $this->get_tag( $p, 'wp:meta_value' ); 
    293330                                        add_post_meta( $post_id, $key, $value ); 
    294331                                } } 
     332  } 
    295333 
    296                         $index++; 
    297                 } 
    298  
    299                 echo '</ol>'; 
    300  
    301                 wp_import_cleanup($this->id); 
    302  
    303                 echo '<h3>'.sprintf(__('All done.').' <a href="%s">'.__('Have fun!').'</a>', get_option('home')).'</h3>'; 
    304         } 
    305  
    306334        function import() { 
    307335                $this->id = (int) $_GET['id']; 
    308336