Changeset 2880 for trunk/wp-admin/import/blogger.php
- Timestamp:
- 09/15/2005 11:37:54 PM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/wp-admin/import/blogger.php
r2800 r2880 1 <?php 2 3 class Blogger_Import { 4 5 var $import = array(); 6 var $template = '<br /> 7 <br /> 8 <br /> 9 <MainPage> 10 <p>Are you looking for %title%? It is temporarily out of service. Please try again in an hour. Meanwhile, discover <a href="http://wordpress.org">a better blogging tool</a>.</p> 11 <BloggerArchives> 12 <a class="archive" href="<$BlogArchiveURL$>"><$BlogArchiveName$></a><br /> 13 </BloggerArchives> 14 </MainPage> 15 <ArchivePage> 16 <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> 17 </ArchivePage>'; 18 19 // Shows the welcome screen and the magic iframe. 20 function greet() { 21 echo '<div class="wrap">'; 22 echo '<h2>'.__('Import Blogger').'</h2>'; 23 _e("<p>Howdy! This importer allows you to import posts and comments from your Blogger account into your WordPress blog.</p> 24 <p>Before you get started, you may want to back up your Blogger template by copying and pasting it into a text file on your computer. This script has to modify your template and other Blogger settings so it can get your posts and comments. It should restore everything afterwards but if you have put a lot of work into your template, it would be a good idea to make your own backup first.</p> 25 <p>When you are ready to begin, enter your Blogger username and password below and click Start. Do not close this window until the process is complete.</p>"); 26 echo "<iframe src='admin.php?import=blogger&noheader=true' height='350px' width = '99%'></iframe>"; 27 echo "<p><a href='admin.php?import=blogger&restart=true&noheader=true' onclick='return confirm(\"This will delete everything saved by the Blogger importer. Are you sure you want to do this?\")'>Reset this importer</a></p>"; 28 echo '</div>'; 29 } 30 31 // Deletes saved data and redirect. 32 function restart() { 33 delete_option('import-blogger'); 34 header("Location: admin.php?import=blogger"); 35 die(); 36 } 37 38 // Generates a string that will make the page reload in a specified interval. 39 function refresher($msec) { 40 return "<html><head><script type='text/javascript'>window.onload=setInterval('window.location.reload()', $msec);</script>\n</head>\n<body>"; 41 } 42 43 // Returns associative array of code, header, cookies, body. Based on code from php.net. 44 function parse_response($this_response) { 45 // Split response into header and body sections 46 list($response_headers, $response_body) = explode("\r\n\r\n", $this_response, 2); 47 $response_header_lines = explode("\r\n", $response_headers); 48 49 // First line of headers is the HTTP response code 50 $http_response_line = array_shift($response_header_lines); 51 if(preg_match('@^HTTP/[0-9]\.[0-9] ([0-9]{3})@',$http_response_line, $matches)) { $response_code = $matches[1]; } 52 53 // put the rest of the headers in an array 54 $response_header_array = array(); 55 foreach($response_header_lines as $header_line) { 56 list($header,$value) = explode(': ', $header_line, 2); 57 $response_header_array[$header] .= $value."\n"; 58 } 59 60 $cookie_array = array(); 61 $cookies = explode("\n", $response_header_array["Set-Cookie"]); 62 foreach($cookies as $this_cookie) { array_push($cookie_array, "Cookie: ".$this_cookie); } 63 64 return array("code" => $response_code, "header" => $response_header_array, "cookies" => $cookie_array, "body" => $response_body); 65 } 66 67 // Prints a form for the user to enter Blogger creds. 68 function login_form($text='') { 69 echo "<h1>Log in to Blogger</h1>\n<p>$text</p>\n"; 70 die("<form method='post' action='admin.php?import=blogger&noheader=true&step=0'><input type='text' name='user' /><input type='password' name='pass' /><input type='submit' value='Start' /></form>"); 71 } 72 73 // Sends creds to Blogger, returns the session cookies an array of headers. 74 function login_blogger($user, $pass) { 75 $_url = 'http://www.blogger.com/login.do'; 76 $params = "username=$user&password=$pass"; 77 $ch = curl_init(); 78 curl_setopt($ch, CURLOPT_POST,1); 79 curl_setopt($ch, CURLOPT_POSTFIELDS,$params); 80 curl_setopt($ch, CURLOPT_URL,$_url); 81 curl_setopt($ch, CURLOPT_USERAGENT, 'Developing Blogger Exporter'); 82 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); 83 curl_setopt($ch, CURLOPT_HEADER,1); 84 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 85 $response = curl_exec ($ch); 86 87 $response = $this->parse_response($response); 88 89 return $response['cookies']; 90 } 91 92 // Requests page from Blogger, returns the response array. 93 function get_blogger($url, $header = '', $user=false, $pass=false) { 94 $ch = curl_init(); 95 if ($user && $pass) curl_setopt($ch, CURLOPT_USERPWD,"{$user}:{$pass}"); 96 curl_setopt($ch, CURLOPT_URL,$url); 97 curl_setopt($ch, CURLOPT_TIMEOUT, 10); 98 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 99 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 100 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 101 curl_setopt($ch, CURLOPT_HEADER,1); 102 if (is_array($header)) curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 103 $response = curl_exec ($ch); 104 105 $response = $this->parse_response($response); 106 $response['url'] = $url; 107 108 if (curl_errno($ch)) { 109 print curl_error($ch); 110 } else { 111 curl_close($ch); 112 } 113 114 return $response; 115 } 116 117 // Posts data to Blogger, returns response array. 118 function post_blogger($url, $header = false, $paramary = false, $parse=true) { 119 $params = ''; 120 if ( is_array($paramary) ) { 121 foreach($paramary as $key=>$value) 122 if($key && $value != '') 123 $params.=$key."=".urlencode(stripslashes($value))."&"; 124 } 125 if ($user && $pass) $params .= "username=$user&password=$pass"; 126 $params = trim($params,'&'); 127 //echo addslashes(print_r(array('url'=>$url,'header'=>$header,'params'=>$params),1)); 128 $ch = curl_init(); 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, 'Developing 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); 139 140 if ($parse) { 141 $response = $this->parse_response($response); 142 $response['url'] = $url; 143 return $response; 144 } 145 146 return $response; 147 } 148 149 // Prints the list of blogs for import. 150 function show_blogs() { 151 global $import; 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%"; 161 else $status = "0%"; 162 echo "\t<li><a href='admin.php?import=blogger&noheader=true&blog={$blog['id']}'>{$blog['title']}</a> $status</li>\n"; 163 } 164 die("</ul>\n"); 165 } 166 167 // Publishes. 168 function publish_blogger($i) { 169 if ( ! $this->import['blogs'][$_GET['blog']]['publish'][$i] ) { 170 // First call. Start the publish process. 171 $paramary = array('blogID' => $_GET['blog'], 'all' => '1', 'republishAll' => 'Republish Entire Blog', 'publish' => '1', 'redirectUrl' => "/publish.do?blogID={$_GET['blog']}&inprogress=true"); 172 $response = $this->post_blogger("http://www.blogger.com/publish.do?blogID={$_GET['blog']}", $this->import['cookies'], $paramary); 173 if ( $response['code'] == '302' ) { 174 $url = str_replace('publish.g', 'publish-body.g', $response['header']['Location']); 175 $this->import['blogs'][$_GET['blog']]['publish'][$i] = $url; 176 update_option('import-blogger', $this->import); 177 $response = $this->get_blogger($url, $this->import['cookies']); 178 if ( preg_match('#<p class="progressIndicator">.*</p>#U', $response['body'], $matches) ) { 179 $progress = $matches[0]; 180 die($progress); 181 } else { 182 echo "matches:<pre>" . print_r($matches,1) . "</pre>\n"; 183 } 184 } else { 185 echo "<h1>Publish error: No 302</h1><p>Please tell the devs.</p><pre>" . addslashes(print_r($response,1)) . "</pre>\n"; 186 } 187 die(); 188 } else { 189 // Subsequent call. Keep checking status until Blogger reports publish complete. 190 $url = $this->import['blogs'][$_GET['blog']]['publish'][$i]; 191 $response = $this->get_blogger($url, $this->import['cookies']); 192 if ( preg_match('#<p class="progressIndicator">.*</p>#U', $response['body'], $matches) ) { 193 $progress = $matches[0]; 194 if ( strstr($progress, '100%') ) 195 $this->set_next_step($i); 196 die($progress); 197 } else { 198 echo "<h1>Publish error: No matches</h1><p>Please tell the devs.</p><pre>" . print_r($matches,1) . "</pre>\n"; 199 } 200 } 201 } 202 203 // Sets next step, saves options 204 function set_next_step($step) { 205 $this->import['blogs'][$_GET['blog']]['nextstep'] = $step; 206 update_option('import-blogger', $this->import); 207 } 208 209 // Redirects to next step 210 function do_next_step() { 211 header("Location: admin.php?import=blogger&noheader=true&blog={$_GET['blog']}"); 212 die(); 213 } 214 215 // Step 0: Do Blogger login, get userid and blogid/title pairs. 216 function do_login() { 217 if ( ( ! $this->import['user'] && ! is_array($this->import['cookies']) ) ) { 218 // The user must provide a Blogger username and password. 219 if ( ! ( $_POST['user'] && $_POST['pass'] ) ) { 220 $this->login_form("Please log in using your Blogger credentials."); 221 } 222 223 // Try logging in. If we get an array of cookies back, we at least connected. 224 $this->import['cookies'] = $this->login_blogger($_POST['user'], $_POST['pass']); 225 if ( !is_array( $this->import['cookies'] ) ) { 226 $this->login_form("Login failed. Please enter your credentials again."); 227 } 228 229 // Save the password so we can log the browser in when it's time to publish. 230 $this->import['pass'] = $_POST['pass']; 231 $this->import['user'] = $_POST['user']; 232 233 // Get the blog numbers so we can give the user a choice. 234 $response = $this->get_blogger('https://www.blogger.com/atom','',$_POST['user'],$_POST['pass']); 235 $blogger = $response['body']; 236 237 // Save the userID if we got one from Blogger, otherwise re-login. 238 $useridary = array(); 239 preg_match('#>(\d+)</userid#', $blogger, $useridary); 240 241 if (! $this->import['userid'] = $useridary[1]) $this->login_form("Login failed. Please re-enter your username and password."); 242 unset($useridary); 243 244 // Save the blogs 245 $blogsary = array(); 246 preg_match_all('#/atom/(\d+)" rel\="service.feed" title="([^"]+)"#', $blogger, $blogsary); 247 if ( ! is_array( $blogsary[1] ) ) 248 die('No blogs found for this user.'); 249 $this->import['blogs'] = array(); 250 foreach ( $blogsary[1] as $key => $id ) { 251 // Define the required Blogger options. 252 $blog_opts = array( 253 'blog-options-basic' => false, 254 'blog-formatting' => array('timeStampFormat' => '0', 'encoding'=>'UTF-8', 'convertLineBreaks'=>'false', 'floatAlignment'=>'false'), 255 'blog-comments' => array('commentsTimeStampFormat' => '0'), 256 'blog-options-archiving' => array('archiveFrequency' => 'm'), 257 'template-edit' => array( 'templateText' => str_replace('%title%', $blogsary[2][$key], $this->template) ), 258 'blog-publishing' => array('publishMode'=>'0', 'blogID' => "$id", 'subdomain' => mt_rand().mt_rand(), 'pingWeblogs' => 'false') 259 ); 260 261 // Build the blog options array template 262 foreach ($blog_opts as $blog_opt => $modify) 263 $new_opts["$blog_opt"] = array('backup'=>false, 'modify' => $modify, 'error'=>false); 264 265 $this->import['blogs']["$id"] = array( 266 'id' => $id, 267 'title' => $blogsary[2][$key], 268 'options' => $new_opts, 269 'url' => false, 270 'publish_cookies' => false, 271 'published' => false, 272 'archives' => false, 273 'newusers' => array(), 274 'lump_authors' => false, 275 'newusers' => 0, 276 'nextstep' => 2 277 ); 278 } 279 update_option('import-blogger', $this->import); 280 header("Location: admin.php?import=blogger&noheader=true&step=1"); 281 } 282 die(); 283 } 284 285 // Step 1: Select one of the blogs belonging to the user logged in. 286 function select_blog() { 287 if ( is_array($this->import['blogs']) ) { 288 $this->show_blogs(); 289 die(); 290 } else { 291 $this->restart(); 292 } 293 } 294 295 // Step 2: Backup the Blogger options pages, updating some of them. 296 function backup_settings() { 297 $output.= "<h1>Backing up Blogger options</h1>\n"; 298 $form = false; 299 foreach ($this->import['blogs'][$_GET['blog']]['options'] as $blog_opt => $optary) { 300 if ( $blog_opt == $_GET['form'] ) { 301 // Make sure not to overwrite any existing backups! 302 if ( $this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['backup'] ) continue; 303 304 // Save the posted form data 305 $this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['backup'] = $_POST; 306 update_option('import-blogger',$this->import); 307 308 // Post the modified form data to Blogger 309 if ( $optary['modify'] ) { 310 $posturl = "http://www.blogger.com/{$blog_opt}.do"; 311 $headers = array_merge($this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['cookies'], $this->import['cookies']); 312 switch ($blog_opt) { 313 case 'blog-publishing': 314 if ( $_POST['publishMode'] > 0 ) { 315 $response = $this->get_blogger("http://www.blogger.com/blog-publishing.g?blogID={$_GET['blog']}&publishMode=0", $headers); 316 if ( $response['code'] >= 400 ) 317 die('<h2>Failed attempt to change publishMode:</h2><pre>' . addslashes(print_r($headers, 1)) . addslashes(print_r($response, 1)) . '</pre>'); 318 $this->import['blogs'][$_GET['blog']]['url'] = 'http://' . $optary['modify']['subdomain'] . '.blogspot.com/'; 319 } else { 320 $this->import['blogs'][$_GET['blog']]['url'] = 'http://' . $_POST['subdomain'] . '.blogspot.com/'; 321 update_option('import-blogger', $this->import); 322 continue 2; 323 } 324 $paramary = $optary['modify']; 325 break; 326 case 'template-edit': 327 $this->import['blogs'][$_GET['blog']]['publish_cookies'] = $headers; 328 update_option('import-blogger', $this->import); 329 default: 330 $paramary = array_merge($_POST, $optary['modify']); 331 } 332 $response = $this->post_blogger($posturl, $headers, $paramary); 333 if ( $response['code'] >= 400 || strstr($response['body'], 'There are errors on this form') ) 334 die( "<p>Error on form submission. Refresh/Reload and click YES to resubmit.</p>" . addslashes(print_r($response, 1))); 335 //header("Location: admin.php?import=blogger&noheader=true&step=2&blog={$_GET['blog']}"); 336 //die(); 337 } 338 $output .= "<del><p>$blog_opt</p></del>\n"; 339 } elseif ( is_array($this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['backup']) ) { 340 // This option set has already been backed up. 341 $output .= "<del><p>$blog_opt</p></del>\n"; 342 } elseif ( ! $form ) { 343 // This option page needs to be downloaded and given to the browser for submission back to this script. 344 $response = $this->get_blogger("http://www.blogger.com/{$blog_opt}.g?blogID={$_GET['blog']}", $this->import['cookies']); 345 $this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['cookies'] = $response['cookies']; 346 update_option('import-blogger',$this->import); 347 $body = $response['body']; 348 $body = preg_replace("|\<!DOCTYPE.*\<body[^>]*>|ms","",$body); 349 $body = preg_replace("|/?{$blog_opt}.do|","admin.php?import=blogger&noheader=true&step=2&blog={$_GET['blog']}&form={$blog_opt}",$body); 350 $body = str_replace("name='submit'","name='supermit'",$body); 351 $body = str_replace('name="submit"','name="supermit"',$body); 352 $body = str_replace('</body>','',str_replace('</html>','',$body)); 353 $form = "<div style='height:0px;width:0px;overflow:hidden;'>"; 354 $form.= $body; 355 $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>"; 356 $output.= "<p><strong>$blog_opt</strong> in progress, please wait...</p>\n"; 357 } else { 358 $output.= "<p>$blog_opt</p>\n"; 359 } 360 } 361 if ( $form ) 362 die($output . $form); 363 364 $this->set_next_step(3); 365 $this->do_next_step(); 366 } 367 368 // Step 3: Publish with the new template and settings. 369 function publish_blog() { 370 echo $this->refresher(2400) . "<h1>Publishing with new template and options</h1>\n"; 371 $this->publish_blogger(5); 372 } 373 374 // Step 4: Deprecated. :-D 375 376 // Step 5: Get the archive URLs from the new blog. 377 function get_archive_urls() { 378 $bloghtml = file($this->import['blogs'][$_GET['blog']]['url']); 379 if (! is_array($bloghtml) ) die('Trouble connecting to your blog. Try reloading this page.'); 380 preg_match_all('#<a class="archive" href="([^"]*)"#', implode('',$bloghtml), $archives); 381 if ( count($archives[1]) == 0 ) die ("That's odd. No archives were found. Does <a href='{$import['blogs'][$_GET['blog']]['url']}'>your blog</a> say Temporary Template?"); 382 foreach ($archives[1] as $archive) { 383 $this->import['blogs'][$_GET['blog']]['archives'][$archive] = false; 384 } 385 $this->set_next_step(6); 386 $this->do_next_step(); 387 } 388 389 // Step 6: Get each monthly archive, import it, mark it done. 390 function get_archive() { 391 global $wpdb; 392 $output = "<h2>Importing Blogger archives into WordPress</h2>\n"; 393 $did_one = false; 394 foreach ( $this->import['blogs'][$_GET['blog']]['archives'] as $url => $status ) { 395 $archivename = substr(basename($url),0,7); 396 if ( $status || $did_one ) { 397 $foo = 'bar'; 398 // Do nothing. 399 } else { 400 // Import the selected month 401 $postcount = 0; 402 $skippedpostcount = 0; 403 $commentcount = 0; 404 $skippedcommentcount = 0; 405 $status = ''; 406 $archive = implode('',file($url)); 407 408 $posts = explode('<wordpresspost>', $archive); 409 for ($i = 1; $i < count($posts); $i = $i + 1) { 410 $postparts = explode('<wordpresscomment>', $posts[$i]); 411 $postinfo = explode('|W|P|', $postparts[0]); 412 $post_date = $postinfo[0]; 413 $post_content = $postinfo[2]; 414 // Don't try to re-use the original numbers 415 // because the new, longer numbers are too 416 // big to handle as ints. 417 //$post_number = $postinfo[3]; 418 $post_title = ( $postinfo[4] != '' ) ? $postinfo[4] : $postinfo[3]; 419 $post_author = trim($wpdb->escape($postinfo[1])); 420 $post_author_name = trim(addslashes($postinfo[1])); 421 $post_author_email = $postinfo[5] ? $postinfo[5] : 'no@email.com'; 422 423 if ( $this->import['blogs'][$_GET['blog']]['lump_authors'] ) { 424 // Ignore Blogger authors. Use the current user_ID for all posts imported. 425 $post_author = $GLOBALS['user_ID']; // For WPMU only. Assume all posts belong to the current user. 426 } else { 427 // Add a user for each new author encountered. 428 if (! username_exists($post_author_name) ) { 429 $user_joindate = '1979-06-06 00:41:00'; // that's my birthdate (gmt+1) - I could choose any other date. You could change the date too. Just remember the year must be >=1970 or the world would just randomly fall on your head (everything might look fine, and then blam! major headache!) 430 $user_login = $wpdb->escape($post_author_name); 431 $pass1 = $wpdb->escape('password'); 432 $user_email = $wpdb->escape($post_author_email); 433 $user_url = $wpdb->escape(''); 434 $user_joindate = $wpdb->escape($user_joindate); 435 $user_password = substr(md5(uniqid(microtime())), 0, 6); 436 $result = wp_create_user( $user_login, $user_password, $user_email ); 437 $status.= "Registered user <strong>$user_login</strong>. "; 438 ++$this->import['blogs'][$_GET['blog']]['newusers']; 439 } 440 $userdata = get_userdatabylogin( $post_author_name ); 441 $post_author = $userdata->ID; 442 } 443 $post_date = explode(' ', $post_date); 444 $post_date_Ymd = explode('/', $post_date[0]); 445 $postyear = $post_date_Ymd[2]; 446 $postmonth = zeroise($post_date_Ymd[0], 2); 447 $postday = zeroise($post_date_Ymd[1], 2); 448 $post_date_His = explode(':', $post_date[1]); 449 $posthour = zeroise($post_date_His[0], 2); 450 $postminute = zeroise($post_date_His[1], 2); 451 $postsecond = zeroise($post_date_His[2], 2); 452 453 if (($post_date[2] == 'PM') && ($posthour != '12')) 454 $posthour = $posthour + 12; 455 else if (($post_date[2] == 'AM') && ($posthour == '12')) 456 $posthour = '00'; 457 458 $post_date = "$postyear-$postmonth-$postday $posthour:$postminute:$postsecond"; 459 460 $post_content = addslashes($post_content); 461 $post_content = str_replace('<br>', '<br />', $post_content); // the XHTML touch... ;) 462 463 $post_title = addslashes($post_title); 464 465 $post_status = 'publish'; 466 467 if ( post_exists($post_title, '', $post_date) ) { 468 $skippedpostcount++; 469 $comment_post_ID = $dupcheck[0]['ID']; 470 } else { 471 $post_array = compact('post_author', 'post_content', 'post_title', 'post_category', 'post_author', 'post_date', 'post_status'); 472 $comment_post_ID = wp_insert_post($post_array); 473 } 474 475 // Import any comments attached to this post. 476 if ($postparts[1]) : 477 for ($j = 1; $j < count($postparts); $j = $j + 1) { 478 $commentinfo = explode('|W|P|', $postparts[$j]); 479 $comment_date = explode(' ', $commentinfo[0]); 480 $comment_date_Ymd = explode('/', $comment_date[0]); 481 $commentyear = $comment_date_Ymd[2]; 482 $commentmonth = zeroise($comment_date_Ymd[0], 2); 483 $commentday = zeroise($comment_date_Ymd[1], 2); 484 $comment_date_His = explode(':', $comment_date[1]); 485 $commenthour = zeroise($comment_date_His[0], 2); 486 $commentminute = zeroise($comment_date_His[1], 2); 487 $commentsecond = '00'; 488 if (($comment_date[2] == 'PM') && ($commenthour != '12')) 489 $commenthour = $commenthour + 12; 490 else if (($comment_date[2] == 'AM') && ($commenthour == '12')) 491 $commenthour = '00'; 492 $comment_date = "$commentyear-$commentmonth-$commentday $commenthour:$commentminute:$commentsecond"; 493 $comment_author = addslashes(strip_tags(html_entity_decode($commentinfo[1]))); // Believe it or not, Blogger allows a user to call himself "Mr. Hell's Kitchen" which, as a string, really confuses SQL. 494 if ( strpos($commentinfo[1], 'a href') ) { 495 $comment_author_parts = explode('"', htmlentities($commentinfo[1])); 496 $comment_author_url = $comment_author_parts[1]; 497 } else $comment_author_url = ''; 498 $comment_content = addslashes($commentinfo[2]); 499 $comment_content = str_replace('<br>', '<br />', $comment_content); 500 if ( $comment_post_ID == comment_exists($comment_author, $comment_date) ) { 501 $skippedcommentcount++; 502 } else { 503 $result = $wpdb->query(" 504 INSERT INTO $wpdb->comments 505 (comment_post_ID,comment_author,comment_author_url,comment_date,comment_content) 506 VALUES 507 ('$comment_post_ID','$comment_author','$comment_author_url','$comment_date','$comment_content') 508 "); 509 } 510 $commentcount++; 511 } 512 endif; 513 $postcount++; 514 } 515 $status = "$postcount post(s) parsed, $skippedpostcount skipped... $commentcount comment(s) parsed, $skippedcommentcount skipped... <strong>Done</strong>"; 516 $import = $this->import; 517 $import['blogs'][$_GET['blog']]['archives']["$url"] = $status; 518 update_option('import-blogger', $import); 519 $did_one = true; 520 } 521 $output.= "<p>$archivename $status</p>\n"; 522 } 523 if ( ! $did_one ) 524 $this->set_next_step(7); 525 die( $this->refresher(5000) . $output ); 526 } 527 528 // Step 7: Restore the backed-up settings to Blogger 529 function restore_settings() { 530 $output = "<h1>Restoring your Blogger options</h1>\n"; 531 $did_one = false; 532 foreach ( $this->import['blogs'][$_GET['blog']]['options'] as $blog_opt => $optary ) { 533 if ( $did_one ) { 534 $output .= "<p>$blog_opt</p>\n"; 535 } elseif ( $optary['restored'] ) { 536 $output .= "<p><del>$blog_opt</del></p>\n"; 537 } elseif ( ! $optary['modify'] ) { 538 $output .= "<p><del>$blog_opt</del></p>\n"; 539 } else { 540 $posturl = "http://www.blogger.com/{$blog_opt}.do"; 541 $headers = array_merge($this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['cookies'], $this->import['cookies']); 542 if ( 'blog-publishing' == $blog_opt) { 543 if ( $optary['backup']['publishMode'] > 0 ) { 544 $response = $this->get_blogger("http://www.blogger.com/blog-publishing.g?blogID={$_GET['blog']}&publishMode={$optary['backup']['publishMode']}", $headers); 545 if ( $response['code'] >= 400 ) 546 die('<h1>Error restoring publishMode.</h1><p>Please tell the devs.</p>' . addslashes(print_r($response, 1)) ); 547 } 548 } 549 if ( $optary['backup'] != $optary['modify'] ) { 550 $response = $this->post_blogger($posturl, $headers, $optary['backup']); 551 if ( $response['code'] >= 400 || strstr($response['body'], 'There are errors on this form') ) 552 die( "<h1>Error on form submission in Step 7.</h1><p>Please tell the devs.</p>" . addslashes(print_r($response, 1))); 553 } 554 $this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['restored'] = true; 555 update_option('import-blogger', $this->import); 556 $did_one = true; 557 $output .= "<p><strong>$blog_opt</strong> in progress. Please wait..."; 558 } 559 } 560 561 if ( $did_one ) { 562 die( $this->refresher(1000) . $output ); 563 } 564 565 $this->set_next_step(8); 566 $this->do_next_step(); 567 } 568 569 // Step 8: Republish, all back to normal 570 function republish_blog() { 571 echo $this->refresher(2400) . "<h1>Publishing with original template and options</h1>\n"; 572 $this->publish_blogger(9); 573 } 574 575 // Step 9: Congratulate the user 576 function congrats() { 577 echo "<h1>Congratulations!</h1> 578 <p>Now that you have imported your Blogger blog into WordPress, what are you going to do? Here are some suggestions:</p> 579 <ul> 580 <li>That was hard work! Take a break.</li> 581 "; 582 if ( count($this->import['blogs']) > 1 ) 583 echo "<li>In case you haven't done it already, you can import the posts from any other blogs you may have:" . $this->show_blogs() . "</li>\n"; 584 if ( $n = count($this->import['blogs'][$_GET['blog']]['newusers']) ) 585 echo "<li>Since we had to create $n new users, you probably want to go to <a href='users.php' target='_parent'>Authors & Users</a>, where you can give them new passwords 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.</li>\n"; 586 587 echo "\n<ul>"; 588 } 589 590 // Figures out what to do, then does it. 591 function start() { 592 if ( $_GET['restart'] == 'true' ) { 593 $this->restart(); 594 } 595 596 if ( isset($_GET['noheader']) ) { 597 $this->import = get_settings('import-blogger'); 598 599 if ( isset($_GET['step']) ) { 600 $step = (int) $_GET['step']; 601 } elseif ( isset($_GET['blog']) ) { 602 $step = $this->import['blogs'][$_GET['blog']]['nextstep']; 603 } elseif ( is_array($this->import['blogs']) ) { 604 $step = 1; 605 } else { 606 $step = 0; 607 } 608 switch ($step) { 609 case 0 : 610 $this->do_login(); 611 break; 612 case 1 : 613 $this->select_blog(); 614 break; 615 case 2 : 616 $this->backup_settings(); 617 break; 618 case 3 : 619 $this->publish_blog(); 620 break; 621 case 4 : 622 case 5 : 623 $this->get_archive_urls(); 624 break; 625 case 6 : 626 $this->get_archive(); 627 break; 628 case 7 : 629 $this->restore_settings(); 630 break; 631 case 8 : 632 $this->republish_blog(); 633 break; 634 case 9 : 635 $this->congrats(); 636 break; 637 } 638 639 die; 640 641 } else { 642 $this->greet(); 643 } 644 } 645 646 function Blogger_Import() { 647 // This space intentionally left blank. 648 } 649 } 650 651 $blogger_import = new Blogger_Import(); 652 653 register_importer('blogger', 'Blogger', __('Import posts and comments from a Blogger account'), array ($blogger_import, 'start')); 654 ?>
Note: See TracChangeset
for help on using the changeset viewer.