[44] | 1 | <?php
|
---|
| 2 | /**
|
---|
| 3 | * WordPress Export Administration API
|
---|
| 4 | *
|
---|
| 5 | * @package WordPress
|
---|
| 6 | * @subpackage Administration
|
---|
| 7 | */
|
---|
| 8 |
|
---|
| 9 | /**
|
---|
| 10 | * Version number for the export format.
|
---|
| 11 | *
|
---|
| 12 | * Bump this when something changes that might affect compatibility.
|
---|
| 13 | *
|
---|
| 14 | * @since unknown
|
---|
| 15 | * @var string
|
---|
| 16 | */
|
---|
| 17 | define('WXR_VERSION', '1.0');
|
---|
| 18 |
|
---|
| 19 | /**
|
---|
| 20 | * {@internal Missing Short Description}}
|
---|
| 21 | *
|
---|
| 22 | * @since unknown
|
---|
| 23 | *
|
---|
| 24 | * @param unknown_type $author
|
---|
| 25 | */
|
---|
| 26 | function export_wp($author='') {
|
---|
| 27 | global $wpdb, $post_ids, $post;
|
---|
| 28 |
|
---|
| 29 | do_action('export_wp');
|
---|
| 30 |
|
---|
| 31 | $filename = 'wordpress.' . date('Y-m-d') . '.xml';
|
---|
| 32 |
|
---|
| 33 | header('Content-Description: File Transfer');
|
---|
| 34 | header("Content-Disposition: attachment; filename=$filename");
|
---|
| 35 | header('Content-Type: text/xml; charset=' . get_option('blog_charset'), true);
|
---|
| 36 |
|
---|
| 37 | $where = '';
|
---|
| 38 | if ( $author and $author != 'all' ) {
|
---|
| 39 | $author_id = (int) $author;
|
---|
| 40 | $where = $wpdb->prepare(" WHERE post_author = %d ", $author_id);
|
---|
| 41 | }
|
---|
| 42 |
|
---|
| 43 | // grab a snapshot of post IDs, just in case it changes during the export
|
---|
| 44 | $post_ids = $wpdb->get_col("SELECT ID FROM $wpdb->posts $where ORDER BY post_date_gmt ASC");
|
---|
| 45 |
|
---|
| 46 | $categories = (array) get_categories('get=all');
|
---|
| 47 | $tags = (array) get_tags('get=all');
|
---|
| 48 |
|
---|
| 49 | /**
|
---|
| 50 | * {@internal Missing Short Description}}
|
---|
| 51 | *
|
---|
| 52 | * @since unknown
|
---|
| 53 | *
|
---|
| 54 | * @param unknown_type $categories
|
---|
| 55 | */
|
---|
| 56 | function wxr_missing_parents($categories) {
|
---|
| 57 | if ( !is_array($categories) || empty($categories) )
|
---|
| 58 | return array();
|
---|
| 59 |
|
---|
| 60 | foreach ( $categories as $category )
|
---|
| 61 | $parents[$category->term_id] = $category->parent;
|
---|
| 62 |
|
---|
| 63 | $parents = array_unique(array_diff($parents, array_keys($parents)));
|
---|
| 64 |
|
---|
| 65 | if ( $zero = array_search('0', $parents) )
|
---|
| 66 | unset($parents[$zero]);
|
---|
| 67 |
|
---|
| 68 | return $parents;
|
---|
| 69 | }
|
---|
| 70 |
|
---|
| 71 | while ( $parents = wxr_missing_parents($categories) ) {
|
---|
| 72 | $found_parents = get_categories("include=" . join(', ', $parents));
|
---|
| 73 | if ( is_array($found_parents) && count($found_parents) )
|
---|
| 74 | $categories = array_merge($categories, $found_parents);
|
---|
| 75 | else
|
---|
| 76 | break;
|
---|
| 77 | }
|
---|
| 78 |
|
---|
| 79 | // Put them in order to be inserted with no child going before its parent
|
---|
| 80 | $pass = 0;
|
---|
| 81 | $passes = 1000 + count($categories);
|
---|
| 82 | while ( ( $cat = array_shift($categories) ) && ++$pass < $passes ) {
|
---|
| 83 | if ( $cat->parent == 0 || isset($cats[$cat->parent]) ) {
|
---|
| 84 | $cats[$cat->term_id] = $cat;
|
---|
| 85 | } else {
|
---|
| 86 | $categories[] = $cat;
|
---|
| 87 | }
|
---|
| 88 | }
|
---|
| 89 | unset($categories);
|
---|
| 90 |
|
---|
| 91 | /**
|
---|
| 92 | * Place string in CDATA tag.
|
---|
| 93 | *
|
---|
| 94 | * @since unknown
|
---|
| 95 | *
|
---|
| 96 | * @param string $str String to place in XML CDATA tag.
|
---|
| 97 | */
|
---|
| 98 | function wxr_cdata($str) {
|
---|
| 99 | if ( seems_utf8($str) == false )
|
---|
| 100 | $str = utf8_encode($str);
|
---|
| 101 |
|
---|
| 102 | // $str = ent2ncr(esc_html($str));
|
---|
| 103 |
|
---|
| 104 | $str = "<![CDATA[$str" . ( ( substr($str, -1) == ']' ) ? ' ' : '') . "]]>";
|
---|
| 105 |
|
---|
| 106 | return $str;
|
---|
| 107 | }
|
---|
| 108 |
|
---|
| 109 | /**
|
---|
| 110 | * {@internal Missing Short Description}}
|
---|
| 111 | *
|
---|
| 112 | * @since unknown
|
---|
| 113 | *
|
---|
| 114 | * @return string Site URL.
|
---|
| 115 | */
|
---|
| 116 | function wxr_site_url() {
|
---|
| 117 | global $current_site;
|
---|
| 118 |
|
---|
| 119 | // mu: the base url
|
---|
| 120 | if ( isset($current_site->domain) ) {
|
---|
| 121 | return 'http://'.$current_site->domain.$current_site->path;
|
---|
| 122 | }
|
---|
| 123 | // wp: the blog url
|
---|
| 124 | else {
|
---|
| 125 | return get_bloginfo_rss('url');
|
---|
| 126 | }
|
---|
| 127 | }
|
---|
| 128 |
|
---|
| 129 | /**
|
---|
| 130 | * {@internal Missing Short Description}}
|
---|
| 131 | *
|
---|
| 132 | * @since unknown
|
---|
| 133 | *
|
---|
| 134 | * @param object $c Category Object
|
---|
| 135 | */
|
---|
| 136 | function wxr_cat_name($c) {
|
---|
| 137 | if ( empty($c->name) )
|
---|
| 138 | return;
|
---|
| 139 |
|
---|
| 140 | echo '<wp:cat_name>' . wxr_cdata($c->name) . '</wp:cat_name>';
|
---|
| 141 | }
|
---|
| 142 |
|
---|
| 143 | /**
|
---|
| 144 | * {@internal Missing Short Description}}
|
---|
| 145 | *
|
---|
| 146 | * @since unknown
|
---|
| 147 | *
|
---|
| 148 | * @param object $c Category Object
|
---|
| 149 | */
|
---|
| 150 | function wxr_category_description($c) {
|
---|
| 151 | if ( empty($c->description) )
|
---|
| 152 | return;
|
---|
| 153 |
|
---|
| 154 | echo '<wp:category_description>' . wxr_cdata($c->description) . '</wp:category_description>';
|
---|
| 155 | }
|
---|
| 156 |
|
---|
| 157 | /**
|
---|
| 158 | * {@internal Missing Short Description}}
|
---|
| 159 | *
|
---|
| 160 | * @since unknown
|
---|
| 161 | *
|
---|
| 162 | * @param object $t Tag Object
|
---|
| 163 | */
|
---|
| 164 | function wxr_tag_name($t) {
|
---|
| 165 | if ( empty($t->name) )
|
---|
| 166 | return;
|
---|
| 167 |
|
---|
| 168 | echo '<wp:tag_name>' . wxr_cdata($t->name) . '</wp:tag_name>';
|
---|
| 169 | }
|
---|
| 170 |
|
---|
| 171 | /**
|
---|
| 172 | * {@internal Missing Short Description}}
|
---|
| 173 | *
|
---|
| 174 | * @since unknown
|
---|
| 175 | *
|
---|
| 176 | * @param object $t Tag Object
|
---|
| 177 | */
|
---|
| 178 | function wxr_tag_description($t) {
|
---|
| 179 | if ( empty($t->description) )
|
---|
| 180 | return;
|
---|
| 181 |
|
---|
| 182 | echo '<wp:tag_description>' . wxr_cdata($t->description) . '</wp:tag_description>';
|
---|
| 183 | }
|
---|
| 184 |
|
---|
| 185 | /**
|
---|
| 186 | * {@internal Missing Short Description}}
|
---|
| 187 | *
|
---|
| 188 | * @since unknown
|
---|
| 189 | */
|
---|
| 190 | function wxr_post_taxonomy() {
|
---|
| 191 | $categories = get_the_category();
|
---|
| 192 | $tags = get_the_tags();
|
---|
| 193 | $the_list = '';
|
---|
| 194 | $filter = 'rss';
|
---|
| 195 |
|
---|
| 196 | if ( !empty($categories) ) foreach ( (array) $categories as $category ) {
|
---|
| 197 | $cat_name = sanitize_term_field('name', $category->name, $category->term_id, 'category', $filter);
|
---|
| 198 | // for backwards compatibility
|
---|
| 199 | $the_list .= "\n\t\t<category><![CDATA[$cat_name]]></category>\n";
|
---|
| 200 | // forwards compatibility: use a unique identifier for each cat to avoid clashes
|
---|
| 201 | // http://trac.wordpress.org/ticket/5447
|
---|
| 202 | $the_list .= "\n\t\t<category domain=\"category\" nicename=\"{$category->slug}\"><![CDATA[$cat_name]]></category>\n";
|
---|
| 203 | }
|
---|
| 204 |
|
---|
| 205 | if ( !empty($tags) ) foreach ( (array) $tags as $tag ) {
|
---|
| 206 | $tag_name = sanitize_term_field('name', $tag->name, $tag->term_id, 'post_tag', $filter);
|
---|
| 207 | $the_list .= "\n\t\t<category domain=\"tag\"><![CDATA[$tag_name]]></category>\n";
|
---|
| 208 | // forwards compatibility as above
|
---|
| 209 | $the_list .= "\n\t\t<category domain=\"tag\" nicename=\"{$tag->slug}\"><![CDATA[$tag_name]]></category>\n";
|
---|
| 210 | }
|
---|
| 211 |
|
---|
| 212 | echo $the_list;
|
---|
| 213 | }
|
---|
| 214 |
|
---|
| 215 | echo '<?xml version="1.0" encoding="' . get_bloginfo('charset') . '"?' . ">\n";
|
---|
| 216 |
|
---|
| 217 | ?>
|
---|
| 218 | <!-- This is a WordPress eXtended RSS file generated by WordPress as an export of your blog. -->
|
---|
| 219 | <!-- It contains information about your blog's posts, comments, and categories. -->
|
---|
| 220 | <!-- You may use this file to transfer that content from one site to another. -->
|
---|
| 221 | <!-- This file is not intended to serve as a complete backup of your blog. -->
|
---|
| 222 |
|
---|
| 223 | <!-- To import this information into a WordPress blog follow these steps. -->
|
---|
| 224 | <!-- 1. Log into that blog as an administrator. -->
|
---|
| 225 | <!-- 2. Go to Tools: Import in the blog's admin panels (or Manage: Import in older versions of WordPress). -->
|
---|
| 226 | <!-- 3. Choose "WordPress" from the list. -->
|
---|
| 227 | <!-- 4. Upload this file using the form provided on that page. -->
|
---|
| 228 | <!-- 5. You will first be asked to map the authors in this export file to users -->
|
---|
| 229 | <!-- on the blog. For each author, you may choose to map to an -->
|
---|
| 230 | <!-- existing user on the blog or to create a new user -->
|
---|
| 231 | <!-- 6. WordPress will then import each of the posts, comments, and categories -->
|
---|
| 232 | <!-- contained in this file into your blog -->
|
---|
| 233 |
|
---|
| 234 | <?php the_generator('export');?>
|
---|
| 235 | <rss version="2.0"
|
---|
| 236 | xmlns:excerpt="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/excerpt/"
|
---|
| 237 | xmlns:content="http://purl.org/rss/1.0/modules/content/"
|
---|
| 238 | xmlns:wfw="http://wellformedweb.org/CommentAPI/"
|
---|
| 239 | xmlns:dc="http://purl.org/dc/elements/1.1/"
|
---|
| 240 | xmlns:wp="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/"
|
---|
| 241 | >
|
---|
| 242 |
|
---|
| 243 | <channel>
|
---|
| 244 | <title><?php bloginfo_rss('name'); ?></title>
|
---|
| 245 | <link><?php bloginfo_rss('url') ?></link>
|
---|
| 246 | <description><?php bloginfo_rss("description") ?></description>
|
---|
| 247 | <pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?></pubDate>
|
---|
| 248 | <generator>http://wordpress.org/?v=<?php bloginfo_rss('version'); ?></generator>
|
---|
| 249 | <language><?php echo get_option('rss_language'); ?></language>
|
---|
| 250 | <wp:wxr_version><?php echo WXR_VERSION; ?></wp:wxr_version>
|
---|
| 251 | <wp:base_site_url><?php echo wxr_site_url(); ?></wp:base_site_url>
|
---|
| 252 | <wp:base_blog_url><?php bloginfo_rss('url'); ?></wp:base_blog_url>
|
---|
| 253 | <?php if ( $cats ) : foreach ( $cats as $c ) : ?>
|
---|
| 254 | <wp:category><wp:category_nicename><?php echo $c->slug; ?></wp:category_nicename><wp:category_parent><?php echo $c->parent ? $cats[$c->parent]->name : ''; ?></wp:category_parent><?php wxr_cat_name($c); ?><?php wxr_category_description($c); ?></wp:category>
|
---|
| 255 | <?php endforeach; endif; ?>
|
---|
| 256 | <?php if ( $tags ) : foreach ( $tags as $t ) : ?>
|
---|
| 257 | <wp:tag><wp:tag_slug><?php echo $t->slug; ?></wp:tag_slug><?php wxr_tag_name($t); ?><?php wxr_tag_description($t); ?></wp:tag>
|
---|
| 258 | <?php endforeach; endif; ?>
|
---|
| 259 | <?php do_action('rss2_head'); ?>
|
---|
| 260 | <?php if ($post_ids) {
|
---|
| 261 | global $wp_query;
|
---|
| 262 | $wp_query->in_the_loop = true; // Fake being in the loop.
|
---|
| 263 | // fetch 20 posts at a time rather than loading the entire table into memory
|
---|
| 264 | while ( $next_posts = array_splice($post_ids, 0, 20) ) {
|
---|
| 265 | $where = "WHERE ID IN (".join(',', $next_posts).")";
|
---|
| 266 | $posts = $wpdb->get_results("SELECT * FROM $wpdb->posts $where ORDER BY post_date_gmt ASC");
|
---|
| 267 | foreach ($posts as $post) {
|
---|
| 268 | // Don't export revisions. They bloat the export.
|
---|
| 269 | if ( 'revision' == $post->post_type )
|
---|
| 270 | continue;
|
---|
| 271 | setup_postdata($post); ?>
|
---|
| 272 | <item>
|
---|
| 273 | <title><?php echo apply_filters('the_title_rss', $post->post_title); ?></title>
|
---|
| 274 | <link><?php the_permalink_rss() ?></link>
|
---|
| 275 | <pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?></pubDate>
|
---|
| 276 | <dc:creator><?php echo wxr_cdata(get_the_author()); ?></dc:creator>
|
---|
| 277 | <?php wxr_post_taxonomy() ?>
|
---|
| 278 |
|
---|
| 279 | <guid isPermaLink="false"><?php the_guid(); ?></guid>
|
---|
| 280 | <description></description>
|
---|
| 281 | <content:encoded><?php echo wxr_cdata( apply_filters('the_content_export', $post->post_content) ); ?></content:encoded>
|
---|
| 282 | <excerpt:encoded><?php echo wxr_cdata( apply_filters('the_excerpt_export', $post->post_excerpt) ); ?></excerpt:encoded>
|
---|
| 283 | <wp:post_id><?php echo $post->ID; ?></wp:post_id>
|
---|
| 284 | <wp:post_date><?php echo $post->post_date; ?></wp:post_date>
|
---|
| 285 | <wp:post_date_gmt><?php echo $post->post_date_gmt; ?></wp:post_date_gmt>
|
---|
| 286 | <wp:comment_status><?php echo $post->comment_status; ?></wp:comment_status>
|
---|
| 287 | <wp:ping_status><?php echo $post->ping_status; ?></wp:ping_status>
|
---|
| 288 | <wp:post_name><?php echo $post->post_name; ?></wp:post_name>
|
---|
| 289 | <wp:status><?php echo $post->post_status; ?></wp:status>
|
---|
| 290 | <wp:post_parent><?php echo $post->post_parent; ?></wp:post_parent>
|
---|
| 291 | <wp:menu_order><?php echo $post->menu_order; ?></wp:menu_order>
|
---|
| 292 | <wp:post_type><?php echo $post->post_type; ?></wp:post_type>
|
---|
| 293 | <wp:post_password><?php echo $post->post_password; ?></wp:post_password>
|
---|
| 294 | <?php
|
---|
| 295 | if ($post->post_type == 'attachment') { ?>
|
---|
| 296 | <wp:attachment_url><?php echo wp_get_attachment_url($post->ID); ?></wp:attachment_url>
|
---|
| 297 | <?php } ?>
|
---|
| 298 | <?php
|
---|
| 299 | $postmeta = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID) );
|
---|
| 300 | if ( $postmeta ) {
|
---|
| 301 | ?>
|
---|
| 302 | <?php foreach( $postmeta as $meta ) { ?>
|
---|
| 303 | <wp:postmeta>
|
---|
| 304 | <wp:meta_key><?php echo $meta->meta_key; ?></wp:meta_key>
|
---|
| 305 | <wp:meta_value><?Php echo $meta->meta_value; ?></wp:meta_value>
|
---|
| 306 | </wp:postmeta>
|
---|
| 307 | <?php } ?>
|
---|
| 308 | <?php } ?>
|
---|
| 309 | <?php
|
---|
| 310 | $comments = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d", $post->ID) );
|
---|
| 311 | if ( $comments ) { foreach ( $comments as $c ) { ?>
|
---|
| 312 | <wp:comment>
|
---|
| 313 | <wp:comment_id><?php echo $c->comment_ID; ?></wp:comment_id>
|
---|
| 314 | <wp:comment_author><?php echo wxr_cdata($c->comment_author); ?></wp:comment_author>
|
---|
| 315 | <wp:comment_author_email><?php echo $c->comment_author_email; ?></wp:comment_author_email>
|
---|
| 316 | <wp:comment_author_url><?php echo $c->comment_author_url; ?></wp:comment_author_url>
|
---|
| 317 | <wp:comment_author_IP><?php echo $c->comment_author_IP; ?></wp:comment_author_IP>
|
---|
| 318 | <wp:comment_date><?php echo $c->comment_date; ?></wp:comment_date>
|
---|
| 319 | <wp:comment_date_gmt><?php echo $c->comment_date_gmt; ?></wp:comment_date_gmt>
|
---|
| 320 | <wp:comment_content><?php echo wxr_cdata($c->comment_content) ?></wp:comment_content>
|
---|
| 321 | <wp:comment_approved><?php echo $c->comment_approved; ?></wp:comment_approved>
|
---|
| 322 | <wp:comment_type><?php echo $c->comment_type; ?></wp:comment_type>
|
---|
| 323 | <wp:comment_parent><?php echo $c->comment_parent; ?></wp:comment_parent>
|
---|
| 324 | <wp:comment_user_id><?php echo $c->user_id; ?></wp:comment_user_id>
|
---|
| 325 | </wp:comment>
|
---|
| 326 | <?php } } ?>
|
---|
| 327 | </item>
|
---|
| 328 | <?php } } } ?>
|
---|
| 329 | </channel>
|
---|
| 330 | </rss>
|
---|
| 331 | <?php
|
---|
| 332 | }
|
---|
| 333 |
|
---|
| 334 | ?>
|
---|