Projects : mp-wp : mp-wp_svg-screenshots-and-errorreporting-r2
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(wp_specialchars($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 | ?> |