WordPress.org

Make WordPress Core

Ticket #4025: import-wordpress.diff

File import-wordpress.diff, 3.3 KB (added by takayukister, 11 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