diff --git a/wp-admin/import/wordpress.php b/wp-admin/import/wordpress.php index 1744639e4f..cd73df274d 100644 --- a/wp-admin/import/wordpress.php +++ b/wp-admin/import/wordpress.php @@ -3,13 +3,15 @@ class WP_Import { var $posts = array (); - var $posts_processed = array (); + var $post_ids_processed = array (); // Array of arrays. [[0] => XML fragment, [1] => New post ID] var $file; var $id; var $mtnames = array (); var $newauthornames = array (); + var $allauthornames = array (); var $j = -1; + var $another_pass = false; function header() { echo '
'; @@ -83,69 +85,65 @@ class WP_Import { return $user_id; } - function get_entries() { + function get_entries($process_post_func=NULL) { set_magic_quotes_runtime(0); - $this->posts = array(); - $this->categories = array(); - $this->tags = array(); - $num = 0; - $doing_entry = false; +# $this->posts = array(); +# $this->categories = array(); +# $this->tags = array(); +# $num = 0; - $fp = fopen($this->file, 'r'); - if ($fp) { - while ( !feof($fp) ) { - $importline = rtrim(fgets($fp)); - - if ( false !== strpos($importline, '') ) { - preg_match('|(.*?)|is', $importline, $category); - $this->categories[] = $category[1]; - continue; - } - if ( false !== strpos($importline, '') ) { - preg_match('|(.*?)|is', $importline, $tag); - $this->tags[] = $tag[1]; - continue; - } - if ( false !== strpos($importline, '') ) { - $this->posts[$num] = ''; - $doing_entry = true; - continue; - } - if ( false !== strpos($importline, '') ) { - $num++; - $doing_entry = false; - continue; - } - if ( $doing_entry ) { - $this->posts[$num] .= $importline . "\n"; + for ($i=0; $i<2; $i++) { + $this->another_pass = false; + $doing_entry = false; + + $fp = fopen($this->file, 'r'); + if ($fp) { + while ( !feof($fp) ) { + $importline = rtrim(fgets($fp)); + + if ( false !== strpos($importline, '') ) { + preg_match('|(.*?)|is', $importline, $category); + $this->categories[] = $category[1]; + continue; + } + if ( false !== strpos($importline, '') ) { + preg_match('|(.*?)|is', $importline, $tag); + $this->tags[] = $tag[1]; + continue; + } + if ( false !== strpos($importline, '') ) { + $this->post = ''; + $doing_entry = true; + continue; + } + if ( false !== strpos($importline, '') ) { + $num++; + $doing_entry = false; + if ($process_post_func) + call_user_func($process_post_func, $this->post); + continue; + } + if ( $doing_entry ) { + $this->post .= $importline . "\n"; + } } + + fclose($fp); } - - foreach ($this->posts as $post) { - $post_ID = (int) $this->get_tag( $post, 'wp:post_id' ); - if ($post_ID) { - $this->posts_processed[$post_ID][0] = &$post; - $this->posts_processed[$post_ID][1] = 0; - } - } - - fclose($fp); + + // skip the second loop iteration unless it's needed + if ( !$this->another_pass ) + break; } + } - + function get_wp_authors() { - $temp = array (); - $i = -1; - foreach ($this->posts as $post) { - if ('' != trim($post)) { - ++ $i; - $author = $this->get_tag( $post, 'dc:creator' ); - array_push($temp, "$author"); //store the extracted author names in a temporary array - } - } + $this->get_entries(array(&$this, 'process_author')); // 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. + $temp = $this->allauthornames; $authors[0] = array_shift($temp); $y = count($temp) + 1; for ($x = 1; $x < $y; $x ++) { @@ -181,6 +179,7 @@ class WP_Import { array_push($this->newauthornames, "$formnames[$i]"); } } + } function wp_authors_form() { @@ -210,16 +209,7 @@ class WP_Import { } function select_authors() { - $file = wp_import_handle_upload(); - if ( isset($file['error']) ) { - echo '

'.__('Sorry, there has been an error.').'

'; - echo '

' . $file['error'] . '

'; - return; - } - $this->file = $file['file']; - $this->id = (int) $file['id']; - - $this->get_entries(); + $this->get_entries(array(&$this, 'process_author')); $this->wp_authors_form(); } @@ -273,15 +263,18 @@ class WP_Import { } } + function process_author($post) { + $author = $this->get_tag( $post, 'dc:creator' ); + if ($author) + $this->allauthornames[] = $author; + } + function process_posts() { + return; //FIXME $i = -1; echo '
    '; - foreach ($this->posts as $post) { - $result = $this->process_post($post); - if ( is_wp_error( $result ) ) - return $result; - } + $this->get_entries(array(&$this, 'process_post')); echo '
'; @@ -292,9 +285,9 @@ class WP_Import { function process_post($post) { global $wpdb; - + $post_ID = (int) $this->get_tag( $post, 'wp:post_id' ); - if ( $post_ID && !empty($this->posts_processed[$post_ID][1]) ) // Processed already + if ( $post_ID && !empty($this->post_ids_processed[$post_ID]) ) // Processed already return 0; // There are only ever one of these @@ -341,13 +334,15 @@ class WP_Import { // If it has parent, process parent first. $post_parent = (int) $post_parent; - if ($parent = $this->posts_processed[$post_parent]) { - if (!$parent[1]) { - $result = $this->process_post($parent[0]); // If not yet, process the parent first. - if ( is_wp_error( $result ) ) - return $result; + if ($post_parent) { + if ( $parent = $this->post_ids_processed[$post_parent] ) { + $post_parent = $parent; // new ID of the parent + } + else { + // wait until the parent has been processed + $this->another_pass = true; + return; } - $post_parent = $parent[1]; // New ID of the parent; } echo '
  • '; @@ -361,8 +356,9 @@ class WP_Import { return $post_id; // Memorize old and new ID. - if ( $post_id && $post_ID && $this->posts_processed[$post_ID] ) - $this->posts_processed[$post_ID][1] = $post_id; // New ID. + if ( $post_id && $post_ID ) { + $this->post_ids_processed[intval($post_ID)] = intval($post_id); + } // Add categories. if (count($categories) > 0) { @@ -439,18 +435,30 @@ class WP_Import { } } } - function import() { - $this->id = (int) $_GET['id']; + function import($id) { + $this->id = (int) $id; $this->file = get_attached_file($this->id); $this->get_authors_from_post(); - $this->get_entries(); + $this->get_entries(array(&$this, 'process_post')); $this->process_categories(); $this->process_tags(); $result = $this->process_posts(); if ( is_wp_error( $result ) ) return $result; } + + function handle_upload() { + $file = wp_import_handle_upload(); + if ( isset($file['error']) ) { + echo '

    '.__('Sorry, there has been an error.').'

    '; + echo '

    ' . $file['error'] . '

    '; + return false; + } + $this->file = $file['file']; + $this->id = (int) $file['id']; + return true; + } function dispatch() { if (empty ($_GET['step'])) @@ -465,11 +473,12 @@ class WP_Import { break; case 1 : check_admin_referer('import-upload'); - $this->select_authors(); + if ( $this->handle_upload() ) + $this->select_authors(); break; case 2: check_admin_referer('import-wordpress'); - $result = $this->import(); + $result = $this->import( $_GET['id'] ); if ( is_wp_error( $result ) ) echo $result->get_error_message(); break;