[ Index ]

PHP Cross Reference of Wordpress 2.9.1

title

Body

[close]

/wp-admin/import/ -> mt.php (source)

   1  <?php
   2  /**
   3   * Movable Type and TypePad Importer
   4   *
   5   * @package WordPress
   6   * @subpackage Importer
   7   */
   8  
   9  /**
  10   * Moveable Type and TypePad Importer class
  11   *
  12   * Upload your exported Movable Type or TypePad entries into WordPress.
  13   *
  14   * @since unknown
  15   */
  16  class MT_Import {
  17  
  18      var $posts = array ();
  19      var $file;
  20      var $id;
  21      var $mtnames = array ();
  22      var $newauthornames = array ();
  23      var $j = -1;
  24  
  25  	function header() {
  26          echo '<div class="wrap">';
  27          screen_icon();
  28          echo '<h2>'.__('Import Movable Type or TypePad').'</h2>';
  29      }
  30  
  31  	function footer() {
  32          echo '</div>';
  33      }
  34  
  35  	function greet() {
  36          $this->header();
  37  ?>
  38  <div class="narrow">
  39  <p><?php _e('Howdy! We&#8217;re about to begin importing all of your Movable Type or TypePad entries into WordPress. To begin, either choose a file to upload and click &#8220;Upload file and import&#8221;, or use FTP to upload your MT export file as <code>mt-export.txt</code> in your <code>/wp-content/</code> directory and then click "Import mt-export.txt"'); ?></p>
  40  
  41  <?php wp_import_upload_form( add_query_arg('step', 1) ); ?>
  42  <form method="post" action="<?php echo esc_attr(add_query_arg('step', 1)); ?>" class="import-upload-form">
  43  
  44  <?php wp_nonce_field('import-upload'); ?>
  45  <p>
  46      <input type="hidden" name="upload_type" value="ftp" />
  47  <?php _e('Or use <code>mt-export.txt</code> in your <code>/wp-content/</code> directory'); ?></p>
  48  <p class="submit">
  49  <input type="submit" class="button" value="<?php esc_attr_e('Import mt-export.txt'); ?>" />
  50  </p>
  51  </form>
  52  <p><?php _e('The importer is smart enough not to import duplicates, so you can run this multiple times without worry if&#8212;for whatever reason&#8212;it doesn&#8217;t finish. If you get an <strong>out of memory</strong> error try splitting up the import file into pieces.'); ?> </p>
  53  </div>
  54  <?php
  55          $this->footer();
  56      }
  57  
  58  	function users_form($n) {
  59          global $wpdb;
  60          $users = $wpdb->get_results("SELECT * FROM $wpdb->users ORDER BY ID");
  61  ?><select name="userselect[<?php echo $n; ?>]">
  62      <option value="#NONE#"><?php _e('- Select -') ?></option>
  63      <?php
  64  
  65  
  66          foreach ($users as $user) {
  67              echo '<option value="'.$user->user_login.'">'.$user->user_login.'</option>';
  68          }
  69  ?>
  70      </select>
  71      <?php
  72  
  73      }
  74  
  75  	function has_gzip() {
  76          return is_callable('gzopen');
  77      }
  78  
  79  	function fopen($filename, $mode='r') {
  80          if ( $this->has_gzip() )
  81              return gzopen($filename, $mode);
  82          return fopen($filename, $mode);
  83      }
  84  
  85  	function feof($fp) {
  86          if ( $this->has_gzip() )
  87              return gzeof($fp);
  88          return feof($fp);
  89      }
  90  
  91  	function fgets($fp, $len=8192) {
  92          if ( $this->has_gzip() )
  93              return gzgets($fp, $len);
  94          return fgets($fp, $len);
  95      }
  96  
  97  	function fclose($fp) {
  98          if ( $this->has_gzip() )
  99              return gzclose($fp);
 100          return fclose($fp);
 101       }
 102  
 103      //function to check the authorname and do the mapping
 104  	function checkauthor($author) {
 105          //mtnames is an array with the names in the mt import file
 106          $pass = wp_generate_password();
 107          if (!(in_array($author, $this->mtnames))) { //a new mt author name is found
 108              ++ $this->j;
 109              $this->mtnames[$this->j] = $author; //add that new mt author name to an array
 110              $user_id = username_exists($this->newauthornames[$this->j]); //check if the new author name defined by the user is a pre-existing wp user
 111              if (!$user_id) { //banging my head against the desk now.
 112                  if ($this->newauthornames[$this->j] == 'left_blank') { //check if the user does not want to change the authorname
 113                      $user_id = wp_create_user($author, $pass);
 114                      $this->newauthornames[$this->j] = $author; //now we have a name, in the place of left_blank.
 115                  } else {
 116                      $user_id = wp_create_user($this->newauthornames[$this->j], $pass);
 117                  }
 118              } else {
 119                  return $user_id; // return pre-existing wp username if it exists
 120              }
 121          } else {
 122              $key = array_search($author, $this->mtnames); //find the array key for $author in the $mtnames array
 123              $user_id = username_exists($this->newauthornames[$key]); //use that key to get the value of the author's name from $newauthornames
 124          }
 125  
 126          return $user_id;
 127      }
 128  
 129  	function get_mt_authors() {
 130          $temp = array();
 131          $authors = array();
 132  
 133          $handle = $this->fopen($this->file, 'r');
 134          if ( $handle == null )
 135              return false;
 136  
 137          $in_comment = false;
 138          while ( $line = $this->fgets($handle) ) {
 139              $line = trim($line);
 140  
 141              if ( 'COMMENT:' == $line )
 142                  $in_comment = true;
 143              else if ( '-----' == $line )
 144                  $in_comment = false;
 145  
 146              if ( $in_comment || 0 !== strpos($line,"AUTHOR:") )
 147                  continue;
 148  
 149              $temp[] = trim( substr($line, strlen("AUTHOR:")) );
 150          }
 151  
 152          //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.
 153          $authors[0] = array_shift($temp);
 154          $y = count($temp) + 1;
 155          for ($x = 1; $x < $y; $x ++) {
 156              $next = array_shift($temp);
 157              if (!(in_array($next, $authors)))
 158                  array_push($authors, "$next");
 159          }
 160  
 161          $this->fclose($handle);
 162  
 163          return $authors;
 164      }
 165  
 166  	function get_authors_from_post() {
 167          $formnames = array ();
 168          $selectnames = array ();
 169  
 170          foreach ($_POST['user'] as $key => $line) {
 171              $newname = trim(stripslashes($line));
 172              if ($newname == '')
 173                  $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.
 174              array_push($formnames, "$newname");
 175          } // $formnames is the array with the form entered names
 176  
 177          foreach ($_POST['userselect'] as $user => $key) {
 178              $selected = trim(stripslashes($key));
 179              array_push($selectnames, "$selected");
 180          }
 181  
 182          $count = count($formnames);
 183          for ($i = 0; $i < $count; $i ++) {
 184              if ($selectnames[$i] != '#NONE#') { //if no name was selected from the select menu, use the name entered in the form
 185                  array_push($this->newauthornames, "$selectnames[$i]");
 186              } else {
 187                  array_push($this->newauthornames, "$formnames[$i]");
 188              }
 189          }
 190      }
 191  
 192  	function mt_authors_form() {
 193  ?>
 194  <div class="wrap">
 195  <?php screen_icon(); ?>
 196  <h2><?php _e('Assign Authors'); ?></h2>
 197  <p><?php _e('To make it easier for you to edit and save the imported posts and drafts, you may want to change the name of the author of the posts. For example, you may want to import all the entries as admin&#8217;s entries.'); ?></p>
 198  <p><?php _e('Below, you can see the names of the authors of the MovableType posts in <em>italics</em>. For each of these names, you can either pick an author in your WordPress installation from the menu, or enter a name for the author in the textbox.'); ?></p>
 199  <p><?php _e('If a new user is created by WordPress, a password will be randomly generated. Manually change the user&#8217;s details if necessary.'); ?></p>
 200      <?php
 201  
 202  
 203          $authors = $this->get_mt_authors();
 204          echo '<ol id="authors">';
 205          echo '<form action="?import=mt&amp;step=2&amp;id=' . $this->id . '" method="post">';
 206          wp_nonce_field('import-mt');
 207          $j = -1;
 208          foreach ($authors as $author) {
 209              ++ $j;
 210              echo '<li><label>'.__('Current author:').' <strong>'.$author.'</strong><br />'.sprintf(__('Create user %1$s or map to existing'), ' <input type="text" value="'. esc_attr($author) .'" name="'.'user[]'.'" maxlength="30"> <br />');
 211              $this->users_form($j);
 212              echo '</label></li>';
 213          }
 214  
 215          echo '<p class="submit"><input type="submit" class="button" value="'.esc_attr__('Submit').'"></p>'.'<br />';
 216          echo '</form>';
 217          echo '</ol></div>';
 218  
 219      }
 220  
 221  	function select_authors() {
 222          if ( $_POST['upload_type'] === 'ftp' ) {
 223              $file['file'] = WP_CONTENT_DIR . '/mt-export.txt';
 224              if ( !file_exists($file['file']) )
 225                  $file['error'] = __('<code>mt-export.txt</code> does not exist');
 226          } else {
 227              $file = wp_import_handle_upload();
 228          }
 229          if ( isset($file['error']) ) {
 230              $this->header();
 231              echo '<p>'.__('Sorry, there has been an error').'.</p>';
 232              echo '<p><strong>' . $file['error'] . '</strong></p>';
 233              $this->footer();
 234              return;
 235          }
 236          $this->file = $file['file'];
 237          $this->id = (int) $file['id'];
 238  
 239          $this->mt_authors_form();
 240      }
 241  
 242  	function save_post(&$post, &$comments, &$pings) {
 243          // Reset the counter
 244          set_time_limit(30);
 245          $post = get_object_vars($post);
 246          $post = add_magic_quotes($post);
 247          $post = (object) $post;
 248  
 249          if ( $post_id = post_exists($post->post_title, '', $post->post_date) ) {
 250              echo '<li>';
 251              printf(__('Post <em>%s</em> already exists.'), stripslashes($post->post_title));
 252          } else {
 253              echo '<li>';
 254              printf(__('Importing post <em>%s</em>...'), stripslashes($post->post_title));
 255  
 256              if ( '' != trim( $post->extended ) )
 257                      $post->post_content .= "\n<!--more-->\n$post->extended";
 258  
 259              $post->post_author = $this->checkauthor($post->post_author); //just so that if a post already exists, new users are not created by checkauthor
 260              $post_id = wp_insert_post($post);
 261              if ( is_wp_error( $post_id ) )
 262                  return $post_id;
 263  
 264              // Add categories.
 265              if ( 0 != count($post->categories) ) {
 266                  wp_create_categories($post->categories, $post_id);
 267              }
 268  
 269               // Add tags or keywords
 270              if ( 1 < strlen($post->post_keywords) ) {
 271                   // Keywords exist.
 272                  printf(__('<br />Adding tags <i>%s</i>...'), stripslashes($post->post_keywords));
 273                  wp_add_post_tags($post_id, $post->post_keywords);
 274              }
 275          }
 276  
 277          $num_comments = 0;
 278          foreach ( $comments as $comment ) {
 279              $comment = get_object_vars($comment);
 280              $comment = add_magic_quotes($comment);
 281  
 282              if ( !comment_exists($comment['comment_author'], $comment['comment_date'])) {
 283                  $comment['comment_post_ID'] = $post_id;
 284                  $comment = wp_filter_comment($comment);
 285                  wp_insert_comment($comment);
 286                  $num_comments++;
 287              }
 288          }
 289  
 290          if ( $num_comments )
 291              printf(' '._n('(%s comment)', '(%s comments)', $num_comments), $num_comments);
 292  
 293          $num_pings = 0;
 294          foreach ( $pings as $ping ) {
 295              $ping = get_object_vars($ping);
 296              $ping = add_magic_quotes($ping);
 297  
 298              if ( !comment_exists($ping['comment_author'], $ping['comment_date'])) {
 299                  $ping['comment_content'] = "<strong>{$ping['title']}</strong>\n\n{$ping['comment_content']}";
 300                  $ping['comment_post_ID'] = $post_id;
 301                  $ping = wp_filter_comment($ping);
 302                  wp_insert_comment($ping);
 303                  $num_pings++;
 304              }
 305          }
 306  
 307          if ( $num_pings )
 308              printf(' '._n('(%s ping)', '(%s pings)', $num_pings), $num_pings);
 309  
 310          echo "</li>";
 311          //ob_flush();flush();
 312      }
 313  
 314  	function process_posts() {
 315          global $wpdb;
 316  
 317          $handle = $this->fopen($this->file, 'r');
 318          if ( $handle == null )
 319              return false;
 320  
 321          $context = '';
 322          $post = new StdClass();
 323          $comment = new StdClass();
 324          $comments = array();
 325          $ping = new StdClass();
 326          $pings = array();
 327  
 328          echo "<div class='wrap'><ol>";
 329  
 330          while ( $line = $this->fgets($handle) ) {
 331              $line = trim($line);
 332  
 333              if ( '-----' == $line ) {
 334                  // Finishing a multi-line field
 335                  if ( 'comment' == $context ) {
 336                      $comments[] = $comment;
 337                      $comment = new StdClass();
 338                  } else if ( 'ping' == $context ) {
 339                      $pings[] = $ping;
 340                      $ping = new StdClass();
 341                  }
 342                  $context = '';
 343              } else if ( '--------' == $line ) {
 344                  // Finishing a post.
 345                  $context = '';
 346                  $result = $this->save_post($post, $comments, $pings);
 347                  if ( is_wp_error( $result ) )
 348                      return $result;
 349                  $post = new StdClass;
 350                  $comment = new StdClass();
 351                  $ping = new StdClass();
 352                  $comments = array();
 353                  $pings = array();
 354              } else if ( 'BODY:' == $line ) {
 355                  $context = 'body';
 356              } else if ( 'EXTENDED BODY:' == $line ) {
 357                  $context = 'extended';
 358              } else if ( 'EXCERPT:' == $line ) {
 359                  $context = 'excerpt';
 360              } else if ( 'KEYWORDS:' == $line ) {
 361                  $context = 'keywords';
 362              } else if ( 'COMMENT:' == $line ) {
 363                  $context = 'comment';
 364              } else if ( 'PING:' == $line ) {
 365                  $context = 'ping';
 366              } else if ( 0 === strpos($line, "AUTHOR:") ) {
 367                  $author = trim( substr($line, strlen("AUTHOR:")) );
 368                  if ( '' == $context )
 369                      $post->post_author = $author;
 370                  else if ( 'comment' == $context )
 371                       $comment->comment_author = $author;
 372              } else if ( 0 === strpos($line, "TITLE:") ) {
 373                  $title = trim( substr($line, strlen("TITLE:")) );
 374                  if ( '' == $context )
 375                      $post->post_title = $title;
 376                  else if ( 'ping' == $context )
 377                      $ping->title = $title;
 378              } else if ( 0 === strpos($line, "STATUS:") ) {
 379                  $status = trim( strtolower( substr($line, strlen("STATUS:")) ) );
 380                  if ( empty($status) )
 381                      $status = 'publish';
 382                  $post->post_status = $status;
 383              } else if ( 0 === strpos($line, "ALLOW COMMENTS:") ) {
 384                  $allow = trim( substr($line, strlen("ALLOW COMMENTS:")) );
 385                  if ( $allow == 1 )
 386                      $post->comment_status = 'open';
 387                  else
 388                      $post->comment_status = 'closed';
 389              } else if ( 0 === strpos($line, "ALLOW PINGS:") ) {
 390                  $allow = trim( substr($line, strlen("ALLOW PINGS:")) );
 391                  if ( $allow == 1 )
 392                      $post->ping_status = 'open';
 393                  else
 394                      $post->ping_status = 'closed';
 395              } else if ( 0 === strpos($line, "CATEGORY:") ) {
 396                  $category = trim( substr($line, strlen("CATEGORY:")) );
 397                  if ( '' != $category )
 398                      $post->categories[] = $category;
 399              } else if ( 0 === strpos($line, "PRIMARY CATEGORY:") ) {
 400                  $category = trim( substr($line, strlen("PRIMARY CATEGORY:")) );
 401                  if ( '' != $category )
 402                      $post->categories[] = $category;
 403              } else if ( 0 === strpos($line, "DATE:") ) {
 404                  $date = trim( substr($line, strlen("DATE:")) );
 405                  $date = strtotime($date);
 406                  $date = date('Y-m-d H:i:s', $date);
 407                  $date_gmt = get_gmt_from_date($date);
 408                  if ( '' == $context ) {
 409                      $post->post_modified = $date;
 410                      $post->post_modified_gmt = $date_gmt;
 411                      $post->post_date = $date;
 412                      $post->post_date_gmt = $date_gmt;
 413                  } else if ( 'comment' == $context ) {
 414                      $comment->comment_date = $date;
 415                  } else if ( 'ping' == $context ) {
 416                      $ping->comment_date = $date;
 417                  }
 418              } else if ( 0 === strpos($line, "EMAIL:") ) {
 419                  $email = trim( substr($line, strlen("EMAIL:")) );
 420                  if ( 'comment' == $context )
 421                      $comment->comment_author_email = $email;
 422                  else
 423                      $ping->comment_author_email = '';
 424              } else if ( 0 === strpos($line, "IP:") ) {
 425                  $ip = trim( substr($line, strlen("IP:")) );
 426                  if ( 'comment' == $context )
 427                      $comment->comment_author_IP = $ip;
 428                  else
 429                      $ping->comment_author_IP = $ip;
 430              } else if ( 0 === strpos($line, "URL:") ) {
 431                  $url = trim( substr($line, strlen("URL:")) );
 432                  if ( 'comment' == $context )
 433                      $comment->comment_author_url = $url;
 434                  else
 435                      $ping->comment_author_url = $url;
 436              } else if ( 0 === strpos($line, "BLOG NAME:") ) {
 437                  $blog = trim( substr($line, strlen("BLOG NAME:")) );
 438                  $ping->comment_author = $blog;
 439              } else {
 440                  // Processing multi-line field, check context.
 441  
 442                  if( !empty($line) )
 443                      $line .= "\n";
 444  
 445                  if ( 'body' == $context ) {
 446                      $post->post_content .= $line;
 447                  } else if ( 'extended' ==  $context ) {
 448                      $post->extended .= $line;
 449                  } else if ( 'excerpt' == $context ) {
 450                      $post->post_excerpt .= $line;
 451                  } else if ( 'keywords' == $context ) {
 452                      $post->post_keywords .= $line;
 453                  } else if ( 'comment' == $context ) {
 454                      $comment->comment_content .= $line;
 455                  } else if ( 'ping' == $context ) {
 456                      $ping->comment_content .= $line;
 457                  }
 458              }
 459          }
 460  
 461          $this->fclose($handle);
 462  
 463          echo '</ol>';
 464  
 465          wp_import_cleanup($this->id);
 466          do_action('import_done', 'mt');
 467  
 468          echo '<h3>'.sprintf(__('All done. <a href="%s">Have fun!</a>'), get_option('home')).'</h3></div>';
 469      }
 470  
 471  	function import() {
 472          $this->id = (int) $_GET['id'];
 473          if ( $this->id == 0 )
 474              $this->file = WP_CONTENT_DIR . '/mt-export.txt';
 475          else
 476              $this->file = get_attached_file($this->id);
 477          $this->get_authors_from_post();
 478          $result = $this->process_posts();
 479          if ( is_wp_error( $result ) )
 480              return $result;
 481      }
 482  
 483  	function dispatch() {
 484          if (empty ($_GET['step']))
 485              $step = 0;
 486          else
 487              $step = (int) $_GET['step'];
 488  
 489          switch ($step) {
 490              case 0 :
 491                  $this->greet();
 492                  break;
 493              case 1 :
 494                  check_admin_referer('import-upload');
 495                  $this->select_authors();
 496                  break;
 497              case 2:
 498                  check_admin_referer('import-mt');
 499                  $result = $this->import();
 500                  if ( is_wp_error( $result ) )
 501                      echo $result->get_error_message();
 502                  break;
 503          }
 504      }
 505  
 506  	function MT_Import() {
 507          // Nothing.
 508      }
 509  }
 510  
 511  $mt_import = new MT_Import();
 512  
 513  register_importer('mt', __('Movable Type and TypePad'), __('Import posts and comments from a Movable Type or TypePad blog.'), array ($mt_import, 'dispatch'));
 514  ?>


Generated: Fri Jan 8 00:19:48 2010 Cross-referenced by PHPXref 0.7