2005-08-21 03:03:23 -04:00
< ? php
2008-08-14 02:30:38 -04:00
/**
* RSS Importer
*
* @ package WordPress
* @ subpackage Importer
*/
/**
* RSS Importer
*
* Will process a RSS feed for importing posts into WordPress . This is a very
* limited importer and should only be used as the last resort , when no other
* importer is available .
*
* @ since unknown
*/
2005-08-21 03:03:23 -04:00
class RSS_Import {
var $posts = array ();
2005-11-15 18:39:32 -05:00
var $file ;
2005-08-21 03:03:23 -04:00
function header () {
echo '<div class="wrap">' ;
2008-11-26 08:51:25 -05:00
screen_icon ();
2005-08-21 03:03:23 -04:00
echo '<h2>' . __ ( 'Import RSS' ) . '</h2>' ;
}
function footer () {
echo '</div>' ;
}
2005-09-10 18:45:32 -04:00
function unhtmlentities ( $string ) { // From php.net for < 4.3 compat
$trans_tbl = get_html_translation_table ( HTML_ENTITIES );
$trans_tbl = array_flip ( $trans_tbl );
return strtr ( $string , $trans_tbl );
}
2006-02-12 02:53:23 -05:00
2005-08-21 03:03:23 -04:00
function greet () {
2006-10-05 21:14:47 -04:00
echo '<div class="narrow">' ;
2006-12-05 02:15:12 -05:00
echo '<p>' . __ ( 'Howdy! This importer allows you to extract posts from an RSS 2.0 file into your blog. This is useful if you want to import your posts from a system that is not handled by a custom import tool. Pick an RSS file to upload and click Import.' ) . '</p>' ;
2005-11-15 18:39:32 -05:00
wp_import_upload_form ( " admin.php?import=rss&step=1 " );
2006-10-05 21:14:47 -04:00
echo '</div>' ;
2005-08-21 03:03:23 -04:00
}
function get_posts () {
2005-09-10 18:45:32 -04:00
global $wpdb ;
2006-02-12 02:53:23 -05:00
2005-08-21 03:03:23 -04:00
set_magic_quotes_runtime ( 0 );
2005-11-15 18:39:32 -05:00
$datalines = file ( $this -> file ); // Read the file into an array
2005-08-21 03:03:23 -04:00
$importdata = implode ( '' , $datalines ); // squish it
$importdata = str_replace ( array ( " \r \n " , " \r " ), " \n " , $importdata );
2005-09-10 18:45:32 -04:00
preg_match_all ( '|<item>(.*?)</item>|is' , $importdata , $this -> posts );
$this -> posts = $this -> posts [ 1 ];
$index = 0 ;
foreach ( $this -> posts as $post ) {
preg_match ( '|<title>(.*?)</title>|is' , $post , $post_title );
2006-08-31 13:36:35 -04:00
$post_title = str_replace ( array ( '<![CDATA[' , ']]>' ), '' , $wpdb -> escape ( trim ( $post_title [ 1 ]) ));
2005-09-10 18:45:32 -04:00
2006-08-31 13:34:56 -04:00
preg_match ( '|<pubdate>(.*?)</pubdate>|is' , $post , $post_date_gmt );
2005-09-10 18:45:32 -04:00
2006-08-31 13:34:56 -04:00
if ( $post_date_gmt ) {
$post_date_gmt = strtotime ( $post_date_gmt [ 1 ]);
2005-09-10 18:45:32 -04:00
} else {
// if we don't already have something from pubDate
2006-08-31 13:34:56 -04:00
preg_match ( '|<dc:date>(.*?)</dc:date>|is' , $post , $post_date_gmt );
$post_date_gmt = preg_replace ( '|([-+])([0-9]+):([0-9]+)$|' , '\1\2\3' , $post_date_gmt [ 1 ]);
$post_date_gmt = str_replace ( 'T' , ' ' , $post_date_gmt );
$post_date_gmt = strtotime ( $post_date_gmt );
2005-09-10 18:45:32 -04:00
}
2006-08-31 13:34:56 -04:00
$post_date_gmt = gmdate ( 'Y-m-d H:i:s' , $post_date_gmt );
$post_date = get_date_from_gmt ( $post_date_gmt );
2005-09-10 18:45:32 -04:00
preg_match_all ( '|<category>(.*?)</category>|is' , $post , $categories );
$categories = $categories [ 1 ];
if ( ! $categories ) {
preg_match_all ( '|<dc:subject>(.*?)</dc:subject>|is' , $post , $categories );
$categories = $categories [ 1 ];
}
$cat_index = 0 ;
foreach ( $categories as $category ) {
$categories [ $cat_index ] = $wpdb -> escape ( $this -> unhtmlentities ( $category ));
$cat_index ++ ;
}
2008-01-10 16:27:08 -05:00
preg_match ( '|<guid.*?>(.*?)</guid>|is' , $post , $guid );
2005-09-10 18:45:32 -04:00
if ( $guid )
$guid = $wpdb -> escape ( trim ( $guid [ 1 ]));
else
$guid = '' ;
preg_match ( '|<content:encoded>(.*?)</content:encoded>|is' , $post , $post_content );
$post_content = str_replace ( array ( '<![CDATA[' , ']]>' ), '' , $wpdb -> escape ( trim ( $post_content [ 1 ])));
if ( ! $post_content ) {
// This is for feeds that put content in description
preg_match ( '|<description>(.*?)</description>|is' , $post , $post_content );
$post_content = $wpdb -> escape ( $this -> unhtmlentities ( trim ( $post_content [ 1 ])));
}
// Clean up content
2009-01-09 14:29:35 -05:00
$post_content = preg_replace_callback ( '|<(/?[A-Z]+)|' , create_function ( '$match' , 'return "<" . strtolower($match[1]);' ), $post_content );
2005-09-10 18:45:32 -04:00
$post_content = str_replace ( '<br>' , '<br />' , $post_content );
$post_content = str_replace ( '<hr>' , '<hr />' , $post_content );
$post_author = 1 ;
$post_status = 'publish' ;
2006-08-31 13:34:56 -04:00
$this -> posts [ $index ] = compact ( 'post_author' , 'post_date' , 'post_date_gmt' , 'post_content' , 'post_title' , 'post_status' , 'guid' , 'categories' );
2005-09-10 18:45:32 -04:00
$index ++ ;
}
2005-08-21 03:03:23 -04:00
}
function import_posts () {
echo '<ol>' ;
2005-09-10 18:45:32 -04:00
foreach ( $this -> posts as $post ) {
echo " <li> " . __ ( 'Importing post...' );
2005-08-21 03:03:23 -04:00
2005-09-10 18:45:32 -04:00
extract ( $post );
2005-08-21 03:03:23 -04:00
2005-09-10 18:45:32 -04:00
if ( $post_id = post_exists ( $post_title , $post_content , $post_date )) {
2005-12-02 17:37:02 -05:00
_e ( 'Post already imported' );
2005-09-10 18:45:32 -04:00
} else {
$post_id = wp_insert_post ( $post );
2007-09-18 12:32:22 -04:00
if ( is_wp_error ( $post_id ) )
return $post_id ;
2005-11-15 18:39:32 -05:00
if ( ! $post_id ) {
2009-05-05 00:28:05 -04:00
_e ( 'Couldn’t get post ID' );
2005-11-15 18:39:32 -05:00
return ;
}
2005-09-10 18:45:32 -04:00
if ( 0 != count ( $categories ))
wp_create_categories ( $categories , $post_id );
2005-12-02 17:37:02 -05:00
_e ( 'Done !' );
2005-09-10 18:45:32 -04:00
}
echo '</li>' ;
2005-08-21 03:03:23 -04:00
}
echo '</ol>' ;
}
2005-09-10 18:45:32 -04:00
2005-08-21 03:03:23 -04:00
function import () {
2005-11-15 18:39:32 -05:00
$file = wp_import_handle_upload ();
if ( isset ( $file [ 'error' ]) ) {
echo $file [ 'error' ];
return ;
}
2005-09-10 18:45:32 -04:00
2005-11-15 18:39:32 -05:00
$this -> file = $file [ 'file' ];
2005-08-21 03:03:23 -04:00
$this -> get_posts ();
2007-09-18 12:32:22 -04:00
$result = $this -> import_posts ();
if ( is_wp_error ( $result ) )
return $result ;
2005-11-15 21:07:56 -05:00
wp_import_cleanup ( $file [ 'id' ]);
2007-12-22 20:10:29 -05:00
do_action ( 'import_done' , 'rss' );
2006-02-12 02:53:23 -05:00
2005-12-02 17:37:02 -05:00
echo '<h3>' ;
printf ( __ ( 'All done. <a href="%s">Have fun!</a>' ), get_option ( 'home' ));
echo '</h3>' ;
2005-08-21 03:03:23 -04:00
}
2005-09-10 18:45:32 -04:00
2005-08-21 03:03:23 -04:00
function dispatch () {
2005-09-10 18:45:32 -04:00
if ( empty ( $_GET [ 'step' ]))
2005-08-21 03:03:23 -04:00
$step = 0 ;
else
$step = ( int ) $_GET [ 'step' ];
2005-09-10 18:45:32 -04:00
2005-09-10 20:00:18 -04:00
$this -> header ();
2006-02-12 02:53:23 -05:00
2005-08-21 03:03:23 -04:00
switch ( $step ) {
2005-09-10 18:45:32 -04:00
case 0 :
2005-08-21 03:03:23 -04:00
$this -> greet ();
break ;
2005-09-10 18:45:32 -04:00
case 1 :
2007-05-07 11:56:53 -04:00
check_admin_referer ( 'import-upload' );
2007-09-18 12:32:22 -04:00
$result = $this -> import ();
if ( is_wp_error ( $result ) )
echo $result -> get_error_message ();
2005-08-21 03:03:23 -04:00
break ;
}
2006-02-12 02:53:23 -05:00
2005-09-10 20:00:18 -04:00
$this -> footer ();
2005-08-21 03:03:23 -04:00
}
2005-09-10 18:45:32 -04:00
2005-08-21 03:03:23 -04:00
function RSS_Import () {
2006-02-12 02:53:23 -05:00
// Nothing.
2005-08-21 03:03:23 -04:00
}
}
$rss_import = new RSS_Import ();
2008-02-27 17:05:50 -05:00
register_importer ( 'rss' , __ ( 'RSS' ), __ ( 'Import posts from an RSS feed.' ), array ( $rss_import , 'dispatch' ));
2005-12-02 17:37:02 -05:00
?>