| [ Index ] |
PHP Cross Reference of Wordpress 2.7.1 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * RSS Importer 4 * 5 * @package WordPress 6 * @subpackage Importer 7 */ 8 9 /** 10 * RSS Importer 11 * 12 * Will process a RSS feed for importing posts into WordPress. This is a very 13 * limited importer and should only be used as the last resort, when no other 14 * importer is available. 15 * 16 * @since unknown 17 */ 18 class RSS_Import { 19 20 var $posts = array (); 21 var $file; 22 23 function header() { 24 echo '<div class="wrap">'; 25 screen_icon(); 26 echo '<h2>'.__('Import RSS').'</h2>'; 27 } 28 29 function footer() { 30 echo '</div>'; 31 } 32 33 function unhtmlentities($string) { // From php.net for < 4.3 compat 34 $trans_tbl = get_html_translation_table(HTML_ENTITIES); 35 $trans_tbl = array_flip($trans_tbl); 36 return strtr($string, $trans_tbl); 37 } 38 39 function greet() { 40 echo '<div class="narrow">'; 41 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>'; 42 wp_import_upload_form("admin.php?import=rss&step=1"); 43 echo '</div>'; 44 } 45 46 function get_posts() { 47 global $wpdb; 48 49 set_magic_quotes_runtime(0); 50 $datalines = file($this->file); // Read the file into an array 51 $importdata = implode('', $datalines); // squish it 52 $importdata = str_replace(array ("\r\n", "\r"), "\n", $importdata); 53 54 preg_match_all('|<item>(.*?)</item>|is', $importdata, $this->posts); 55 $this->posts = $this->posts[1]; 56 $index = 0; 57 foreach ($this->posts as $post) { 58 preg_match('|<title>(.*?)</title>|is', $post, $post_title); 59 $post_title = str_replace(array('<![CDATA[', ']]>'), '', $wpdb->escape( trim($post_title[1]) )); 60 61 preg_match('|<pubdate>(.*?)</pubdate>|is', $post, $post_date_gmt); 62 63 if ($post_date_gmt) { 64 $post_date_gmt = strtotime($post_date_gmt[1]); 65 } else { 66 // if we don't already have something from pubDate 67 preg_match('|<dc:date>(.*?)</dc:date>|is', $post, $post_date_gmt); 68 $post_date_gmt = preg_replace('|([-+])([0-9]+):([0-9]+)$|', '\1\2\3', $post_date_gmt[1]); 69 $post_date_gmt = str_replace('T', ' ', $post_date_gmt); 70 $post_date_gmt = strtotime($post_date_gmt); 71 } 72 73 $post_date_gmt = gmdate('Y-m-d H:i:s', $post_date_gmt); 74 $post_date = get_date_from_gmt( $post_date_gmt ); 75 76 preg_match_all('|<category>(.*?)</category>|is', $post, $categories); 77 $categories = $categories[1]; 78 79 if (!$categories) { 80 preg_match_all('|<dc:subject>(.*?)</dc:subject>|is', $post, $categories); 81 $categories = $categories[1]; 82 } 83 84 $cat_index = 0; 85 foreach ($categories as $category) { 86 $categories[$cat_index] = $wpdb->escape($this->unhtmlentities($category)); 87 $cat_index++; 88 } 89 90 preg_match('|<guid.*?>(.*?)</guid>|is', $post, $guid); 91 if ($guid) 92 $guid = $wpdb->escape(trim($guid[1])); 93 else 94 $guid = ''; 95 96 preg_match('|<content:encoded>(.*?)</content:encoded>|is', $post, $post_content); 97 $post_content = str_replace(array ('<![CDATA[', ']]>'), '', $wpdb->escape(trim($post_content[1]))); 98 99 if (!$post_content) { 100 // This is for feeds that put content in description 101 preg_match('|<description>(.*?)</description>|is', $post, $post_content); 102 $post_content = $wpdb->escape($this->unhtmlentities(trim($post_content[1]))); 103 } 104 105 // Clean up content 106 $post_content = preg_replace_callback('|<(/?[A-Z]+)|', create_function('$match', 'return "<" . strtolower($match[1]);'), $post_content); 107 $post_content = str_replace('<br>', '<br />', $post_content); 108 $post_content = str_replace('<hr>', '<hr />', $post_content); 109 110 $post_author = 1; 111 $post_status = 'publish'; 112 $this->posts[$index] = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_status', 'guid', 'categories'); 113 $index++; 114 } 115 } 116 117 function import_posts() { 118 echo '<ol>'; 119 120 foreach ($this->posts as $post) { 121 echo "<li>".__('Importing post...'); 122 123 extract($post); 124 125 if ($post_id = post_exists($post_title, $post_content, $post_date)) { 126 _e('Post already imported'); 127 } else { 128 $post_id = wp_insert_post($post); 129 if ( is_wp_error( $post_id ) ) 130 return $post_id; 131 if (!$post_id) { 132 _e("Couldn't get post ID"); 133 return; 134 } 135 136 if (0 != count($categories)) 137 wp_create_categories($categories, $post_id); 138 _e('Done !'); 139 } 140 echo '</li>'; 141 } 142 143 echo '</ol>'; 144 145 } 146 147 function import() { 148 $file = wp_import_handle_upload(); 149 if ( isset($file['error']) ) { 150 echo $file['error']; 151 return; 152 } 153 154 $this->file = $file['file']; 155 $this->get_posts(); 156 $result = $this->import_posts(); 157 if ( is_wp_error( $result ) ) 158 return $result; 159 wp_import_cleanup($file['id']); 160 do_action('import_done', 'rss'); 161 162 echo '<h3>'; 163 printf(__('All done. <a href="%s">Have fun!</a>'), get_option('home')); 164 echo '</h3>'; 165 } 166 167 function dispatch() { 168 if (empty ($_GET['step'])) 169 $step = 0; 170 else 171 $step = (int) $_GET['step']; 172 173 $this->header(); 174 175 switch ($step) { 176 case 0 : 177 $this->greet(); 178 break; 179 case 1 : 180 check_admin_referer('import-upload'); 181 $result = $this->import(); 182 if ( is_wp_error( $result ) ) 183 echo $result->get_error_message(); 184 break; 185 } 186 187 $this->footer(); 188 } 189 190 function RSS_Import() { 191 // Nothing. 192 } 193 } 194 195 $rss_import = new RSS_Import(); 196 197 register_importer('rss', __('RSS'), __('Import posts from an RSS feed.'), array ($rss_import, 'dispatch')); 198 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Mon Mar 23 16:23:02 2009 | Cross-referenced by PHPXref 0.7 |