From b344d5455379a02aa7a4c0ce80ccc3a6a7f7daa8 Mon Sep 17 00:00:00 2001 From: matt Date: Wed, 10 May 2006 20:34:17 +0000 Subject: [PATCH] New import and export, v0.1 git-svn-id: http://svn.automattic.com/wordpress/trunk@3769 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-admin/export.php | 106 ++++++++++++ wp-admin/import.php | 8 +- wp-admin/import/blogger.php | 2 +- wp-admin/import/mt.php | 16 +- wp-admin/import/wordpress.php | 311 ++++++++++++++++++++++++++++++++++ wp-admin/menu.php | 4 +- 6 files changed, 435 insertions(+), 12 deletions(-) create mode 100644 wp-admin/export.php create mode 100644 wp-admin/import/wordpress.php diff --git a/wp-admin/export.php b/wp-admin/export.php new file mode 100644 index 0000000000..8894f29214 --- /dev/null +++ b/wp-admin/export.php @@ -0,0 +1,106 @@ + + +
+

+

+

We need some more text here. Maybe talking about the export file or how to save it.

+
+

+ +

+
+
+ +get_results("SELECT * FROM $wpdb->posts ORDER BY post_date_gmt ASC"); +?> + + + + + <?php bloginfo_rss('name'); ?> + + + + http://wordpress.org/?v= + + + + +<?php the_title_rss() ?> + + + + + + + +post_content ?>]]> +post_date; ?> +post_date_gmt; ?> +comment_status; ?> +ping_status; ?> +post_name; ?> +post_status; ?> +post_parent; ?> +post_type; ?> +get_results("SELECT * FROM $wpdb->postmeta WHERE post_id = $post->ID"); +if ( $postmeta ) { +?> + + +meta_key; ?> +meta_value; ?> + + + +get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = $post->ID"); +if ( $comments ) { foreach ( $comments as $c ) { ?> + +comment_author; ?> +comment_author_email; ?> +comment_author_url; ?> +comment_author_IP; ?> +comment_date; ?> +comment_date_gmt; ?> +comment_content; ?> +comment_approved; ?> +comment_type; ?> +comment_parent; ?> + + + + + + + \ No newline at end of file diff --git a/wp-admin/import.php b/wp-admin/import.php index 2ed94ee8b4..ba160617e8 100644 --- a/wp-admin/import.php +++ b/wp-admin/import.php @@ -1,7 +1,7 @@ @@ -30,7 +30,7 @@ if (empty ($importers)) { echo '

'.__('No importers are available.').'

'; // TODO: make more helpful } else { ?> - +
- - + + "; } ?> diff --git a/wp-admin/import/blogger.php b/wp-admin/import/blogger.php index 864c5a2bbd..fecffbd4ac 100644 --- a/wp-admin/import/blogger.php +++ b/wp-admin/import/blogger.php @@ -662,6 +662,6 @@ class Blogger_Import { $blogger_import = new Blogger_Import(); -register_importer('blogger', 'Blogger', __('Import posts and comments from a Blogger account'), array ($blogger_import, 'start')); +register_importer('blogger', 'Blogger and Blogspot', __('Import posts and comments from your Blogger account'), array ($blogger_import, 'start')); ?> diff --git a/wp-admin/import/mt.php b/wp-admin/import/mt.php index 6766f32e01..a04541a26d 100644 --- a/wp-admin/import/mt.php +++ b/wp-admin/import/mt.php @@ -11,7 +11,7 @@ class MT_Import { function header() { echo '
'; - echo '

'.__('Import Movable Type').'

'; + echo '

'.__('Import Movable Type and Typepad').'

'; } function footer() { @@ -148,7 +148,7 @@ class MT_Import { $j = -1; foreach ($authors as $author) { ++ $j; - echo '
  • '.$author.'
    '.''; + echo '
  • Current author: '.$author.'
    '.'Create user
    or map to existing '; $this->users_form($j); echo '
  • '; } @@ -162,7 +162,10 @@ class MT_Import { function select_authors() { $file = wp_import_handle_upload(); if ( isset($file['error']) ) { - echo $file['error']; + $this->header(); + echo '

    Sorry, there has been an error.

    '; + echo '

    ' . $file['error'] . '

    '; + $this->footer(); return; } $this->file = $file['file']; @@ -331,7 +334,7 @@ class MT_Import { } } if ( $num_comments ) - printf(__('(%s comments)'), $num_comments); + printf(__(' (%s comments)'), $num_comments); // Finally the pings // fix the double newline on the first one @@ -379,7 +382,7 @@ class MT_Import { } } if ( $num_pings ) - printf(__('(%s pings)'), $num_pings); + printf(__(' (%s pings)'), $num_pings); echo ""; } @@ -394,6 +397,7 @@ class MT_Import { function import() { $this->id = (int) $_GET['id']; + $this->file = get_attached_file($this->id); $this->get_authors_from_post(); $this->get_entries(); @@ -426,5 +430,5 @@ class MT_Import { $mt_import = new MT_Import(); -register_importer('mt', 'Movable Type', __('Import posts and comments from your Movable Type blog'), array ($mt_import, 'dispatch')); +register_importer('mt', 'Movable Type and Typepad', __('Imports posts and comments from your Movable Type or Typepad blog'), array ($mt_import, 'dispatch')); ?> diff --git a/wp-admin/import/wordpress.php b/wp-admin/import/wordpress.php new file mode 100644 index 0000000000..ac886cf90c --- /dev/null +++ b/wp-admin/import/wordpress.php @@ -0,0 +1,311 @@ +'; + echo '

    '.__('Import WordPress').'

    '; + } + + function footer() { + echo '
    '; + } + + function unhtmlentities($string) { // From php.net for < 4.3 compat + $trans_tbl = get_html_translation_table(HTML_ENTITIES); + $trans_tbl = array_flip($trans_tbl); + return strtr($string, $trans_tbl); + } + + function greet() { + echo '

    '.__('Howdy! Upload your WordPress eXtended RSS (WXR) file and we’ll import the posts and comments into this blog.').'

    '; + wp_import_upload_form("admin.php?import=wordpress&step=1"); + } + + function get_tag( $string, $tag ) { + preg_match("|<$tag.*?>(.*?)|is", $string, $return); + $return = addslashes( trim( $return[1] ) ); + return $return; + } + + function users_form($n) { + global $wpdb, $testing; + $users = $wpdb->get_results("SELECT * FROM $wpdb->users ORDER BY ID"); +?> + mtnames))) { //a new mt author name is found + ++ $this->j; + $this->mtnames[$this->j] = $author; //add that new mt author name to an array + $user_id = username_exists($this->newauthornames[$this->j]); //check if the new author name defined by the user is a pre-existing wp user + if (!$user_id) { //banging my head against the desk now. + if ($newauthornames[$this->j] == 'left_blank') { //check if the user does not want to change the authorname + $user_id = wp_create_user($author, $pass); + $this->newauthornames[$this->j] = $author; //now we have a name, in the place of left_blank. + } else { + $user_id = wp_create_user($this->newauthornames[$this->j], $pass); + } + } else { + return $user_id; // return pre-existing wp username if it exists + } + } else { + $key = array_search($author, $this->mtnames); //find the array key for $author in the $mtnames array + $user_id = username_exists($this->newauthornames[$key]); //use that key to get the value of the author's name from $newauthornames + } + + return $user_id; + } + + function get_entries() { + set_magic_quotes_runtime(0); + $importdata = file($this->file); // Read the file into an array + $importdata = implode('', $importdata); // squish it + $importdata = preg_replace("/(\r\n|\n|\r)/", "\n", $importdata); + preg_match_all('|(.*?)|is', $importdata, $this->posts); + $this->posts = $this->posts[1]; + } + + 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 + } + } + + // 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. + $authors[0] = array_shift($temp); + $y = count($temp) + 1; + for ($x = 1; $x < $y; $x ++) { + $next = array_shift($temp); + if (!(in_array($next, $authors))) + array_push($authors, "$next"); + } + + return $authors; + } + + function get_authors_from_post() { + $formnames = array (); + $selectnames = array (); + + foreach ($_POST['user'] as $key => $line) { + $newname = trim(stripslashes($line)); + if ($newname == '') + $newname = 'left_blank'; //passing author names from step 1 to step 2 is accomplished by using POST. left_blank denotes an empty entry in the form. + array_push($formnames, "$newname"); + } // $formnames is the array with the form entered names + + foreach ($_POST['userselect'] as $user => $key) { + $selected = trim(stripslashes($key)); + array_push($selectnames, "$selected"); + } + + $count = count($formnames); + for ($i = 0; $i < $count; $i ++) { + if ($selectnames[$i] != '#NONE#') { //if no name was selected from the select menu, use the name entered in the form + array_push($this->newauthornames, "$selectnames[$i]"); + } else { + array_push($this->newauthornames, "$formnames[$i]"); + } + } + } + + function wp_authors_form() { +?> +

    +

    admins entries.'); ?>

    +

    + get_wp_authors(); + echo '
      '; + echo '
      '; + $j = -1; + foreach ($authors as $author) { + ++ $j; + echo '
    1. Current author: '.$author.'
      '.'Create user
      or map to existing '; + $this->users_form($j); + echo '
    2. '; + } + + echo ''.'
      '; + echo ''; + echo '
    '; + + } + + function select_authors() { + $file = wp_import_handle_upload(); + if ( isset($file['error']) ) { + $this->header(); + echo '

    Sorry, there has been an error.

    '; + echo '

    ' . $file['error'] . '

    '; + $this->footer(); + return; + } + $this->file = $file['file']; + $this->id = $file['id']; + + $this->get_entries(); + $this->wp_authors_form(); + } + + function process_posts() { + global $wpdb; + $i = -1; + echo '
      '; + foreach ($this->posts as $post) { + + // There are only ever one of these + $post_title = $this->get_tag( $post, 'title' ); + $post_date = $this->get_tag( $post, 'wp:post_date' ); + $post_date_gmt = $this->get_tag( $post, 'wp:post_date_gmt' ); + $comment_status = $this->get_tag( $post, 'wp:comment_status' ); + $ping_status = $this->get_tag( $post, 'wp:ping_status' ); + $post_status = $this->get_tag( $post, 'wp:status' ); + $post_parent = $this->get_tag( $post, 'wp:post_parent' ); + $post_type = $this->get_tag( $post, 'wp:post_type' ); + $guid = $this->get_tag( $post, 'guid' ); + $post_author = $this->get_tag( $post, 'dc:creator' ); + + $post_content = $this->get_tag( $post, 'content:encoded' ); + $post_content = str_replace(array (''), '', $post_content); + $post_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $post_content); + $post_content = str_replace('
      ', '
      ', $post_content); + $post_content = str_replace('
      ', '
      ', $post_content); + + preg_match_all('|(.*?)|is', $post, $categories); + $categories = $categories[1]; + + $cat_index = 0; + foreach ($categories as $category) { + $categories[$cat_index] = $wpdb->escape($this->unhtmlentities($category)); + $cat_index++; + } + + if ($post_id = post_exists($post_title, '', $post_date)) { + echo '
    1. '; + printf(__('Post %s already exists.'), stripslashes($post_title)); + } else { + echo '
    2. '; + printf(__('Importing post %s...'), stripslashes($post_title)); + + $post_author = $this->checkauthor($post_author); //just so that if a post already exists, new users are not created by checkauthor + + $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'); + $comment_post_ID = $post_id = wp_insert_post($postdata); + // Add categories. + if (0 != count($post_categories)) { + wp_create_categories($post_categories, $post_id); + } + } + + // Now for comments + preg_match_all('|(.*?)|is', $post, $comments); + $comments = $comments[1]; + $num_comments = 0; + if ( $comments) { foreach ($comments as $comment) { + $comment_author = $this->get_tag( $comment, 'wp:comment_author'); + $comment_author_email = $this->get_tag( $comment, 'wp:comment_author_email'); + $comment_author_IP = $this->get_tag( $comment, 'wp:comment_author_IP'); + $comment_author_url = $this->get_tag( $comment, 'wp:comment_author_url'); + $comment_date = $this->get_tag( $comment, 'wp:comment_date'); + $comment_date_gmt = $this->get_tag( $comment, 'wp:comment_date_gmt'); + $comment_content = $this->get_tag( $comment, 'wp:comment_content'); + $comment_approved = $this->get_tag( $comment, 'wp:comment_approved'); + $comment_type = $this->get_tag( $comment, 'wp:comment_type'); + $comment_parent = $this->get_tag( $comment, 'wp:comment_parent'); + + if ( !comment_exists($comment_author, $comment_date) ) { + $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email', 'comment_author_IP', 'comment_date', 'comment_date_gmt', 'comment_content', 'comment_approved', 'comment_type', 'comment_parent'); + wp_insert_comment($commentdata); + $num_comments++; + } + } } + if ( $num_comments ) + printf(__(' (%s comments)'), $num_comments); + + // Now for post meta + preg_match_all('|(.*?)|is', $post, $postmeta); + $postmeta = $postmeta[1]; + if ( $postmeta) { foreach ($postmeta as $p) { + $key = $this->get_tag( $p, 'wp:meta_key' ); + $value = $this->get_tag( $p, 'wp:meta_value' ); + add_post_meta( $post_id, $key, $value ); + } } + + $index++; + } + + echo '
    '; + + wp_import_cleanup($this->id); + + echo '

    '.sprintf(__('All done. Have fun!'), get_option('home')).'

    '; + } + + function import() { + $this->id = (int) $_GET['id']; + + $this->file = get_attached_file($this->id); + $this->get_authors_from_post(); + $this->get_entries(); + $this->process_posts(); + } + + function dispatch() { + if (empty ($_GET['step'])) + $step = 0; + else + $step = (int) $_GET['step']; + + $this->header(); + switch ($step) { + case 0 : + $this->greet(); + break; + case 1 : + $this->select_authors(); + break; + case 2: + $this->import(); + break; + } + $this->footer(); + } + + function WP_Import() { + // Nothing. + } +} + +$wp_import = new WP_Import(); + +register_importer('wordpress', 'WordPress', __('Import posts from a WordPress export file'), array ($wp_import, 'dispatch')); + +?> \ No newline at end of file diff --git a/wp-admin/menu.php b/wp-admin/menu.php index 7b62c44d29..254f1d77f1 100644 --- a/wp-admin/menu.php +++ b/wp-admin/menu.php @@ -15,7 +15,7 @@ if ( current_user_can('edit_users') ) else $menu[35] = array(__('Profile'), 'read', 'profile.php'); $menu[40] = array(__('Options'), 'manage_options', 'options-general.php'); -$menu[45] = array(__('Import'), 'import', 'import.php'); + $submenu['post-new.php'][5] = array(__('Write Post'), 'edit_posts', 'post-new.php'); $submenu['post-new.php'][10] = array(__('Write Page'), 'edit_pages', 'page-new.php'); @@ -27,6 +27,8 @@ $submenu['edit.php'][20] = array(__('Comments'), 'edit_posts', 'edit-comments.ph $awaiting_mod = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '0'"); $submenu['edit.php'][25] = array(sprintf(__("Awaiting Moderation (%s)"), "$awaiting_mod"), 'edit_posts', 'moderation.php'); $submenu['edit.php'][30] = array(__('Files'), 'edit_files', 'templates.php'); +$submenu['edit.php'][35] = array(__('Import'), 'import', 'import.php'); +$submenu['edit.php'][40] = array(__('Export'), 'import', 'export.php'); $submenu['link-manager.php'][5] = array(__('Manage Bookmarks'), 'manage_links', 'link-manager.php'); $submenu['link-manager.php'][10] = array(__('Add Bookmark'), 'manage_links', 'link-add.php');
    $action{$data[1]}$action{$data[1]}