=' ) ) { require_once ABSPATH . WPINC . '/class-simplepie.php'; } else { require_once ABSPATH . WPINC . '/class-feed.php'; } // Custom classes used by importer require_once dirname( __FILE__ ) . '/blogger-importer-sanitize.php'; require_once dirname( __FILE__ ) . '/blogger-importer-blogitem.php'; require_once dirname( __FILE__ ) . '/blogger-entry.php'; require_once dirname( __FILE__ ) . '/comment-entry.php'; if ( ! class_exists( 'WP_Importer' ) ) { $class_wp_importer = ABSPATH . 'wp-admin/includes/class-wp-importer.php'; if ( file_exists( $class_wp_importer ) ) require $class_wp_importer; } /** * Blogger Importer class for managing the import process of a XML file * */ if ( !class_exists( 'Blogger_Importer' ) ) { class Blogger_Importer extends WP_Importer { const IMPORT_IMG = true; // Should we import the images (boolean) const LARGE_IMAGE_SIZE = '1024'; // The size of large images downloaded (string) const POST_PINGBACK = 0; // Turn off the post pingback, set to 1 to re-enabled(bool) private $id = null; // XML attachment ID private $author_mapping = array(); private $authors = array(); private $comments_done = 0; private $comments_skipped = 0; private $host = null; private $images_done = 0; private $images_progress = 0; private $images_skipped = 0; private $import_data = null; private $links_done = 0; private $links_progress = 0; private $posts_done = 0; private $posts_skipped = 0; private $processed_authors = array(); private $version = null; /** * Registered callback function for the Blogger Importer * * Manages the three separate stages of the XML import process */ function dispatch() { $this->header(); $step = empty( $_GET['step'] ) ? 0 : (int) $_GET['step']; switch ( $step ) { case 0: $this->greet(); break; case 1: check_admin_referer( 'import-upload' ); if ( $this->handle_upload() ) $this->import_options(); break; case 2: check_admin_referer( 'import-blogger' ); $this->id = (int) $_POST['import_id']; $file = get_attached_file( $this->id ); set_time_limit(0); $this->import( $file ); break; } $this->footer(); } /** * The main controller for the actual import stage. * * @param string $file Path to the XML file for importing */ function import( $file ) { add_filter( 'http_request_timeout', array( &$this, 'bump_request_timeout' ) ); $this->import_start( $file ); $this->get_author_mapping(); wp_suspend_cache_invalidation( true ); $this->process_posts(); $this->process_comments(); if (Blogger_Importer::IMPORT_IMG) { $this->process_images(); } $this->process_links(); wp_suspend_cache_invalidation( false ); // update incorrect/missing information in the DB //$this->backfill_parents(); //$this->backfill_attachment_urls(); //$this->remap_featured_images(); $this->import_end(); } /** * Parses the XML file and prepares us for the task of processing parsed data * * @param string $file Path to the XML file for importing */ function import_start( $file ) { if ( ! is_file($file) ) { echo '

' . __( 'Sorry, there has been an error.', 'blogger-importer' ) . '
'; echo __( 'The file does not exist, please try again.', 'blogger-importer' ) . '

'; $this->footer(); die(); } $import_data = $this->parse( $file ); if ( is_wp_error( $import_data ) ) { echo '

' . __( 'Sorry, there has been an error.', 'blogger-importer' ) . '
'; echo esc_html( $import_data->get_error_message() ) . '

'; $this->footer(); die(); } $this->import_data = $import_data; // $links = $import_data->get_links('alternate'); $this->host = parse_url($links[0], PHP_URL_HOST); $this->images_progress = 0; $this->images_skipped = 0; $this->links_done = 0; $this->links_progress = 0; wp_defer_term_counting( true ); wp_defer_comment_counting( true ); do_action( 'import_start' ); } /** * Performs post-import cleanup of files and the cache */ function import_end() { wp_import_cleanup( $this->id ); wp_cache_flush(); foreach ( get_taxonomies() as $tax ) { delete_option( "{$tax}_children" ); _get_term_hierarchy( $tax ); } wp_defer_term_counting( false ); wp_defer_comment_counting( false ); echo '

' . __( 'All done.', 'blogger-importer' ) . ' ' . __( 'Have fun!', 'blogger-importer' ) . '' . '

'; echo '

' . __( 'Remember to update the passwords and roles of imported users.', 'blogger-importer' ) . '

'; do_action( 'import_end' ); } /** * Handles the WXR upload and initial parsing of the file to prepare for * displaying author import options * * @return bool False if error uploading or invalid file, true otherwise */ function handle_upload() { $file = wp_import_handle_upload(); if ( isset( $file['error'] ) ) { echo '

' . __( 'Sorry, there has been an error.', 'blogger-importer' ) . '
'; echo esc_html( $file['error'] ) . '

'; return false; } else if ( ! file_exists( $file['file'] ) ) { echo '

' . __( 'Sorry, there has been an error.', 'blogger-importer' ) . '
'; printf( __( 'The export file could not be found at %s. It is likely that this was caused by a permissions problem.', 'blogger-importer' ), esc_html( $file['file'] ) ); echo '

'; return false; } $this->id = (int) $file['id']; $import_data = $file['file']; if ( is_wp_error( $import_data ) ) { echo '

' . __( 'Sorry, there has been an error.', 'blogger-importer' ) . '
'; echo esc_html( $import_data->get_error_message() ) . '

'; return false; } $this->get_authors_from_import( $import_data ); return true; } /** * Retrieve authors from parsed data * * @param array $import_data Data returned by a WXR parser */ function get_authors_from_import( $import_data ) { $feed = $this->parse($import_data); $authors = $feed->get_authors(); foreach ($authors as $author) { $login = sanitize_user( $author->get_name(), true ); $this->authors[$login] = array( 'author_login' => $author->get_name(), 'author_display_name' => $author->get_name(), 'author_email' => $author->get_email(), ); } } /** * Display pre-import options, author importing/mapping and option to * fetch attachments */ function import_options() { $j = 0; ?>
authors ) ) : ?>

admins entries.', 'blogger-importer' ); ?>

allow_create_users() ) : ?>

    authors as $author ) : ?>
  1. author_select( $j++, $author ); ?>

' . esc_html( $author['author_display_name'] ); echo '
'; $create_users = $this->allow_create_users(); if ( $create_users ) { _e( 'as a new user:', 'blogger-importer' ); $value = esc_attr( sanitize_user( $author['author_login'], true ) ); echo '
'; } _e( 'or assign posts to an existing user:', 'blogger-importer' ); wp_dropdown_users( array( 'name' => "user_map[$n]", 'multi' => true, 'show_option_all' => __( '- Select -', 'blogger-importer' ) ) ); echo ''; } /** * Map old author logins to local user IDs based on decisions made * in import options form. Can map to an existing user, create a new user * or falls back to the current user in case of error with either of the previous */ function get_author_mapping() { if ( ! isset( $_POST['imported_authors'] ) ) return; $create_users = $this->allow_create_users(); foreach ( (array) $_POST['imported_authors'] as $i => $old_login ) { // Multisite adds strtolower to sanitize_user. Need to sanitize here to stop breakage in process_posts. $santized_old_login = sanitize_user( $old_login, true ); $old_id = isset( $this->authors[$old_login]['author_id'] ) ? intval($this->authors[$old_login]['author_id']) : false; if ( ! empty( $_POST['user_map'][$i] ) ) { $user = get_userdata( intval($_POST['user_map'][$i]) ); if ( isset( $user->ID ) ) { if ( $old_id ) $this->processed_authors[$old_id] = $user->ID; $this->author_mapping[$santized_old_login] = $user->ID; } } else if ( $create_users ) { if ( ! empty($_POST['user_new'][$i]) ) { $user_id = wp_create_user( $_POST['user_new'][$i], wp_generate_password() ); } else if ( $this->version != '1.0' ) { $user_data = array( 'user_login' => $old_login, 'user_pass' => wp_generate_password(), 'user_email' => isset( $this->authors[$old_login]['author_email'] ) ? $this->authors[$old_login]['author_email'] : '', 'display_name' => $this->authors[$old_login]['author_display_name'], 'first_name' => isset( $this->authors[$old_login]['author_first_name'] ) ? $this->authors[$old_login]['author_first_name'] : '', 'last_name' => isset( $this->authors[$old_login]['author_last_name'] ) ? $this->authors[$old_login]['author_last_name'] : '', ); $user_id = wp_insert_user( $user_data ); } if ( ! is_wp_error( $user_id ) ) { if ( $old_id ) $this->processed_authors[$old_id] = $user_id; $this->author_mapping[$santized_old_login] = $user_id; } else { if ( array_key_exists( $old_login, $this->authors ) ) { printf( __( 'Failed to create new user for %s. Their posts will be attributed to the current user.', 'blogger-importer' ), esc_html( $this->authors[$old_login]['author_display_name'] ) ); } else { printf( __( 'Failed to create new user. Their posts will be attributed to the current user.', 'blogger-importer' ) ); } if ( defined('IMPORT_DEBUG') && IMPORT_DEBUG ) echo ' ' . $user_id->get_error_message(); echo '
'; } } // failsafe: if the user_id was invalid, default to the current user if ( ! isset( $this->author_mapping[$santized_old_login] ) ) { if ( $old_id ) $this->processed_authors[$old_id] = (int) get_current_user_id(); $this->author_mapping[$santized_old_login] = (int) get_current_user_id(); } } } /** * Create new posts based on import information */ function process_posts() { $feed = $this->import_data; foreach ( $feed->get_items() as $item ) { // check that it is actually a post first // $is_post = false; $cats = $item->get_categories(); foreach ( $cats as $cat ) { if ( $cat == 'http://schemas.google.com/blogger/2008/kind#post' ) { $is_post = true; break; } } // only import posts for now if ( ! $is_post ) { continue; } $blogentry = new BloggerEntry(); $blogentry->blogurl = $this->host; $blogentry->id = $item->get_id(); $blogentry->published = $item->get_published(); $blogentry->updated = $item->get_updated(); $blogentry->isDraft = $item->get_draft_status(); $blogentry->title = $item->get_title(); $blogentry->content = $item->get_content(); $blogentry->geotags = $item->get_geotags(); // map the post author $blogentry->bloggerauthor = sanitize_user( $item->get_author()->get_name(), true ); if ( isset( $this->author_mapping[$blogentry->bloggerauthor] ) ) $blogentry->author = $this->author_mapping[$blogentry->bloggerauthor]; else $blogentry->author = (int) get_current_user_id(); $blogentry->links = $item->get_links(array('replies', 'edit', 'self', 'alternate')); $blogentry->parselinks(); foreach ( $cats as $cat ) { if ( false === strpos( $cat, 'http://schemas.google.com') ) { $blogentry->categories[] = $cat; } } // Checks for duplicates $post_id = $blogentry->post_exists(); if ( $post_id != 0 ) { $this->posts_skipped++; } else { //Unique new post so import it $post_id = $blogentry->import(); $this->posts_done++; } } } /** * Create new comments based on import information */ function process_comments() { $feed = $this->import_data; foreach ( $feed->get_items() as $item ) { // check that it is actually a comment first // $is_comment = false; $cats = $item->get_categories(); foreach ( $cats as $cat ) { if ( $cat == 'http://schemas.google.com/blogger/2008/kind#comment' ) { $is_comment = true; break; } } // we only import comments here if ( ! $is_comment ) { continue; } $commententry = new CommentEntry(); $commententry->id = $item->get_id(); $commententry->updated = $item->get_updated(); $commententry->content = $item->get_content(); $commententry->author = $item->get_author()->get_name(); $commententry->authoruri = $item->get_author()->get_link(); $commententry->authoremail = $item->get_author()->get_email(); $replyto = $item->get_item_tags('http://purl.org/syndication/thread/1.0','in-reply-to'); $commententry->source = $replyto[0]['attribs']['']['source']; $commententry->source = $item->get_source(); $parts = parse_url($commententry->source); $commententry->old_post_permalink = $parts['path']; //Will be something like this '/feeds/417730729915399755/posts/default/8397846992898424746' $bloggerentry = new BloggerEntry(); $commententry->post_ID = $bloggerentry->get_post_by_oldID($commententry->old_post_permalink); //Get the links $commententry->links = $item->get_links(array('edit', 'self', 'alternate', 'related')); $commententry->parselinks(); // Nested comment? if ( isset($commententry->related) ) { $commententry->parentcommentid = $commententry->get_comment_by_oldID($commententry->related); } //Perhaps could log errors here? if ($commententry->post_ID != 0) { // Checks for duplicates if ($comment_id = $commententry->exists()) { $this->comments_skipped++; } else { $comment_id = $commententry->import(); $this->comments_done++; } } else { $this->comments_skipped++; } } } /* * Search for either a linked image or a non linked image within the supplied html * or * Ref: http://www.the-art-of-web.com/php/parse-links/ * "]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>" * http://wordpress.org/extend/plugins/blogger-image-import/ * "]+href\=([\"'`])(.*)\\1[^<]*?]*src\=([\"'`])(.*)\\3[^>]*>" */ function get_images($content) { $highrez = array(); $lowrez = array(); //First images with links //Might be nice to expand this top try and get Alt and/or Title attributes for use as description $regexp = "]*href\=([\"'`])([^> ]*?)\\1[^<]*?]*src\=([\"'`])([^\> ]*?)\\3[^>]*>"; if (preg_match_all("/$regexp/siU", $content, $matches1, PREG_SET_ORDER)) { //http://www.techrepublic.com/article/17-useful-functions-for-manipulating-arrays-in-php/5792851 foreach ($matches1 as $match) { if ($this->isurlimage($match[2])) { $highrez[$match[4]] = $match[2]; } else { $lowrez[$match[4]] = ''; } } } //Now any image (n.b. this overlaps the previous set) $regexp = "]*src\=([\"'`])([^\> ]*?)\\1[^>]*>"; if (preg_match_all("/$regexp/siU", $content, $matches2, PREG_SET_ORDER)) { foreach ($matches2 as $match) { $lowrez[$match[2]] = ''; } } //Remove any rows from this second set that are already in the first set and merge two sets of results $images = array_merge($lowrez, $highrez); return $images; } /** * Update all of the images in the posts that have already been imported */ function process_images() { $postsprocessed = $this->images_progress; if ($postsprocessed == 0) { $imagesprocessed = 0; $imagesskipped = 0; } else { $imagesprocessed = $this->images_done; $imagesskipped = $this->images_skipped; } $batchsize = 20; $loadedposts = get_posts( array( 'meta_key' => 'blogger_blog', 'meta_value' => $this->host, 'posts_per_page' => $batchsize, 'offset' => $postsprocessed, 'post_status' => array('draft', 'publish', 'future') )); //Stop if nothing left if (count($loadedposts) == 0) { return true; } foreach($loadedposts as $importedpost) { $importedcontent = $importedpost->post_content; $author = get_post_meta($importedpost->ID, 'blogger_author', true); $img_count = 0; //Count of images for this post foreach($this->get_images($importedcontent) as $lowrez => $highrez) { if (!$this->image_filter($lowrez)) { //Pass null for description so that the default (filename) is used, might be good to use Alt tag instead? $newcontent = $this->import_image($importedpost->ID, $lowrez, $highrez, null, $img_count, $importedcontent, $this->host, $author); if (!is_wp_error($newcontent)) { $importedcontent = $newcontent; $img_count++; } else { $imagesskipped++; } } } $imagesprocessed += $img_count; $importedpost->post_content = $importedcontent; wp_update_post($importedpost); $postsprocessed++; $this->images_done = $imagesprocessed; $this->images_progress = $postsprocessed; $this->images_skipped = $imagesskipped; } unset($loadedposts); return; } function image_urlremap($url, $large) { /* Fix problem urls e.g. change https://lh4.googleusercontent.com/-nt66qhxzDyY/TZOD-RhTYMI/AAAAAAAACd4/Elzm1smRFb4/s800-h/Ski%2520Trip.jpg to to https://lh4.googleusercontent.com/-nt66qhxzDyY/TZOD-RhTYMI/AAAAAAAACd4/Elzm1smRFb4/s800/Ski%2520Trip.jpg Could use a apply_filter here to allow users to add their own tweeks */ $pattern = '/(\/)(s\d*)-h(\/)/i'; $replacement = '$1$2$3'; $img = preg_replace($pattern, $replacement, $url); /* Strip out ? and # on the end of files */ $pattern = '/(.*)[#\?].*/i'; $replacement = '$1'; $img = preg_replace($pattern, $replacement, $img); if ($large) { // For images on blogger we can swap /sXXX/ with for example /s1600/ to get a larger file. // Use a standardised large size so we can control quality vs filesize. $pattern = '/(\/)(s\d*)(\/)/i'; $replacement = '$1s'.Blogger_Importer::LARGE_IMAGE_SIZE. '$3'; $img = preg_replace($pattern, $replacement, $img); } return $img; } function image_filter($url) { // Do we exclude this particular image? // Don't include images that are already loaded onto this site // Could use a apply_filter here to allow users to add their own tweeks return (substr($url, 0, strlen(site_url())) == site_url()); } function import_image($post_id, $lowrez, $highrez, $description, $imgcount, $postcontent, $blogname, $author) { /* Import a new image unless we specifically filter it out or if it has already been downloaded on another page. Based on http://wordpress.stackexchange.com/questions//media-sideload-image-file-name and the tumblr-importer Simple filename cleaning as characters such as +, % cause issues ref: http://wordpress.org/extend/plugins/uploadplus/ It's processing links of a form similar to these as provided by the "get_images" function or If the high resolution (linked) file is not an image then the low resolution version is downloaded. */ $lowrez_old = $lowrez; $highrez_old = $highrez; $highrezispage = false; $lowrez = $this->image_urlremap($lowrez, false); if ($lowrez == '') return new WP_Error('Not an image', $message = __('Lowrez not an image', 'blogger-importer'), $data = array($lowrez_old, $highrez_old)); if ($highrez != '') { $highrez = $this->image_urlremap($highrez, true); } else { $highrez = $this->image_urlremap($lowrez, true); } if (!$att_id = $this->image_exists($lowrez)) { //Option to add a timeout to download_url, but don't use the wp_remote_get timeout as that's much shorter than the default here of 300s $tmp = @download_url($highrez); if (is_wp_error($tmp)) { @unlink($tmp); // clean up, copied this from other examples but how is this supposed to work if $tmp is an error?? //Don't exit as can still try the small image } // If the highrez was not an image then try the lowrex if (!$this->is_image($tmp, $highrez)) { $highrezispage = true; //That image was not valid $tmp = @download_url($lowrez); // Option to add a timeout here if (is_wp_error($tmp)) { @unlink($tmp); // clean up return $tmp; // output wp_error } if (!$this->is_image($tmp, $lowrez)) { @unlink($tmp); // clean up None of items are actually images, for example might be a single pixel, deliberately filtered out or a 404 error? return new WP_Error('No Images', __('None of the images are valid', 'blogger-importer'), $data = array($lowrez_old, $highrez_old)); } } $new_name = preg_replace('/[^A-Za-z0-9._ ]/i', '-', basename($lowrez)); $file_array = array('name' => $new_name, 'tmp_name' => $tmp); if ( empty( $description ) ) { $description = $new_name; } $att_id = media_handle_sideload($file_array, $post_id, $description); if (is_wp_error($att_id)) { @unlink($file_array['tmp_name']); return $att_id; } // Link attachment upto old url, store the author so we can replace it later add_post_meta($att_id, 'blogger_permalink', $lowrez); add_post_meta($att_id, 'blogger_blog', $blogname, true); add_post_meta($att_id, 'blogger_author', $author, true); if ($highrezispage) //Not an image so store so we can link later add_post_meta($att_id, 'blogger_largeimgispage', true); } else { //Image already exists, check if the high rez one was valid last time $tmp = get_post_meta($att_id, 'blogger_largeimgispage', true); if ($tmp == true) $highrezispage = true; } //Always treat picassa webs as image so they get replaced with the new High rez link if (substr($highrez, 0, 27) == 'http://picasaweb.google.com') $highrezispage = false; //Replace the image strings if (!$highrezispage && $highrez_old != '') { $imagesrc = wp_get_attachment_image_src($att_id, 'full'); $highrez_new = reset($imagesrc); $postcontent = str_replace($highrez_old, $highrez_new, $postcontent); } $imagesrc = wp_get_attachment_image_src($att_id, 'medium'); $lowrez_new = reset($imagesrc); $postcontent = str_replace($lowrez_old, $lowrez_new, $postcontent); //Set the first image to be the post thumbnail (zero index) if ($imgcount == 0) { set_post_thumbnail($post_id, $att_id); } //media handle sideload moves the file so there should be no temp file left but cleanup just incase. @unlink($tmp); // incase something goes wrong if ($postcontent == '') { return new WP_Error('Empty Content', __("Attempting to write back empty content", 'blogger-importer'), $data = array($lowrez_old, $highrez_old)); } return $postcontent; } function is_image($file, $filename) { //Is the downloaded file really an image //e.g. it looked like an image from the URL but when downloaded it was something else perhaps a html page //Also filter out tracking images of 1 pixel square //Found that wp_check_filetype_and_ext and wp_match_mime_types was giving false positives $imgstats = @getimagesize($file); if (!$imgstats) { return false; } return (($imgstats[0] > 1) && ($imgstats[1] > 1)); } function image_exists($lowrez) { global $wpdb; return $wpdb->get_var($wpdb->prepare("SELECT ID FROM $wpdb->posts p INNER JOIN $wpdb->postmeta m ON p.ID = m.post_id AND meta_key = 'blogger_permalink' WHERE post_type = 'attachment' AND meta_value = %s LIMIT 0 , 1", $lowrez)); } function process_links() { //Update all of the links in the blog global $wpdb; $postsprocessed = $this->links_progress; if ($postsprocessed == 0) { $linksprocessed = 0; } else { $linksprocessed = $this->links_done; } $batchsize = 20; $oldurlsearch = $this->host; if (substr($oldurlsearch, 0, 3) == 'www.') { $oldurlsearch = substr($oldurlsearch, 3, strlen($oldurlsearch - 3)); } $oldurlsearch = str_replace('.', '\.', $oldurlsearch); $blogspot = stripos($oldurlsearch, '\.blogspot\.'); if ($blogspot) { //Blogspot addresses can be international e.g. myblog.blogspot.com, myblog.blogspot.com.au or myblog.blogspot.co.uk or myblog.blogspot.de both resolve to the same blog. //See http://www.searchenginejournal.com/google-blogger-url-censorship/39724/ $oldurlsearch = substr($oldurlsearch, 0, $blogspot + 12). '[\w\.]{2,6}'; } $loadedposts = get_posts(array('meta_key' => 'blogger_blog', 'meta_value' => $this->host, 'posts_per_page' => $batchsize, 'offset' => $postsprocessed, 'post_status' => array('draft', 'publish', 'future'))); //Stop if nothing left if (count($loadedposts) == 0) { return true; } foreach($loadedposts as $importedpost) { $importedcontent = $importedpost->post_content; $regexp = ']*href=([\"\'`])(https?:\/\/(?:www\.)*'.$oldurlsearch.'\/)([^\" >]*?)\1[^>]*>(.*)<\/a>'; if (preg_match_all("/$regexp/siU", $importedcontent, $matches, PREG_SET_ORDER)) { foreach($matches as $match) { $HostURL = substr($match[2], 0, strlen($match[2]) - 1); //e.g. http://minitemp.blogspot.co.uk $PageURL = '/'.$match[3]; //e.g. '/2011/04/what-happens-if-blog-title-is-really.html' $sql = $wpdb->prepare("SELECT post_id FROM $wpdb->postmeta m inner join $wpdb->posts p on p.id = m.post_id and post_type = 'post' where meta_key = '%s' and meta_value = '%s' ", 'blogger_permalink', $PageURL); $linkpostid = $wpdb->get_var($sql); if ($linkpostid != 0) { $NewURL = get_permalink($linkpostid); } else { // Page not found, update content with just the new domain $NewURL = site_url($PageURL); } $importedcontent = str_replace($HostURL.$PageURL, $NewURL, $importedcontent); $linksprocessed++; } if ($importedcontent == '') { return new WP_Error('Empty Content', __("Attempting to write back empty content")); } $importedpost->post_content = $importedcontent; wp_update_post($importedpost); } $postsprocessed++; //For some reason the intermediate values are not getting written, is it that the options are cached hence not read back? $this->links_done = $linksprocessed; $this->links_progress = $postsprocessed; } unset($loadedposts); return; } function isurlimage($srcurl) { //Process picasaweb links and files that are images if (substr($srcurl, 0, 27) == 'http://picasaweb.google.com') return true; return preg_match('/(?i)\.(jpe?g|png|gif|bmp)$/i', $srcurl); } /** * Parse the atom file * * @param string $file Path to XML file for parsing * @return SimplePie object of the feed */ function parse( $file ) { $data = file_get_contents( $file ); // parse the feed $feed = new SimplePie(); //set_xxxx methods depreciated (and not working?) replaced with get_registry as per docs $reg = $feed->get_registry(); $reg->register('Sanitize', 'Blogger_Importer_Sanitize'); $feed->sanitize = $reg->create('Sanitize'); //Should not really need to do this but there seems to be an issue with the SimplePie class? $reg->register('Item', 'WP_SimplePie_Blog_Item'); $feed->set_raw_data( $data ); $feed->init(); return $feed; } // Display import page title function header() { echo '
'; if ( version_compare( get_bloginfo( 'version' ), '3.8.0', '<' ) ) { screen_icon(); } echo '

' . __( 'Import Blogger', 'blogger-importer' ) . '

'; } // Close div.wrap function footer() { echo '
'; } /** * Display introductory text and file upload form */ function greet() { echo '
'; echo '

'.__( 'Howdy! Upload your Blogger Exported XML file and we’ll import the contents from it into this site.', 'blogger-importer' ).'

'; echo '

'.__( 'Choose an XML file to upload, then click Upload file and import.', 'blogger-importer' ).'

'; wp_import_upload_form( 'admin.php?import=blogger&step=1' ); echo '
'; } /** * Decide if the given meta key maps to information we will want to import * * @param string $key The meta key to check * @return string|bool The key if we do want to import, false if not */ function is_valid_meta_key( $key ) { // skip attachment metadata since we'll regenerate it from scratch // skip _edit_lock as not relevant for import if ( in_array( $key, array( '_wp_attached_file', '_wp_attachment_metadata', '_edit_lock' ) ) ) return false; return $key; } /** * Decide whether or not the importer is allowed to create users. * Default is true, can be filtered via import_allow_create_users * * @return bool True if creating users is allowed */ function allow_create_users() { return apply_filters( 'import_allow_create_users', true ); } /** * Added to http_request_timeout filter to force timeout at 60 seconds during import * @return int 60 */ function bump_request_timeout( $val ) { return 60; } // return the difference in length between two strings function cmpr_strlen( $a, $b ) { return strlen($b) - strlen($a); } } } // class_exists( 'Blogger_Importer' ) function blogger_importer_init() { load_plugin_textdomain( 'blogger-importer', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' ); /** * WordPress Importer object for registering the import callback * @global WP_Import $wp_import */ $GLOBALS['wp_import'] = new Blogger_Importer(); register_importer('blogger', __('Blogger', 'blogger-importer'), __('Import posts, comments, and categories from a Blogger blog and migrate authors to WordPress users.', 'blogger-importer'), array( $GLOBALS['wp_import'], 'dispatch' ) ); } add_action( 'admin_init', 'blogger_importer_init' );