WordPress.org

Make WordPress Core

Ticket #5357: importer-2pass-3.patch

File importer-2pass-3.patch, 7.5 KB (added by tellyworth, 6 years ago)
  • wordpress/wp-admin/import/wordpress.php

     
    33class WP_Import { 
    44 
    55        var $posts = array (); 
    6         var $posts_processed = array (); 
     6        var $post_ids_processed = array (); 
    77    // Array of arrays. [[0] => XML fragment, [1] => New post ID] 
    88        var $file; 
    99        var $id; 
    1010        var $mtnames = array (); 
    1111        var $newauthornames = array (); 
     12        var $allauthornames = array (); 
    1213        var $j = -1; 
     14        var $another_pass = false; 
    1315 
    1416        function header() { 
    1517                echo '<div class="wrap">'; 
     
    8385                return $user_id; 
    8486        } 
    8587 
    86         function get_entries() { 
     88        function get_entries($process_post_func=NULL) { 
    8789                set_magic_quotes_runtime(0); 
    8890 
    89                 $this->posts = array(); 
    90                 $this->categories = array(); 
    91                 $this->tags = array(); 
    92                 $num = 0; 
    93                 $doing_entry = false; 
     91#               $this->posts = array(); 
     92#               $this->categories = array(); 
     93#               $this->tags = array(); 
     94#               $num = 0; 
    9495 
    95                 $fp = fopen($this->file, 'r'); 
    96                 if ($fp) { 
    97                         while ( !feof($fp) ) { 
    98                                 $importline = rtrim(fgets($fp)); 
    99  
    100                                 if ( false !== strpos($importline, '<wp:category>') ) { 
    101                                         preg_match('|<wp:category>(.*?)</wp:category>|is', $importline, $category); 
    102                                         $this->categories[] = $category[1]; 
    103                                         continue; 
     96                for ($i=0; $i<2; $i++) { 
     97                        $this->another_pass = false; 
     98                        $doing_entry = false; 
     99         
     100                        $fp = fopen($this->file, 'r'); 
     101                        if ($fp) { 
     102                                while ( !feof($fp) ) { 
     103                                        $importline = rtrim(fgets($fp)); 
     104         
     105                                        if ( false !== strpos($importline, '<wp:category>') ) { 
     106                                                preg_match('|<wp:category>(.*?)</wp:category>|is', $importline, $category); 
     107                                                $this->categories[] = $category[1]; 
     108                                                continue; 
     109                                        } 
     110                                        if ( false !== strpos($importline, '<wp:tag>') ) { 
     111                                                preg_match('|<wp:tag>(.*?)</wp:tag>|is', $importline, $tag); 
     112                                                $this->tags[] = $tag[1]; 
     113                                                continue; 
     114                                        } 
     115                                        if ( false !== strpos($importline, '<item>') ) { 
     116                                                $this->post = ''; 
     117                                                $doing_entry = true; 
     118                                                continue; 
     119                                        } 
     120                                        if ( false !== strpos($importline, '</item>') ) { 
     121                                                $num++; 
     122                                                $doing_entry = false; 
     123                                                if ($process_post_func) 
     124                                                        call_user_func($process_post_func, $this->post); 
     125                                                continue; 
     126                                        } 
     127                                        if ( $doing_entry ) { 
     128                                                $this->post .= $importline . "\n"; 
     129                                        } 
    104130                                } 
    105                                 if ( false !== strpos($importline, '<wp:tag>') ) { 
    106                                         preg_match('|<wp:tag>(.*?)</wp:tag>|is', $importline, $tag); 
    107                                         $this->tags[] = $tag[1]; 
    108                                         continue; 
    109                                 } 
    110                                 if ( false !== strpos($importline, '<item>') ) { 
    111                                         $this->posts[$num] = ''; 
    112                                         $doing_entry = true; 
    113                                         continue; 
    114                                 } 
    115                                 if ( false !== strpos($importline, '</item>') ) { 
    116                                         $num++; 
    117                                         $doing_entry = false; 
    118                                         continue; 
    119                                 } 
    120                                 if ( $doing_entry ) { 
    121                                         $this->posts[$num] .= $importline . "\n"; 
    122                                 } 
     131         
     132                                fclose($fp); 
    123133                        } 
     134                         
     135                        // skip the second loop iteration unless it's needed 
     136                        if ( !$this->another_pass ) 
     137                                break; 
     138                } 
    124139 
    125                         foreach ($this->posts as $post) { 
    126                                 $post_ID = (int) $this->get_tag( $post, 'wp:post_id' ); 
    127                                 if ($post_ID) { 
    128                                         $this->posts_processed[$post_ID][0] = &$post; 
    129                                         $this->posts_processed[$post_ID][1] = 0; 
    130                                 } 
    131                         } 
    132  
    133                         fclose($fp); 
    134                 } 
    135140        } 
    136  
     141         
    137142        function get_wp_authors() { 
    138                 $temp = array (); 
    139                 $i = -1; 
    140                 foreach ($this->posts as $post) { 
    141                         if ('' != trim($post)) { 
    142                                 ++ $i; 
    143                                 $author = $this->get_tag( $post, 'dc:creator' ); 
    144                                 array_push($temp, "$author"); //store the extracted author names in a temporary array 
    145                         } 
    146                 } 
     143                $this->get_entries(array(&$this, 'process_author')); 
    147144 
    148145                // We need to find unique values of author names, while preserving the order, so this function emulates the unique_value(); php function, without the sorting. 
     146                $temp = $this->allauthornames; 
    149147                $authors[0] = array_shift($temp); 
    150148                $y = count($temp) + 1; 
    151149                for ($x = 1; $x < $y; $x ++) { 
     
    181179                                array_push($this->newauthornames, "$formnames[$i]"); 
    182180                        } 
    183181                } 
     182                 
    184183        } 
    185184 
    186185        function wp_authors_form() { 
     
    210209        } 
    211210 
    212211        function select_authors() { 
    213                 $file = wp_import_handle_upload(); 
    214                 if ( isset($file['error']) ) { 
    215                         echo '<p>'.__('Sorry, there has been an error.').'</p>'; 
    216                         echo '<p><strong>' . $file['error'] . '</strong></p>'; 
    217                         return; 
    218                 } 
    219                 $this->file = $file['file']; 
    220                 $this->id = (int) $file['id']; 
    221  
    222                 $this->get_entries(); 
     212                $this->get_entries(array(&$this, 'process_author')); 
    223213                $this->wp_authors_form(); 
    224214        } 
    225215 
     
    273263                } 
    274264        } 
    275265 
     266        function process_author($post) { 
     267                $author = $this->get_tag( $post, 'dc:creator' ); 
     268                if ($author) 
     269                        $this->allauthornames[] = $author; 
     270        } 
     271 
    276272        function process_posts() { 
     273                return; //FIXME 
    277274                $i = -1; 
    278275                echo '<ol>'; 
    279276 
    280                 foreach ($this->posts as $post) { 
    281                         $result = $this->process_post($post); 
    282                         if ( is_wp_error( $result ) ) 
    283                                 return $result; 
    284                 } 
     277                $this->get_entries(array(&$this, 'process_post')); 
    285278 
    286279                echo '</ol>'; 
    287280 
     
    292285 
    293286        function process_post($post) { 
    294287                global $wpdb; 
    295  
     288                 
    296289                $post_ID = (int) $this->get_tag( $post, 'wp:post_id' ); 
    297                 if ( $post_ID && !empty($this->posts_processed[$post_ID][1]) ) // Processed already 
     290                if ( $post_ID && !empty($this->post_ids_processed[$post_ID]) ) // Processed already 
    298291                        return 0; 
    299292 
    300293                // There are only ever one of these 
     
    341334 
    342335                        // If it has parent, process parent first. 
    343336                        $post_parent = (int) $post_parent; 
    344                         if ($parent = $this->posts_processed[$post_parent]) { 
    345                                 if (!$parent[1]) {  
    346                                         $result = $this->process_post($parent[0]); // If not yet, process the parent first. 
    347                                         if ( is_wp_error( $result ) ) 
    348                                                 return $result; 
     337                        if ($post_parent) { 
     338                                if ( $parent = $this->post_ids_processed[$post_parent] ) { 
     339                                        $post_parent = $parent;  // new ID of the parent 
    349340                                } 
    350                                 $post_parent = $parent[1]; // New ID of the parent; 
     341                                else { 
     342                                        // wait until the parent has been processed 
     343                                        $this->another_pass = true; 
     344                                        return; 
     345                                } 
    351346                        } 
    352347 
    353348                        echo '<li>'; 
     
    361356                                return $post_id; 
    362357 
    363358                        // Memorize old and new ID. 
    364                         if ( $post_id && $post_ID && $this->posts_processed[$post_ID] ) 
    365                                 $this->posts_processed[$post_ID][1] = $post_id; // New ID. 
     359                        if ( $post_id && $post_ID ) { 
     360                                $this->post_ids_processed[intval($post_ID)] = intval($post_id); 
     361                        } 
    366362 
    367363                        // Add categories. 
    368364                        if (count($categories) > 0) { 
     
    439435                } } 
    440436        } 
    441437 
    442         function import() { 
    443                 $this->id = (int) $_GET['id']; 
     438        function import($id) { 
     439                $this->id = (int) $id; 
    444440 
    445441                $this->file = get_attached_file($this->id); 
    446442                $this->get_authors_from_post(); 
    447                 $this->get_entries(); 
     443                $this->get_entries(array(&$this, 'process_post')); 
    448444                $this->process_categories(); 
    449445                $this->process_tags(); 
    450446                $result = $this->process_posts(); 
    451447                if ( is_wp_error( $result ) ) 
    452448                        return $result; 
    453449        } 
     450         
     451        function handle_upload() { 
     452                $file = wp_import_handle_upload(); 
     453                if ( isset($file['error']) ) { 
     454                        echo '<p>'.__('Sorry, there has been an error.').'</p>'; 
     455                        echo '<p><strong>' . $file['error'] . '</strong></p>'; 
     456                        return false; 
     457                } 
     458                $this->file = $file['file']; 
     459                $this->id = (int) $file['id']; 
     460                return true; 
     461        } 
    454462 
    455463        function dispatch() { 
    456464                if (empty ($_GET['step'])) 
     
    465473                                break; 
    466474                        case 1 : 
    467475                                check_admin_referer('import-upload'); 
    468                                 $this->select_authors(); 
     476                                if ( $this->handle_upload() ) 
     477                                        $this->select_authors(); 
    469478                                break; 
    470479                        case 2: 
    471480                                check_admin_referer('import-wordpress'); 
    472                                 $result = $this->import(); 
     481                                $result = $this->import( $_GET['id'] ); 
    473482                                if ( is_wp_error( $result ) ) 
    474483                                        echo $result->get_error_message(); 
    475484                                break;