5 var $lump_authors = false;
8 // Shows the welcome screen and the magic iframe.
10 $title = __('Import Old Blogger');
11 $welcome = __('Howdy! This importer allows you to import posts and comments from your Old Blogger account into your WordPress blog.');
12 $noiframes = __('This feature requires iframe support.');
13 $warning = __('This will delete everything saved by the Blogger importer except your posts and comments. Are you sure you want to do this?');
14 $reset = __('Reset this importer');
15 $incompat = __('Your web server is not properly configured to use this importer. Please enable the CURL extension for PHP and then reload this page.');
17 echo "<div class='wrap'><h2>$title</h2><p>$welcome</p>";
18 echo "<p>" . __('Please note that this importer <em>does not work with Blogger (using your Google account)</em>.') . "</p>";
19 if ( function_exists('curl_init') )
20 echo "<iframe src='admin.php?import=blogger&noheader=true' height='350px' width = '99%'>$noiframes</iframe><p><a href='admin.php?import=blogger&restart=true&noheader=true' onclick='return confirm(\"$warning\")'>$reset</a></p>";
22 echo "<p>$incompat</p>";
26 // Deletes saved data and redirect.
28 delete_option('import-blogger');
29 wp_redirect("admin.php?import=blogger");
33 // Generates a string that will make the page reload in a specified interval.
34 function refresher($msec) {
36 return "<html><head><script type='text/javascript'>window.onload=setTimeout('window.location.reload()', $msec);</script>\n</head>\n<body>\n";
38 return "<html><head><script type='text/javascript'>window.onload=window.location.reload();</script>\n</head>\n<body>\n";
41 // Returns associative array of code, header, cookies, body. Based on code from php.net.
42 function parse_response($this_response) {
43 // Split response into header and body sections
44 list($response_headers, $response_body) = explode("\r\n\r\n", $this_response, 2);
45 $response_header_lines = explode("\r\n", $response_headers);
47 // First line of headers is the HTTP response code
48 $http_response_line = array_shift($response_header_lines);
49 if(preg_match('@^HTTP/[0-9]\.[0-9] ([0-9]{3})@',$http_response_line, $matches)) { $response_code = $matches[1]; }
51 // put the rest of the headers in an array
52 $response_header_array = array();
53 foreach($response_header_lines as $header_line) {
54 list($header,$value) = explode(': ', $header_line, 2);
55 $response_header_array[$header] .= $value."\n";
58 $cookie_array = array();
59 $cookies = explode("\n", $response_header_array["Set-Cookie"]);
60 foreach($cookies as $this_cookie) { array_push($cookie_array, "Cookie: ".$this_cookie); }
62 return array("code" => $response_code, "header" => $response_header_array, "cookies" => $cookie_array, "body" => $response_body);
65 // Prints a form for the user to enter Blogger creds.
66 function login_form($text='') {
67 echo '<h1>' . __('Log in to Blogger') . "</h1>\n$text\n";
68 echo '<form method="post" action="admin.php?import=blogger&noheader=true&step=0"><table><tr><td>' . __('Username') . ':</td><td><input type="text" name="user" /></td></tr><tr><td>' . __('Password') . ':</td><td><input type="password" name="pass" /></td><td><input type="submit" value="' . __('Start') . '" /></td></tr></table></form>';
72 // Sends creds to Blogger, returns the session cookies an array of headers.
73 function login_blogger($user, $pass) {
74 $_url = 'http://www.blogger.com/login.do';
75 $params = "username=$user&password=$pass";
77 curl_setopt($ch, CURLOPT_POST,1);
78 curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
79 curl_setopt($ch, CURLOPT_URL,$_url);
80 curl_setopt($ch, CURLOPT_USERAGENT, 'Blogger Exporter');
81 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
82 curl_setopt($ch, CURLOPT_HEADER,1);
83 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
84 $response = curl_exec ($ch);
86 $response = $this->parse_response($response);
90 return $response['cookies'];
93 // Requests page from Blogger, returns the response array.
94 function get_blogger($url, $header = '', $user=false, $pass=false) {
96 if ($user && $pass) curl_setopt($ch, CURLOPT_USERPWD,"{$user}:{$pass}");
97 curl_setopt($ch, CURLOPT_URL,$url);
98 curl_setopt($ch, CURLOPT_TIMEOUT, 10);
99 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
100 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
101 curl_setopt($ch, CURLOPT_USERAGENT, 'Blogger Exporter');
102 curl_setopt($ch, CURLOPT_HEADER,1);
103 if (is_array($header)) curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
104 $response = curl_exec ($ch);
106 $response = $this->parse_response($response);
107 $response['url'] = $url;
109 if (curl_errno($ch)) {
110 print curl_error($ch);
118 // Posts data to Blogger, returns response array.
119 function post_blogger($url, $header = false, $paramary = false, $parse=true) {
121 if ( is_array($paramary) ) {
122 foreach($paramary as $key=>$value)
123 if($key && $value != '')
124 $params.=$key."=".urlencode(stripslashes($value))."&";
126 if ($user && $pass) $params .= "username=$user&password=$pass";
127 $params = trim($params,'&');
129 curl_setopt($ch, CURLOPT_POST,1);
130 curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
131 if ($user && $pass) curl_setopt($ch, CURLOPT_USERPWD,"{$user}:{$pass}");
132 curl_setopt($ch, CURLOPT_URL,$url);
133 curl_setopt($ch, CURLOPT_USERAGENT, 'Blogger Exporter');
134 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
135 curl_setopt($ch, CURLOPT_HEADER,$parse);
136 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
137 if ($header) curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
138 $response = curl_exec ($ch);
141 $response = $this->parse_response($response);
142 $response['url'] = $url;
149 // Prints the list of blogs for import.
150 function show_blogs() {
152 echo '<h1>' . __('Selecting a Blog') . "</h1>\n<ul>";
153 foreach ( $this->import['blogs'] as $blog ) {
154 if (9 == $blog['nextstep']) $status = "100%";
155 elseif (8 == $blog['nextstep']) $status = "90%";
156 elseif (7 == $blog['nextstep']) $status = "82.5%";
157 elseif (6 == $blog['nextstep']) $status = "75%";
158 elseif (5 == $blog['nextstep']) $status = "57%";
159 elseif (4 == $blog['nextstep']) $status = "28%";
160 elseif (3 == $blog['nextstep']) $status = "14%";
162 echo "\t<li><a href='admin.php?import=blogger&noheader=true&blog={$blog['id']}'>{$blog['title']}</a> $status</li>\n";
168 function publish_blogger($i, $text) {
169 $head = $this->refresher(2000) . "<h1>$text</h1>\n";
170 if ( ! strstr($this->import['blogs'][$_GET['blog']]['publish'][$i], 'http') ) {
171 // First call. Start the publish process with a fresh set of cookies.
172 $this->import['cookies'] = $this->login_blogger($this->import['user'], $this->import['pass']);
173 update_option('import-blogger', $this->import);
174 $paramary = array('blogID' => $_GET['blog'], 'all' => '1', 'republishAll' => 'Republish Entire Blog', 'publish' => '1', 'redirectUrl' => "/publish.do?blogID={$_GET['blog']}&inprogress=true");
176 $response = $this->post_blogger("http://www.blogger.com/publish.do?blogID={$_GET['blog']}", $this->import['cookies'], $paramary);
177 if ( $response['code'] == '302' ) {
178 $url = str_replace('publish.g', 'publish-body.g', $response['header']['Location']);
179 $this->import['blogs'][$_GET['blog']]['publish'][$i] = $url;
180 update_option('import-blogger', $this->import);
181 $response = $this->get_blogger($url, $this->import['cookies']);
182 preg_match('#<p class="progressIndicator">.*</p>#U', $response['body'], $matches);
183 $progress = $matches[0];
184 die($head . $progress);
186 $this->import['blogs'][$_GET['blog']]['publish'][$i] = false;
187 update_option('import-blogger', $this->import);
191 // Subsequent call. Keep checking status until Blogger reports publish complete.
192 $url = $this->import['blogs'][$_GET['blog']]['publish'][$i];
193 $response = $this->get_blogger($url, $this->import['cookies']);
194 if ( preg_match('#<p class="progressIndicator">.*</p>#U', $response['body'], $matches) ) {
195 $progress = $matches[0];
196 if ( strstr($progress, '100%') ) {
197 $this->set_next_step($i);
198 $progress .= '<p>'.__('Moving on...').'</p>';
200 die($head . $progress);
202 $this->import['blogs'][$_GET['blog']]['publish'][$i] = false;
203 update_option('import-blogger', $this->import);
204 die("$head<p>" . __('Trying again...') . '</p>');
209 // Sets next step, saves options
210 function set_next_step($step) {
211 $this->import['blogs'][$_GET['blog']]['nextstep'] = $step;
212 update_option('import-blogger', $this->import);
215 // Redirects to next step
216 function do_next_step() {
217 wp_redirect("admin.php?import=blogger&noheader=true&blog={$_GET['blog']}");
221 // Step 0: Do Blogger login, get blogid/title pairs.
222 function do_login() {
223 if ( ( ! $this->import['user'] && ! is_array($this->import['cookies']) ) ) {
224 // The user must provide a Blogger username and password.
225 if ( ! ( $_POST['user'] && $_POST['pass'] ) ) {
226 $this->login_form(__('The script will log into your Blogger account, change some settings so it can read your blog, and restore the original settings when it\'s done. Here\'s what you do:').'</p><ol><li>'.__('Back up your Blogger template.').'</li><li>'.__('Back up any other Blogger settings you might need later.').'</li><li>'.__('Log out of Blogger').'</li><li>'.__('Log in <em>here</em> with your Blogger username and password.').'</li><li>'.__('On the next screen, click one of your Blogger blogs.').'</li><li>'.__('Do not close this window or navigate away until the process is complete.').'</li></ol>');
229 // Try logging in. If we get an array of cookies back, we at least connected.
230 $this->import['cookies'] = $this->login_blogger($_POST['user'], $_POST['pass']);
231 if ( !is_array( $this->import['cookies'] ) ) {
232 $this->login_form(__('Login failed. Please enter your credentials again.'));
235 // Save the password so we can log the browser in when it's time to publish.
236 $this->import['pass'] = $_POST['pass'];
237 $this->import['user'] = $_POST['user'];
239 // Get the Blogger welcome page and scrape the blog numbers and names from it
240 $response = $this->get_blogger('http://www.blogger.com/home', $this->import['cookies']);
241 if (! stristr($response['body'], 'signed in as') ) $this->login_form(__('Login failed. Please re-enter your username and password.'));
243 preg_match_all('#posts\.g\?blogID=(\d+)">([^<]+)</a>#U', $response['body'], $blogsary);
244 if ( ! count( $blogsary[1] < 1 ) )
245 die(__('No blogs found for this user.'));
246 $this->import['blogs'] = array();
247 $template = '<MainPage><br /><br /><br /><p>'.__('Are you looking for %title%? It is temporarily out of service. Please try again in a few minutes. Meanwhile, discover <a href="http://wordpress.org/">a better blogging tool</a>.').'</p><BloggerArchives><a class="archive" href="<$BlogArchiveURL$>"><$BlogArchiveName$></a><br /></BloggerArchives></MainPage><ArchivePage><Blogger><wordpresspost><$BlogItemDateTime$>|W|P|<$BlogItemAuthorNickname$>|W|P|<$BlogItemBody$>|W|P|<$BlogItemNumber$>|W|P|<$BlogItemTitle$>|W|P|<$BlogItemAuthorEmail$><BlogItemCommentsEnabled><BlogItemComments><wordpresscomment><$BlogCommentDateTime$>|W|P|<$BlogCommentAuthor$>|W|P|<$BlogCommentBody$></BlogItemComments></BlogItemCommentsEnabled></Blogger></ArchivePage>';
248 foreach ( $blogsary[1] as $key => $id ) {
249 // Define the required Blogger options.
251 'blog-options-basic' => false,
252 'blog-options-archiving' => array('archiveFrequency' => 'm'),
253 'blog-publishing' => array('publishMode'=>'0', 'blogID' => "$id", 'subdomain' => mt_rand().mt_rand(), 'pingWeblogs' => 'false'),
254 'blog-formatting' => array('timeStampFormat' => '0', 'encoding'=>'UTF-8', 'convertLineBreaks'=>'false', 'floatAlignment'=>'false'),
255 'blog-comments' => array('commentsTimeStampFormat' => '0'),
256 'template-edit' => array( 'templateText' => str_replace('%title%', trim($blogsary[2][$key]), $template) )
259 // Build the blog options array template
260 foreach ($blog_opts as $blog_opt => $modify)
261 $new_opts["$blog_opt"] = array('backup'=>false, 'modify' => $modify, 'error'=>false);
263 $this->import['blogs']["$id"] = array(
265 'title' => trim($blogsary[2][$key]),
266 'options' => $new_opts,
268 'publish_cookies' => false,
269 'published' => false,
271 'lump_authors' => false,
272 'newusers' => array(),
276 update_option('import-blogger', $this->import);
277 wp_redirect("admin.php?import=blogger&noheader=true&step=1");
282 // Step 1: Select one of the blogs belonging to the user logged in.
283 function select_blog() {
284 if ( is_array($this->import['blogs']) ) {
292 // Step 2: Backup the Blogger options pages, updating some of them.
293 function backup_settings() {
294 $output.= '<h1>'.__('Backing up Blogger options')."</h1>\n";
296 foreach ($this->import['blogs'][$_GET['blog']]['options'] as $blog_opt => $optary) {
297 if ( $blog_opt == $_GET['form'] ) {
298 // Save the posted form data
299 $this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['backup'] = $_POST;
300 update_option('import-blogger',$this->import);
302 // Post the modified form data to Blogger
303 if ( $optary['modify'] ) {
304 $posturl = "http://www.blogger.com/{$blog_opt}.do";
305 $headers = array_merge($this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['cookies'], $this->import['cookies']);
306 if ( 'blog-publishing' == $blog_opt ) {
307 if ( $_POST['publishMode'] > 0 ) {
308 $response = $this->get_blogger("http://www.blogger.com/blog-publishing.g?blogID={$_GET['blog']}&publishMode=0", $headers);
309 if ( $response['code'] >= 400 )
310 die('<h2>'.__('Failed attempt to change publish mode from FTP to BlogSpot.').'</h2><pre>' . addslashes(print_r($headers, 1)) . addslashes(print_r($response, 1)) . '</pre>');
311 $this->import['blogs'][$_GET['blog']]['url'] = 'http://' . $optary['modify']['subdomain'] . '.blogspot.com/';
314 $this->import['blogs'][$_GET['blog']]['url'] = 'http://' . $_POST['subdomain'] . '.blogspot.com/';
315 update_option('import-blogger', $this->import);
316 $output .= "<del><p>$blog_opt</p></del>\n";
319 $paramary = $optary['modify'];
321 $paramary = array_merge($_POST, $optary['modify']);
323 $response = $this->post_blogger($posturl, $headers, $paramary);
324 if ( $response['code'] >= 400 || strstr($response['body'], 'There are errors on this form') )
325 die('<p>'.__('Error on form submission. Retry or reset the importer.').'</p>' . addslashes(print_r($response, 1)));
327 $output .= "<del><p>$blog_opt</p></del>\n";
328 } elseif ( is_array($this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['backup']) ) {
329 // This option set has already been backed up.
330 $output .= "<del><p>$blog_opt</p></del>\n";
331 } elseif ( ! $form ) {
332 // This option page needs to be downloaded and given to the browser for submission back to this script.
333 $response = $this->get_blogger("http://www.blogger.com/{$blog_opt}.g?blogID={$_GET['blog']}", $this->import['cookies']);
334 $this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['cookies'] = $response['cookies'];
335 update_option('import-blogger',$this->import);
336 $body = $response['body'];
337 $body = preg_replace("|\<!DOCTYPE.*\<body[^>]*>|ms","",$body);
338 $body = preg_replace("|/?{$blog_opt}.do|","admin.php?import=blogger&noheader=true&step=2&blog={$_GET['blog']}&form={$blog_opt}",$body);
339 $body = str_replace("name='submit'","name='supermit'",$body);
340 $body = str_replace('name="submit"','name="supermit"',$body);
341 $body = str_replace('</body>','',str_replace('</html>','',$body));
342 $form = "<div style='height:0px;width:0px;overflow:hidden;'>";
344 $form.= "</div><script type='text/javascript'>forms=document.getElementsByTagName('form');for(i=0;i<forms.length;i++){if(forms[i].action.search('{$blog_opt}')){forms[i].submit();break;}}</script>";
345 $output.= '<p>'.sprintf(__('<strong>%s</strong> in progress, please wait...'), $blog_opt)."</p>\n";
347 $output.= "<p>$blog_opt</p>\n";
351 die($output . $form);
353 $this->set_next_step(4);
354 $this->do_next_step();
357 // Step 3: Cancelled :-)
359 // Step 4: Publish with the new template and settings.
360 function publish_blog() {
361 $this->publish_blogger(5, __('Publishing with new template and options'));
364 // Step 5: Get the archive URLs from the new blog.
365 function get_archive_urls() {
366 $bloghtml = $this->get_blogger($this->import['blogs'][$_GET['blog']]['url']);
367 if (! strstr($bloghtml['body'], '<a class="archive"') )
368 die(__('Your Blogger blog did not take the new template or did not respond.'));
369 preg_match_all('#<a class="archive" href="([^"]*)"#', $bloghtml['body'], $archives);
370 foreach ($archives[1] as $archive) {
371 $this->import['blogs'][$_GET['blog']]['archives'][$archive] = false;
373 $this->set_next_step(6);
374 $this->do_next_step();
377 // Step 6: Get each monthly archive, import it, mark it done.
378 function get_archive() {
380 $output = '<h2>'.__('Importing Blogger archives into WordPress').'</h2>';
382 $post_array = $posts = array();
383 foreach ( $this->import['blogs'][$_GET['blog']]['archives'] as $url => $status ) {
384 $archivename = substr(basename($url),0,7);
385 if ( $status || $did_one ) {
389 // Import the selected month
391 $skippedpostcount = 0;
393 $skippedcommentcount = 0;
394 $status = __('in progress...');
395 $this->import['blogs'][$_GET['blog']]['archives']["$url"] = $status;
396 update_option('import-blogger', $import);
397 $archive = $this->get_blogger($url);
398 if ( $archive['code'] > 200 )
400 $posts = explode('<wordpresspost>', $archive['body']);
401 for ($i = 1; $i < count($posts); $i = $i + 1) {
402 $postparts = explode('<wordpresscomment>', $posts[$i]);
403 $postinfo = explode('|W|P|', $postparts[0]);
404 $post_date = $postinfo[0];
405 $post_content = $postinfo[2];
406 // Don't try to re-use the original numbers
407 // because the new, longer numbers are too
408 // big to handle as ints.
409 //$post_number = $postinfo[3];
410 $post_title = ( $postinfo[4] != '' ) ? $postinfo[4] : $postinfo[3];
411 $post_author_name = $wpdb->escape(trim($postinfo[1]));
412 $post_author_email = $postinfo[5] ? $postinfo[5] : 'user@wordpress.org';
414 if ( $this->lump_authors ) {
415 // Ignore Blogger authors. Use the current user_ID for all posts imported.
416 $post_author = $GLOBALS['user_ID'];
418 // Add a user for each new author encountered.
419 if (! username_exists($post_author_name) ) {
420 $user_login = $wpdb->escape($post_author_name);
421 $user_email = $wpdb->escape($post_author_email);
422 $user_password = substr(md5(uniqid(microtime())), 0, 6);
423 $result = wp_create_user( $user_login, $user_password, $user_email );
424 $status.= sprintf(__('Registered user <strong>%s</strong>.'), $user_login);
425 $this->import['blogs'][$_GET['blog']]['newusers'][] = $user_login;
427 $userdata = get_userdatabylogin( $post_author_name );
428 $post_author = $userdata->ID;
430 $post_date = explode(' ', $post_date);
431 $post_date_Ymd = explode('/', $post_date[0]);
432 $postyear = $post_date_Ymd[2];
433 $postmonth = zeroise($post_date_Ymd[0], 2);
434 $postday = zeroise($post_date_Ymd[1], 2);
435 $post_date_His = explode(':', $post_date[1]);
436 $posthour = zeroise($post_date_His[0], 2);
437 $postminute = zeroise($post_date_His[1], 2);
438 $postsecond = zeroise($post_date_His[2], 2);
440 if (($post_date[2] == 'PM') && ($posthour != '12'))
441 $posthour = $posthour + 12;
442 else if (($post_date[2] == 'AM') && ($posthour == '12'))
445 $post_date = "$postyear-$postmonth-$postday $posthour:$postminute:$postsecond";
447 $post_content = addslashes($post_content);
448 $post_content = str_replace(array('<br>','<BR>','<br/>','<BR/>','<br />','<BR />'), "\n", $post_content); // the XHTML touch... ;)
450 $post_title = addslashes($post_title);
452 $post_status = 'publish';
454 if ( $ID = post_exists($post_title, '', $post_date) ) {
455 $post_array[$i]['ID'] = $ID;
458 $post_array[$i]['post'] = compact('post_author', 'post_content', 'post_title', 'post_category', 'post_author', 'post_date', 'post_status');
459 $post_array[$i]['comments'] = false;
462 // Import any comments attached to this post.
464 for ($j = 1; $j < count($postparts); $j = $j + 1) {
465 $commentinfo = explode('|W|P|', $postparts[$j]);
466 $comment_date = explode(' ', $commentinfo[0]);
467 $comment_date_Ymd = explode('/', $comment_date[0]);
468 $commentyear = $comment_date_Ymd[2];
469 $commentmonth = zeroise($comment_date_Ymd[0], 2);
470 $commentday = zeroise($comment_date_Ymd[1], 2);
471 $comment_date_His = explode(':', $comment_date[1]);
472 $commenthour = zeroise($comment_date_His[0], 2);
473 $commentminute = zeroise($comment_date_His[1], 2);
474 $commentsecond = '00';
475 if (($comment_date[2] == 'PM') && ($commenthour != '12'))
476 $commenthour = $commenthour + 12;
477 else if (($comment_date[2] == 'AM') && ($commenthour == '12'))
479 $comment_date = "$commentyear-$commentmonth-$commentday $commenthour:$commentminute:$commentsecond";
480 $comment_author = addslashes(strip_tags($commentinfo[1]));
481 if ( strpos($commentinfo[1], 'a href') ) {
482 $comment_author_parts = explode('"', htmlentities($commentinfo[1]));
483 $comment_author_url = $comment_author_parts[1];
484 } else $comment_author_url = '';
485 $comment_content = $commentinfo[2];
486 $comment_content = str_replace(array('<br>','<BR>','<br/>','<BR/>','<br />','<BR />'), "\n", $comment_content);
487 $comment_approved = 1;
488 if ( comment_exists($comment_author, $comment_date) ) {
489 $skippedcommentcount++;
491 $comment = compact('comment_author', 'comment_author_url', 'comment_date', 'comment_content', 'comment_approved');
492 $post_array[$i]['comments'][$j] = wp_filter_comment($comment);
499 if ( count($post_array) ) {
501 foreach($post_array as $post) {
502 if ( ! $comment_post_ID = $post['ID'] )
503 $comment_post_ID = wp_insert_post($post['post']);
504 if ( $post['comments'] ) {
505 foreach ( $post['comments'] as $comment ) {
506 $comment['comment_post_ID'] = $comment_post_ID;
507 wp_insert_comment($comment);
512 $status = sprintf(__('%s post(s) parsed, %s skipped...'), $postcount, $skippedpostcount).' '.
513 sprintf(__('%s comment(s) parsed, %s skipped...'), $commentcount, $skippedcommentcount).' '.
514 ' <strong>'.__('Done').'</strong>';
515 $import = $this->import;
516 $import['blogs'][$_GET['blog']]['archives']["$url"] = $status;
517 update_option('import-blogger', $import);
520 $output.= "<p>$archivename $status</p>\n";
523 $this->set_next_step(7);
524 die( $this->refresher(1000) . $output );
527 // Step 7: Restore the backed-up settings to Blogger
528 function restore_settings() {
529 $output = '<h1>'.__('Restoring your Blogger options')."</h1>\n";
531 // Restore options in reverse order.
532 if ( ! $this->import['reversed'] ) {
533 $this->import['blogs'][$_GET['blog']]['options'] = array_reverse($this->import['blogs'][$_GET['blog']]['options'], true);
534 $this->import['reversed'] = true;
535 update_option('import-blogger', $this->import);
537 foreach ( $this->import['blogs'][$_GET['blog']]['options'] as $blog_opt => $optary ) {
539 $output .= "<p>$blog_opt</p>\n";
540 } elseif ( $optary['restored'] || ! $optary['modify'] ) {
541 $output .= "<p><del>$blog_opt</del></p>\n";
543 $posturl = "http://www.blogger.com/{$blog_opt}.do";
544 $headers = array_merge($this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['cookies'], $this->import['cookies']);
545 if ( 'blog-publishing' == $blog_opt) {
546 if ( $optary['backup']['publishMode'] > 0 ) {
547 $response = $this->get_blogger("http://www.blogger.com/blog-publishing.g?blogID={$_GET['blog']}&publishMode={$optary['backup']['publishMode']}", $headers);
549 if ( $response['code'] >= 400 )
550 die('<h1>'.__('Error restoring publishMode').'</h1><p>'.__('Please tell the devs.').'</p>' . addslashes(print_r($response, 1)) );
553 if ( $optary['backup'] != $optary['modify'] ) {
554 $response = $this->post_blogger($posturl, $headers, $optary['backup']);
555 if ( $response['code'] >= 400 || strstr($response['body'], 'There are errors on this form') ) {
556 $this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['error'] = true;
557 update_option('import-blogger', $this->import);
558 $output .= sprintf(__('%s failed. Trying again.'), "<p><strong>$blog_opt</strong> ").'</p>';
560 $this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['restored'] = true;
561 update_option('import-blogger', $this->import);
562 $output .= sprintf(__('%s restored.'), "<p><strong>$blog_opt</strong> ").'</p>';
570 die( $this->refresher(1000) . $output );
571 } elseif ( $this->import['blogs'][$_GET['blog']]['options']['blog-publishing']['backup']['publishMode'] > 0 ) {
572 $this->set_next_step(9);
574 $this->set_next_step(8);
577 $this->do_next_step();
580 // Step 8: Republish, all back to normal
581 function republish_blog() {
582 $this->publish_blogger(9, __('Publishing with original template and options'));
585 // Step 9: Congratulate the user
586 function congrats() {
587 echo '<h1>'.__('Congratulations!').'</h1><p>'.__('Now that you have imported your Blogger blog into WordPress, what are you going to do? Here are some suggestions:').'</p><ul><li>'.__('That was hard work! Take a break.').'</li>';
588 if ( count($this->import['blogs']) > 1 )
589 echo '<li>'.__('In case you haven\'t done it already, you can import the posts from your other blogs:'). $this->show_blogs() . '</li>';
590 if ( $n = count($this->import['blogs'][$_GET['blog']]['newusers']) )
591 echo '<li>'.sprintf(__('Go to <a href="%s" target="%s">Authors & Users</a>, where you can modify the new user(s) or delete them. If you want to make all of the imported posts yours, you will be given that option when you delete the new authors.'), 'users.php', '_parent').'</li>';
592 echo '<li>'.__('For security, click the link below to reset this importer. That will clear your Blogger credentials and options from the database.').'</li>';
596 // Figures out what to do, then does it.
598 if ( $_GET['restart'] == 'true' ) {
602 if ( isset($_GET['noheader']) ) {
603 header('Content-Type: text/html; charset=utf-8');
605 $this->import = get_option('import-blogger');
607 if ( false === $this->import ) {
609 } elseif ( isset($_GET['step']) ) {
610 $step = (int) $_GET['step'];
611 } elseif ( isset($_GET['blog']) && isset($this->import['blogs'][$_GET['blog']]['nextstep']) ) {
612 $step = $this->import['blogs'][$_GET['blog']]['nextstep'];
613 } elseif ( is_array($this->import['blogs']) ) {
618 //echo "Step $step.";
619 //die('<pre>'.print_r($this->import,1).'</pre');
625 $this->select_blog();
628 $this->backup_settings();
631 $this->wait_for_blogger();
634 $this->publish_blog();
637 $this->get_archive_urls();
640 $this->get_archive();
643 $this->restore_settings();
646 $this->republish_blog();
659 function Blogger_Import() {
660 // This space intentionally left blank.
664 $blogger_import = new Blogger_Import();
666 register_importer('blogger', __('Old Blogger'), __('Import <strong>posts and comments</strong> from your Old Blogger account'), array ($blogger_import, 'start'));