WordPress.org

Make WordPress Core

Changeset 5684


Ignore:
Timestamp:
06/12/07 19:49:30 (8 years ago)
Author:
ryan
Message:

MT importer rework. see #4421

File:
1 edited

Legend:

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

    r5531 r5684  
    8585    } 
    8686 
    87     function get_entries() { 
    88         set_magic_quotes_runtime(0); 
    89         $importdata = file($this->file); // Read the file into an array 
    90         $importdata = implode('', $importdata); // squish it 
    91         $importdata = preg_replace("/(\r\n|\n|\r)/", "\n", $importdata); 
    92         $importdata = preg_replace("/\n--------\n/", "--MT-ENTRY--\n", $importdata); 
    93         $this->posts = explode("--MT-ENTRY--", $importdata); 
    94     } 
    95  
    9687    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             } 
     88        $temp = array(); 
     89        $authors = array(); 
     90 
     91        $handle = fopen($this->file, 'r'); 
     92        if ( $handle == null ) 
     93            return false; 
     94 
     95        $in_comment = false; 
     96        while ( $line = fgets($handle) ) { 
     97            $line = trim($line); 
     98 
     99            if ( 'COMMENT:' == $line ) 
     100                $in_comment = true; 
     101            else if ( '-----' == $line ) 
     102                $in_comment = false; 
     103 
     104            if ( $in_comment || 0 !== strpos($line,"AUTHOR:") ) 
     105                continue; 
     106 
     107            $temp[] = trim( substr($line, strlen("AUTHOR:")) ); 
    106108        } 
    107109 
     
    114116                array_push($authors, "$next"); 
    115117        } 
     118 
     119        fclose($handle); 
    116120 
    117121        return $authors; 
     
    174178    function select_authors() { 
    175179        if ( $_POST['upload_type'] === 'ftp' ) { 
    176             $file['file'] = @file(ABSPATH . '/wp-content/mt-export.txt'); 
    177             if ( !$file['file'] || !count($file['file']) ) 
     180            $file['file'] = ABSPATH . '/wp-content/mt-export.txt'; 
     181            if ( !file_exists($file['file']) ) 
    178182                $file['error'] = __('<code>mt-export.txt</code> does not exist</code>'); 
    179             else 
    180                 $file['file'] = ABSPATH . '/wp-content/mt-export.txt'; 
    181183        } else { 
    182184            $file = wp_import_handle_upload(); 
     
    192194        $this->id = (int) $file['id']; 
    193195 
    194         $this->get_entries(); 
    195196        $this->mt_authors_form(); 
     197    } 
     198 
     199    function save_post(&$post, &$comments, &$pings) { 
     200        // Reset the counter 
     201        set_time_limit(30); 
     202        $post = get_object_vars($post); 
     203        $post = add_magic_quotes($post); 
     204        $post = (object) $post; 
     205 
     206        if ( $post_id = post_exists($post->post_title, '', $post->post_date) ) { 
     207            echo '<li>'; 
     208            printf(__('Post <i>%s</i> already exists.'), stripslashes($post->post_title)); 
     209        } else { 
     210            echo '<li>'; 
     211            printf(__('Importing post <i>%s</i>...'), stripslashes($post->post_title)); 
     212 
     213            if ( '' != $post->extended ) 
     214                    $post->post_content .= "\n<!--more-->\n$post->extended"; 
     215 
     216            $post->post_author = $this->checkauthor($post->post_author); //just so that if a post already exists, new users are not created by checkauthor 
     217            $post_id = wp_insert_post($post); 
     218 
     219            // Add categories. 
     220            if ( 0 != count($post->categories) ) { 
     221                wp_create_categories($post->categories, $post_id); 
     222            } 
     223        } 
     224 
     225        $num_comments = 0; 
     226        foreach ( $comments as $comment ) { 
     227            $comment = get_object_vars($comment); 
     228            $comment = add_magic_quotes($comment); 
     229 
     230            if ( !comment_exists($comment['comment_author'], $comment['comment_date'])) { 
     231                $comment['comment_post_ID'] = $post_id; 
     232                $comment = wp_filter_comment($comment); 
     233                wp_insert_comment($comment); 
     234                $num_comments++; 
     235            } 
     236        } 
     237 
     238        if ( $num_comments ) 
     239            printf(' '.__('(%s comments)'), $num_comments); 
     240 
     241        $num_pings = 0; 
     242        foreach ( $pings as $ping ) { 
     243            $ping = get_object_vars($ping); 
     244            $ping = add_magic_quotes($ping); 
     245 
     246            if ( !comment_exists($ping['comment_author'], $ping['comment_date'])) { 
     247                $ping['comment_content'] = "<strong>{$ping['title']}</strong>\n\n{$ping['comment_content']}"; 
     248                $ping['comment_post_ID'] = $post_id; 
     249                $ping = wp_filter_comment($ping); 
     250                wp_insert_comment($ping); 
     251                $num_pings++; 
     252            } 
     253        } 
     254 
     255        if ( $num_pings ) 
     256            printf(' '.__('(%s pings)'), $num_pings); 
     257 
     258        echo "</li>"; 
     259        //ob_flush();flush(); 
    196260    } 
    197261 
    198262    function process_posts() { 
    199263        global $wpdb; 
    200         $i = -1; 
     264 
     265        $handle = fopen($this->file, 'r'); 
     266        if ( $handle == null ) 
     267            return false; 
     268 
     269        $context = ''; 
     270        $post = new StdClass(); 
     271        $comment = new StdClass(); 
     272        $comments = array(); 
     273        $ping = new StdClass(); 
     274        $pings = array(); 
     275         
    201276        echo "<div class='wrap'><ol>"; 
    202         foreach ($this->posts as $post) { 
    203             if ('' != trim($post)) { 
    204                 ++ $i; 
    205                 unset ($post_categories); 
    206  
    207                 // Take the pings out first 
    208                 preg_match("|(-----\n\nPING:.*)|s", $post, $pings); 
    209                 $post = preg_replace("|(-----\n\nPING:.*)|s", '', $post); 
    210  
    211                 // Then take the comments out 
    212                 preg_match("|(-----\nCOMMENT:.*)|s", $post, $comments); 
    213                 $post = preg_replace("|(-----\nCOMMENT:.*)|s", '', $post); 
    214  
    215                 // We ignore the keywords 
    216                 $post = preg_replace("|(-----\nKEYWORDS:.*)|s", '', $post); 
    217  
    218                 // We want the excerpt 
    219                 preg_match("|-----\nEXCERPT:(.*)|s", $post, $excerpt); 
    220                 $post_excerpt = $wpdb->escape(trim($excerpt[1])); 
    221                 $post = preg_replace("|(-----\nEXCERPT:.*)|s", '', $post); 
    222  
    223                 // We're going to put extended body into main body with a more tag 
    224                 preg_match("|-----\nEXTENDED BODY:(.*)|s", $post, $extended); 
    225                 $extended = trim($extended[1]); 
    226                 if ('' != $extended) 
    227                     $extended = "\n<!--more-->\n$extended"; 
    228                 $post = preg_replace("|(-----\nEXTENDED BODY:.*)|s", '', $post); 
    229  
    230                 // Now for the main body 
    231                 preg_match("|-----\nBODY:(.*)|s", $post, $body); 
    232                 $body = trim($body[1]); 
    233                 $post_content = $wpdb->escape($body.$extended); 
    234                 $post = preg_replace("|(-----\nBODY:.*)|s", '', $post); 
    235  
    236                 // Grab the metadata from what's left 
    237                 $metadata = explode("\n", $post); 
    238                 foreach ($metadata as $line) { 
    239                     preg_match("/^(.*?):(.*)/", $line, $token); 
    240                     $key = trim($token[1]); 
    241                     $value = trim($token[2]); 
    242                     // Now we decide what it is and what to do with it 
    243                     switch ($key) { 
    244                         case '' : 
    245                             break; 
    246                         case 'AUTHOR' : 
    247                             $post_author = $value; 
    248                             break; 
    249                         case 'TITLE' : 
    250                             $post_title = $wpdb->escape($value); 
    251                             break; 
    252                         case 'STATUS' : 
    253                             // "publish" and "draft" enumeration items match up; no change required 
    254                             $post_status = $value; 
    255                             if (empty ($post_status)) 
    256                                 $post_status = 'publish'; 
    257                             break; 
    258                         case 'ALLOW COMMENTS' : 
    259                             $post_allow_comments = $value; 
    260                             if ($post_allow_comments == 1) { 
    261                                 $comment_status = 'open'; 
    262                             } else { 
    263                                 $comment_status = 'closed'; 
    264                             } 
    265                             break; 
    266                         case 'CONVERT BREAKS' : 
    267                             $post_convert_breaks = $value; 
    268                             break; 
    269                         case 'ALLOW PINGS' : 
    270                             $ping_status = trim($meta[2][0]); 
    271                             if ($ping_status == 1) { 
    272                                 $ping_status = 'open'; 
    273                             } else { 
    274                                 $ping_status = 'closed'; 
    275                             } 
    276                             break; 
    277                         case 'PRIMARY CATEGORY' : 
    278                             if (! empty ($value) ) 
    279                                 $post_categories[] = $wpdb->escape($value); 
    280                             break; 
    281                         case 'CATEGORY' : 
    282                             if (! empty ($value) ) 
    283                                 $post_categories[] = $wpdb->escape($value); 
    284                             break; 
    285                         case 'DATE' : 
    286                             $post_modified = strtotime($value); 
    287                             $post_modified = date('Y-m-d H:i:s', $post_modified); 
    288                             $post_modified_gmt = get_gmt_from_date("$post_modified"); 
    289                             $post_date = $post_modified; 
    290                             $post_date_gmt = $post_modified_gmt; 
    291                             break; 
    292                         default : 
    293                             // echo "\n$key: $value"; 
    294                             break; 
    295                     } // end switch 
    296                 } // End foreach 
    297  
    298                 // Let's check to see if it's in already 
    299                 if ($post_id = post_exists($post_title, '', $post_date)) { 
    300                     echo '<li>'; 
    301                     printf(__('Post <i>%s</i> already exists.'), stripslashes($post_title)); 
    302                 } else { 
    303                     echo '<li>'; 
    304                     printf(__('Importing post <i>%s</i>...'), stripslashes($post_title)); 
    305  
    306                     $post_author = $this->checkauthor($post_author); //just so that if a post already exists, new users are not created by checkauthor 
    307  
    308                     $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'); 
    309                     $post_id = wp_insert_post($postdata); 
    310                     // Add categories. 
    311                     if (0 != count($post_categories)) { 
    312                         wp_create_categories($post_categories, $post_id); 
    313                     } 
     277 
     278        while ( $line = fgets($handle) ) { 
     279            $line = trim($line); 
     280 
     281            if ( '-----' == $line ) { 
     282                // Finishing a multi-line field 
     283                if ( 'comment' == $context ) { 
     284                    $comments[] = $comment; 
     285                    $comment = new StdClass(); 
     286                } else if ( 'ping' == $context ) { 
     287                    $pings[] = $ping; 
     288                    $ping = new StdClass(); 
    314289                } 
    315  
    316                 $comment_post_ID = (int) $post_id; 
    317                 $comment_approved = 1; 
    318  
    319                 // Now for comments 
    320                 $comments = explode("-----\nCOMMENT:", $comments[0]); 
    321                 $num_comments = 0; 
    322                 foreach ($comments as $comment) { 
    323                     if ('' != trim($comment)) { 
    324                         // Author 
    325                         preg_match("|AUTHOR:(.*)|", $comment, $comment_author); 
    326                         $comment_author = $wpdb->escape(trim($comment_author[1])); 
    327                         $comment = preg_replace('|(\n?AUTHOR:.*)|', '', $comment); 
    328                         preg_match("|EMAIL:(.*)|", $comment, $comment_author_email); 
    329                         $comment_author_email = $wpdb->escape(trim($comment_author_email[1])); 
    330                         $comment = preg_replace('|(\n?EMAIL:.*)|', '', $comment); 
    331  
    332                         preg_match("|IP:(.*)|", $comment, $comment_author_IP); 
    333                         $comment_author_IP = trim($comment_author_IP[1]); 
    334                         $comment = preg_replace('|(\n?IP:.*)|', '', $comment); 
    335  
    336                         preg_match("|URL:(.*)|", $comment, $comment_author_url); 
    337                         $comment_author_url = $wpdb->escape(trim($comment_author_url[1])); 
    338                         $comment = preg_replace('|(\n?URL:.*)|', '', $comment); 
    339  
    340                         preg_match("|DATE:(.*)|", $comment, $comment_date); 
    341                         $comment_date = trim($comment_date[1]); 
    342                         $comment_date = date('Y-m-d H:i:s', strtotime($comment_date)); 
    343                         $comment = preg_replace('|(\n?DATE:.*)|', '', $comment); 
    344  
    345                         $comment_content = $wpdb->escape(trim($comment)); 
    346                         $comment_content = str_replace('-----', '', $comment_content); 
    347                         // Check if it's already there 
    348                         if (!comment_exists($comment_author, $comment_date)) { 
    349                             $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email', 'comment_author_IP', 'comment_date', 'comment_content', 'comment_approved'); 
    350                             $commentdata = wp_filter_comment($commentdata); 
    351                             wp_insert_comment($commentdata); 
    352                             $num_comments++; 
    353                         } 
    354                     } 
     290                $context = ''; 
     291            } else if ( '--------' == $line ) { 
     292                // Finishing a post. 
     293                $context = ''; 
     294                $this->save_post($post, $comments, $pings); 
     295                $post = new StdClass; 
     296                $comment = new StdClass(); 
     297                $ping = new StdClass(); 
     298                $comments = array(); 
     299                $pings = array(); 
     300            } else if ( 'BODY:' == $line ) { 
     301                $context = 'body'; 
     302            } else if ( 'EXTENDED BODY:' == $line ) { 
     303                $context = 'extended'; 
     304            } else if ( 'EXCERPT:' == $line ) { 
     305                $context = 'excerpt'; 
     306            } else if ( 'KEYWORDS:' == $line ) { 
     307                $context = 'keywords'; 
     308            } else if ( 'COMMENT:' == $line ) { 
     309                $context = 'comment'; 
     310            } else if ( 'PING:' == $line ) { 
     311                $context = 'ping'; 
     312            } else if ( 0 === strpos($line, "AUTHOR:") ) { 
     313                $author = trim( substr($line, strlen("AUTHOR:")) ); 
     314                if ( '' == $context ) 
     315                    $post->post_author = $author; 
     316                else if ( 'comment' == $context ) 
     317                     $comment->comment_author = $author; 
     318            } else if ( 0 === strpos($line, "TITLE:") ) { 
     319                $title = trim( substr($line, strlen("TITLE:")) ); 
     320                if ( '' == $context ) 
     321                    $post->post_title = $title; 
     322                else if ( 'ping' == $context ) 
     323                    $ping->title = $title; 
     324            } else if ( 0 === strpos($line, "STATUS:") ) { 
     325                $status = trim( substr($line, strlen("STATUS:")) ); 
     326                if ( empty($status) ) 
     327                    $status = 'publish'; 
     328                $post->post_status = $status; 
     329            } else if ( 0 === strpos($line, "ALLOW COMMENTS:") ) { 
     330                $allow = trim( substr($line, strlen("ALLOW COMMENTS:")) ); 
     331                if ( $allow == 1 ) 
     332                    $post->comment_status = 'open'; 
     333                else 
     334                    $post->comment_status = 'closed'; 
     335            } else if ( 0 === strpos($line, "ALLOW PINGS:") ) { 
     336                $allow = trim( substr($line, strlen("ALLOW PINGS:")) ); 
     337                if ( $allow == 1 ) 
     338                    $post->ping_status = 'open'; 
     339                else 
     340                    $post->ping_status = 'closed'; 
     341            } else if ( 0 === strpos($line, "CATEGORY:") ) { 
     342                $category = trim( substr($line, strlen("CATEGORY:")) ); 
     343                if ( '' != $category ) 
     344                    $post->categories[] = $category; 
     345            } else if ( 0 === strpos($line, "PRIMARY CATEGORY:") ) { 
     346                $category = trim( substr($line, strlen("PRIMARY CATEGORY:")) ); 
     347                if ( '' != $category ) 
     348                    $post->categories[] = $category; 
     349            } else if ( 0 === strpos($line, "DATE:") ) { 
     350                $date = trim( substr($line, strlen("DATE:")) ); 
     351                $date = strtotime($date); 
     352                $date = date('Y-m-d H:i:s', $date); 
     353                $date_gmt = get_gmt_from_date($date); 
     354                if ( '' == $context ) { 
     355                    $post->post_modified = $date; 
     356                    $post->post_modified_gmt = $date_gmt; 
     357                    $post->post_date = $date; 
     358                    $post->post_date_gmt = $date_gmt; 
     359                } else if ( 'comment' == $context ) { 
     360                    $comment->comment_date = $date;  
     361                } else if ( 'ping' == $context ) { 
     362                    $ping->comment_date = $date;     
    355363                } 
    356                 if ( $num_comments ) 
    357                     printf(' '.__('(%s comments)'), $num_comments); 
    358  
    359                 // Finally the pings 
    360                 // fix the double newline on the first one 
    361                 $pings[0] = str_replace("-----\n\n", "-----\n", $pings[0]); 
    362                 $pings = explode("-----\nPING:", $pings[0]); 
    363                 $num_pings = 0; 
    364                 foreach ($pings as $ping) { 
    365                     if ('' != trim($ping)) { 
    366                         // 'Author' 
    367                         preg_match("|BLOG NAME:(.*)|", $ping, $comment_author); 
    368                         $comment_author = $wpdb->escape(trim($comment_author[1])); 
    369                         $ping = preg_replace('|(\n?BLOG NAME:.*)|', '', $ping); 
    370  
    371                         preg_match("|IP:(.*)|", $ping, $comment_author_IP); 
    372                         $comment_author_IP = trim($comment_author_IP[1]); 
    373                         $ping = preg_replace('|(\n?IP:.*)|', '', $ping); 
    374  
    375                         preg_match("|URL:(.*)|", $ping, $comment_author_url); 
    376                         $comment_author_url = $wpdb->escape(trim($comment_author_url[1])); 
    377                         $ping = preg_replace('|(\n?URL:.*)|', '', $ping); 
    378  
    379                         preg_match("|DATE:(.*)|", $ping, $comment_date); 
    380                         $comment_date = trim($comment_date[1]); 
    381                         $comment_date = date('Y-m-d H:i:s', strtotime($comment_date)); 
    382                         $ping = preg_replace('|(\n?DATE:.*)|', '', $ping); 
    383  
    384                         preg_match("|TITLE:(.*)|", $ping, $ping_title); 
    385                         $ping_title = $wpdb->escape(trim($ping_title[1])); 
    386                         $ping = preg_replace('|(\n?TITLE:.*)|', '', $ping); 
    387  
    388                         $comment_content = $wpdb->escape(trim($ping)); 
    389                         $comment_content = str_replace('-----', '', $comment_content); 
    390  
    391                         $comment_content = "<strong>$ping_title</strong>\n\n$comment_content"; 
    392  
    393                         $comment_type = 'trackback'; 
    394  
    395                         // Check if it's already there 
    396                         if (!comment_exists($comment_author, $comment_date)) { 
    397                             $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email', 'comment_author_IP', 'comment_date', 'comment_content', 'comment_type', 'comment_approved'); 
    398                             $commentdata = wp_filter_comment($commentdata); 
    399                             wp_insert_comment($commentdata); 
    400                             $num_pings++; 
    401                         } 
    402                     } 
     364            } else if ( 0 === strpos($line, "EMAIL:") ) { 
     365                $email = trim( substr($line, strlen("EMAIL:")) ); 
     366                if ( 'comment' == $context ) 
     367                    $comment->comment_author_email = $email; 
     368                else 
     369                    $ping->comment_author_email = $email; 
     370            } else if ( 0 === strpos($line, "IP:") ) { 
     371                $ip = trim( substr($line, strlen("IP:")) ); 
     372                if ( 'comment' == $context ) 
     373                    $comment->comment_author_IP = $ip; 
     374                else 
     375                    $ping->comment_author_IP = $ip; 
     376            } else if ( 0 === strpos($line, "URL:") ) { 
     377                $url = trim( substr($line, strlen("URL:")) ); 
     378                if ( 'comment' == $context ) 
     379                    $comment->comment_author_url = $url; 
     380                else 
     381                    $ping->comment_author_url = $url; 
     382            } else if ( 0 === strpos($line, "BLOG NAME:") ) { 
     383                $blog = trim( substr($line, strlen("BLOG NAME:")) ); 
     384                $ping->comment_author = $blog; 
     385            } else { 
     386                // Processing multi-line field, check context. 
     387 
     388                $line .= "\n"; 
     389                if ( 'body' == $context ) { 
     390                    $post->post_content .= $line; 
     391                } else if ( 'extended' ==  $context ) { 
     392                    $post->extended .= $line; 
     393                } else if ( 'excerpt' == $context ) { 
     394                    $post->post_excerpt .= $line; 
     395                } else if ( 'comment' == $context ) { 
     396                    $comment->comment_content .= $line; 
     397                } else if ( 'ping' == $context ) { 
     398                    $ping->comment_content .= $line; 
    403399                } 
    404                 if ( $num_pings ) 
    405                     printf(' '.__('(%s pings)'), $num_pings); 
    406  
    407                 echo "</li>"; 
    408400            } 
    409401        } 
     
    412404 
    413405        wp_import_cleanup($this->id); 
     406        do_action('import_done', 'mt'); 
    414407 
    415408        echo '<h3>'.sprintf(__('All done. <a href="%s">Have fun!</a>'), get_option('home')).'</h3></div>'; 
     
    423416            $this->file = get_attached_file($this->id); 
    424417        $this->get_authors_from_post(); 
    425         $this->get_entries(); 
    426418        $this->process_posts(); 
    427419    } 
Note: See TracChangeset for help on using the changeset viewer.