Changeset 2875

Show
Ignore:
Timestamp:
09/14/05 05:17:20 (3 years ago)
Author:
ryan
Message:

Flesh out MT importer. WIP.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/wp-admin/import/mt.php

    r2872 r2875  
    11<?php 
    22 
     3 
     4// enter the relative path of the import.txt file containing the mt entries. If the file is called import.txt and it is /wp-admin, then this line 
     5//should be define('MTEXPORT', 'import.txt'); 
     6define('MTEXPORT', 'import.txt'); 
     7 
    38class MT_Import { 
    49 
    5     var $authors = array(); 
    6     var $posts = array(); 
    7          
     10    var $posts = array (); 
     11    var $mtnames = array (); 
     12    var $newauthornames = array (); 
     13    var $j = -1; 
     14 
    815    function header() { 
    916        echo '<div class="wrap">'; 
    10         echo '<h2>' . __('Import Movable Type') . '</h2>'; 
     17        echo '<h2>'.__('Import Movable Type').'</h2>'; 
    1118    } 
    1219 
    1320    function footer() { 
    14         echo '</div>';      
    15     } 
    16          
     21        echo '</div>'; 
     22    } 
     23 
    1724    function greet() { 
    1825        $this->header(); 
     
    2633<p>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't finish. If you get an <strong>out of memory</strong> error try splitting up the import file into pieces. </p> 
    2734<?php 
     35 
     36 
    2837        $this->footer(); 
    29     }    
    30      
     38    } 
     39 
     40    function users_form($n) { 
     41        global $wpdb, $testing; 
     42        $users = $wpdb->get_results("SELECT * FROM $wpdb->users ORDER BY ID"); 
     43?><select name="userselect[<?php echo $n; ?>]"> 
     44    <option value="#NONE#">- Select -</option> 
     45    <?php 
     46 
     47 
     48        foreach ($users as $user) { 
     49            echo '<option value="'.$user->user_login.'">'.$user->user_login.'</option>'; 
     50        } 
     51?> 
     52    </select> 
     53    <?php 
     54 
     55 
     56    } 
     57 
     58    //function to check the authorname and do the mapping 
     59    function checkauthor($author) { 
     60        global $wpdb; 
     61        //mtnames is an array with the names in the mt import file 
     62        $md5pass = md5(changeme); 
     63        if (!(in_array($author, $this->mtnames))) { //a new mt author name is found 
     64            ++ $this->j; 
     65            $this->mtnames[$this->j] = $author; //add that new mt author name to an array  
     66            $user_id = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_login = '$this->newauthornames[$j]'"); //check if the new author name defined by the user is a pre-existing wp user 
     67            if (!$user_id) { //banging my head against the desk now.  
     68                if ($newauthornames[$this->j] == 'left_blank') { //check if the user does not want to change the authorname 
     69                    $wpdb->query("INSERT INTO $wpdb->users (user_level, user_login, user_pass, user_nickname) VALUES ('1', '$author', '$md5pass', '$author')"); // if user does not want to change, insert the authorname $author 
     70                    $user_id = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_login = '$author'"); 
     71                    $this->newauthornames[$this->j] = $author; //now we have a name, in the place of left_blank. 
     72                } else { 
     73                    $wpdb->query("INSERT INTO $wpdb->users (user_level, user_login, user_pass, user_nickname) VALUES ('1', '{$this->newauthornames[$this->j]}', '$md5pass', '{$this->newauthornames[$this->j]}')"); //if not left_blank, insert the user specified name 
     74                    $user_id = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_login = '{$this->newauthornames[$this->j]}'"); 
     75                } 
     76            } else { 
     77                return $user_id; // return pre-existing wp username if it exists 
     78            } 
     79        } else { 
     80            $key = array_search($author, $this->mtnames); //find the array key for $author in the $mtnames array 
     81            $user_id = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_login = '{$this->newauthornames[$key]}'"); //use that key to get the value of the author's name from $newauthornames 
     82        } 
     83 
     84        return $user_id; 
     85    } 
     86 
    3187    function get_entries() { 
    3288        set_magic_quotes_runtime(0); 
     
    3692        $importdata = preg_replace("/\n--------\n/", "--MT-ENTRY--\n", $importdata); 
    3793        $this->posts = explode("--MT-ENTRY--", $importdata); 
    38         unset($importdata); 
    39          
    40          
    41     } 
    42      
     94    } 
     95 
     96    function get_mt_authors() { 
     97        $temp = array (); 
     98        $i = -1; 
     99        foreach ($this->posts as $post) { 
     100            if ('' != trim($post)) { 
     101                ++ $i; 
     102                preg_match("|AUTHOR:(.*)|", $post, $thematch); 
     103                $thematch = trim($thematch[1]); 
     104                array_push($temp, "$thematch"); //store the extracted author names in a temporary array 
     105            } 
     106        } 
     107 
     108        //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. 
     109        $authors[0] = array_shift($temp); 
     110        $y = count($temp) + 1; 
     111        for ($x = 1; $x < $y; $x ++) { 
     112            $next = array_shift($temp); 
     113            if (!(in_array($next, $authors))) 
     114                array_push($authors, "$next"); 
     115        } 
     116 
     117        return $authors; 
     118    } 
     119 
     120    function get_authors_from_post() { 
     121        $formnames = array (); 
     122        $selectnames = array (); 
     123 
     124        foreach ($_POST['user'] as $key => $line) { 
     125            $newname = trim(stripslashes($line)); 
     126            if ($newname == '') 
     127                $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. 
     128            array_push($formnames, "$newname"); 
     129        } // $formnames is the array with the form entered names 
     130 
     131        foreach ($_POST['userselect'] as $user => $key) { 
     132            $selected = trim(stripslashes($key)); 
     133            array_push($selectnames, "$selected"); 
     134        } 
     135 
     136        $count = count($formnames); 
     137        for ($i = 0; $i < $count; $i ++) { 
     138            if ($selectnames[$i] != '#NONE#') { //if no name was selected from the select menu, use the name entered in the form 
     139                array_push($this->newauthornames, "$selectnames[$i]"); 
     140            } else { 
     141                array_push($this->newauthornames, "$formnames[$i]"); 
     142            } 
     143        } 
     144    } 
     145 
     146    function mt_authors_form() { 
     147?> 
     148<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 <code>admin</code>s entries.'); ?></p> 
     149<p><?php _e('Below, you can see the names of the authors of the MovableType posts in <i>italics</i>. 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> 
     150<p><?php _e('If a new user is created by WordPress, the password will be set, by default, to "changeme". Quite suggestive, eh? ;)'); ?></p> 
     151    <?php 
     152 
     153 
     154        $authors = $this->get_mt_authors(); 
     155        echo '<ol id="authors">'; 
     156        echo '<form action="?import=mt&amp;step=2" method="post">'; 
     157        $j = -1; 
     158        foreach ($authors as $author) { 
     159            ++ $j; 
     160            echo '<li><i>'.$author.'</i><br />'.'<input type="text" value="'.$author.'" name="'.'user[]'.'" maxlength="30">'; 
     161            $this->users_form($j); 
     162            echo '</li>'; 
     163        } 
     164 
     165        echo '<input type="submit" value="Submit">'.'<br/>'; 
     166        echo '</form>'; 
     167        echo '</ol>'; 
     168 
     169        flush(); 
     170    } 
     171 
     172    function select_authors() { 
     173        if ('' != MTEXPORT && !file_exists(MTEXPORT)) 
     174            die("The file you specified does not seem to exist. Please check the path you've given."); 
     175        if ('' == MTEXPORT) 
     176            die("You must edit the MTEXPORT line as described on the <a href='import-mt.php'>previous page</a> to continue."); 
     177 
     178        $this->get_entries(); 
     179        $this->mt_authors_form(); 
     180    } 
     181 
     182    function process_posts() { 
     183        $i = -1; 
     184        echo "<ol>"; 
     185        foreach ($posts as $post) { 
     186            if ('' != trim($post)) { 
     187                ++ $i; 
     188                unset ($post_categories); 
     189                echo "<li>Processing post... "; 
     190 
     191                // Take the pings out first 
     192                preg_match("|(-----\n\nPING:.*)|s", $post, $pings); 
     193                $post = preg_replace("|(-----\n\nPING:.*)|s", '', $post); 
     194 
     195                // Then take the comments out 
     196                preg_match("|(-----\nCOMMENT:.*)|s", $post, $comments); 
     197                $post = preg_replace("|(-----\nCOMMENT:.*)|s", '', $post); 
     198 
     199                // We ignore the keywords 
     200                $post = preg_replace("|(-----\nKEYWORDS:.*)|s", '', $post); 
     201 
     202                // We want the excerpt 
     203                preg_match("|-----\nEXCERPT:(.*)|s", $post, $excerpt); 
     204                $excerpt = $wpdb->escape(trim($excerpt[1])); 
     205                $post = preg_replace("|(-----\nEXCERPT:.*)|s", '', $post); 
     206 
     207                // We're going to put extended body into main body with a more tag 
     208                preg_match("|-----\nEXTENDED BODY:(.*)|s", $post, $extended); 
     209                $extended = trim($extended[1]); 
     210                if ('' != $extended) 
     211                    $extended = "\n<!--more-->\n$extended"; 
     212                $post = preg_replace("|(-----\nEXTENDED BODY:.*)|s", '', $post); 
     213 
     214                // Now for the main body 
     215                preg_match("|-----\nBODY:(.*)|s", $post, $body); 
     216                $body = trim($body[1]); 
     217                $post_content = $wpdb->escape($body.$extended); 
     218                $post = preg_replace("|(-----\nBODY:.*)|s", '', $post); 
     219 
     220                // Grab the metadata from what's left 
     221                $metadata = explode("\n", $post); 
     222                foreach ($metadata as $line) { 
     223                    preg_match("/^(.*?):(.*)/", $line, $token); 
     224                    $key = trim($token[1]); 
     225                    $value = trim($token[2]); 
     226                    // Now we decide what it is and what to do with it 
     227                    switch ($key) { 
     228                        case '' : 
     229                            break; 
     230                        case 'AUTHOR' : 
     231                            $post_author = $value; 
     232                            break; 
     233                        case 'TITLE' : 
     234                            $post_title = $wpdb->escape($value); 
     235                            echo '<i>'.stripslashes($post_title).'</i>... '; 
     236                            break; 
     237                        case 'STATUS' : 
     238                            // "publish" and "draft" enumeration items match up; no change required 
     239                            $post_status = $value; 
     240                            if (empty ($post_status)) 
     241                                $post_status = 'publish'; 
     242                            break; 
     243                        case 'ALLOW COMMENTS' : 
     244                            $post_allow_comments = $value; 
     245                            if ($post_allow_comments == 1) { 
     246                                $comment_status = 'open'; 
     247                            } else { 
     248                                $comment_status = 'closed'; 
     249                            } 
     250                            break; 
     251                        case 'CONVERT BREAKS' : 
     252                            $post_convert_breaks = $value; 
     253                            break; 
     254                        case 'ALLOW PINGS' : 
     255                            $post_allow_pings = trim($meta[2][0]); 
     256                            if ($post_allow_pings == 1) { 
     257                                $post_allow_pings = 'open'; 
     258                            } else { 
     259                                $post_allow_pings = 'closed'; 
     260                            } 
     261                            break; 
     262                        case 'PRIMARY CATEGORY' : 
     263                            $post_categories[] = $wpdb->escape($value); 
     264                            break; 
     265                        case 'CATEGORY' : 
     266                            $post_categories[] = $wpdb->escape($value); 
     267                            break; 
     268                        case 'DATE' : 
     269                            $post_modified = strtotime($value); 
     270                            $post_modified = date('Y-m-d H:i:s', $post_modified); 
     271                            $post_modified_gmt = get_gmt_from_date("$post_modified"); 
     272                            break; 
     273                        default : 
     274                            // echo "\n$key: $value"; 
     275                            break; 
     276                    } // end switch 
     277                } // End foreach 
     278 
     279                // Let's check to see if it's in already 
     280                if (posts_exists($post_title, '', $post_date)) { 
     281                    echo "Post already imported."; 
     282                } else { 
     283                    $post_author = checkauthor($post_author); //just so that if a post already exists, new users are not created by checkauthor 
     284 
     285                    $postdata = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_excerpt', 'post_status', 'comment_status', 'ping_status', 'post_modified', 'post_modified_gmt'); 
     286                    $post_id = wp_insert_post($postdata); 
     287 
     288                    // Add categories. 
     289                    if (0 != count($post_categories)) { 
     290                        wp_create_categories($post_categories); 
     291                    } 
     292                    echo " Post imported successfully..."; 
     293                } 
     294 
     295                // Now for comments 
     296                $comments = explode("-----\nCOMMENT:", $comments[0]); 
     297                foreach ($comments as $comment) { 
     298                    if ('' != trim($comment)) { 
     299                        // Author 
     300                        preg_match("|AUTHOR:(.*)|", $comment, $comment_author); 
     301                        $comment_author = $wpdb->escape(trim($comment_author[1])); 
     302                        $comment = preg_replace('|(\n?AUTHOR:.*)|', '', $comment); 
     303                        preg_match("|EMAIL:(.*)|", $comment, $comment_email); 
     304                        $comment_email = $wpdb->escape(trim($comment_email[1])); 
     305                        $comment = preg_replace('|(\n?EMAIL:.*)|', '', $comment); 
     306 
     307                        preg_match("|IP:(.*)|", $comment, $comment_ip); 
     308                        $comment_ip = trim($comment_ip[1]); 
     309                        $comment = preg_replace('|(\n?IP:.*)|', '', $comment); 
     310 
     311                        preg_match("|URL:(.*)|", $comment, $comment_url); 
     312                        $comment_url = $wpdb->escape(trim($comment_url[1])); 
     313                        $comment = preg_replace('|(\n?URL:.*)|', '', $comment); 
     314 
     315                        preg_match("|DATE:(.*)|", $comment, $comment_date); 
     316                        $comment_date = trim($comment_date[1]); 
     317                        $comment_date = date('Y-m-d H:i:s', strtotime($comment_date)); 
     318                        $comment = preg_replace('|(\n?DATE:.*)|', '', $comment); 
     319 
     320                        $comment_content = $wpdb->escape(trim($comment)); 
     321                        $comment_content = str_replace('-----', '', $comment_content); 
     322                        // Check if it's already there 
     323                        if (!$wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_date = '$comment_date' AND comment_content = '$comment_content'")) { 
     324                            $wpdb->query("INSERT INTO $wpdb->comments (comment_post_ID, comment_author, comment_author_email, comment_author_url, comment_author_IP, comment_date, comment_content, comment_approved) 
     325                                                                                                VALUES 
     326                                                                                                ($post_id, '$comment_author', '$comment_email', '$comment_url', '$comment_ip', '$comment_date', '$comment_content', '1')"); 
     327                            echo "Comment added."; 
     328                        } 
     329                    } 
     330                } 
     331 
     332                // Finally the pings 
     333                // fix the double newline on the first one 
     334                $pings[0] = str_replace("-----\n\n", "-----\n", $pings[0]); 
     335                $pings = explode("-----\nPING:", $pings[0]); 
     336                foreach ($pings as $ping) { 
     337                    if ('' != trim($ping)) { 
     338                        // 'Author' 
     339                        preg_match("|BLOG NAME:(.*)|", $ping, $comment_author); 
     340                        $comment_author = $wpdb->escape(trim($comment_author[1])); 
     341                        $ping = preg_replace('|(\n?BLOG NAME:.*)|', '', $ping); 
     342 
     343                        $comment_email = ''; 
     344 
     345                        preg_match("|IP:(.*)|", $ping, $comment_ip); 
     346                        $comment_ip = trim($comment_ip[1]); 
     347                        $ping = preg_replace('|(\n?IP:.*)|', '', $ping); 
     348 
     349                        preg_match("|URL:(.*)|", $ping, $comment_url); 
     350                        $comment_url = $wpdb->escape(trim($comment_url[1])); 
     351                        $ping = preg_replace('|(\n?URL:.*)|', '', $ping); 
     352 
     353                        preg_match("|DATE:(.*)|", $ping, $comment_date); 
     354                        $comment_date = trim($comment_date[1]); 
     355                        $comment_date = date('Y-m-d H:i:s', strtotime($comment_date)); 
     356                        $ping = preg_replace('|(\n?DATE:.*)|', '', $ping); 
     357 
     358                        preg_match("|TITLE:(.*)|", $ping, $ping_title); 
     359                        $ping_title = $wpdb->escape(trim($ping_title[1])); 
     360                        $ping = preg_replace('|(\n?TITLE:.*)|', '', $ping); 
     361 
     362                        $comment_content = $wpdb->escape(trim($ping)); 
     363                        $comment_content = str_replace('-----', '', $comment_content); 
     364 
     365                        $comment_content = "<strong>$ping_title</strong>\n\n$comment_content"; 
     366 
     367                        // Check if it's already there 
     368                        if (!$wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_date = '$comment_date' AND comment_content = '$comment_content'")) { 
     369                            $wpdb->query("INSERT INTO $wpdb->comments (comment_post_ID, comment_author, comment_author_email, comment_author_url, comment_author_IP, comment_date, comment_content, comment_approved, comment_type) 
     370                                                                                                                VALUES 
     371                                                                                                                ($post_id, '$comment_author', '$comment_email', '$comment_url', '$comment_ip', '$comment_date', '$comment_content', '1', 'trackback')"); 
     372                            echo " Comment added."; 
     373                        } 
     374 
     375                    } 
     376                } 
     377                echo "</li>"; 
     378            } 
     379            flush(); 
     380        } 
     381 
     382        upgrade_all(); 
     383        echo '</ol>'; 
     384        echo '<h3>'.sprintf(__('All done. <a href="%s">Have fun!</a>'), get_option('home')).'</h3>'; 
     385    } 
     386 
    43387    function import() { 
    44         if ('' != MTEXPORT && !file_exists(MTEXPORT)) die("The file you specified does not seem to exist. Please check the path you've given."); 
    45         if ('' == MTEXPORT) die("You must edit the MTEXPORT line as described on the <a href='import-mt.php'>previous page</a> to continue."); 
    46      
     388        $this->get_authors_from_post(); 
    47389        $this->get_entries(); 
    48     } 
    49      
     390        $this->process_posts(); 
     391    } 
     392 
    50393    function dispatch() { 
    51         if (empty($_GET['step'])) 
     394        if (empty ($_GET['step'])) 
    52395            $step = 0; 
    53396        else 
    54397            $step = (int) $_GET['step']; 
    55          
     398 
    56399        switch ($step) { 
    57             case 0
     400            case 0
    58401                $this->greet(); 
    59402                break; 
    60             case 1
    61                 $this->import(); 
     403            case 1
     404                $this->select_authors(); 
    62405                break; 
    63406        } 
    64407    } 
    65      
     408 
    66409    function MT_Import() { 
    67410        // Nothing.  
     
    71414$mt_import = new MT_Import(); 
    72415 
    73 register_importer('mt', 'Movable Type', 'Import posts and comments from your Movable Type blog', array($mt_import, 'dispatch')); 
    74  
     416register_importer('mt', 'Movable Type', 'Import posts and comments from your Movable Type blog', array ($mt_import, 'dispatch')); 
    75417?>