~canonical-sysadmins/wordpress/4.7.2

« back to all changes in this revision

Viewing changes to wp-admin/includes/export.php

  • Committer: Jacek Nykis
  • Date: 2015-01-05 16:17:05 UTC
  • Revision ID: jacek.nykis@canonical.com-20150105161705-w544l1h5mcg7u4w9
Initial commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 2.5.0
 
15
 */
 
16
define( 'WXR_VERSION', '1.2' );
 
17
 
 
18
/**
 
19
 * Generates the WXR export file for download
 
20
 *
 
21
 * @since 2.1.0
 
22
 *
 
23
 * @param array $args Filters defining what should be included in the export
 
24
 */
 
25
function export_wp( $args = array() ) {
 
26
        global $wpdb, $post;
 
27
 
 
28
        $defaults = array( 'content' => 'all', 'author' => false, 'category' => false,
 
29
                'start_date' => false, 'end_date' => false, 'status' => false,
 
30
        );
 
31
        $args = wp_parse_args( $args, $defaults );
 
32
 
 
33
        /**
 
34
         * Fires at the beginning of an export, before any headers are sent.
 
35
         *
 
36
         * @since 2.3.0
 
37
         *
 
38
         * @param array $args An array of export arguments.
 
39
         */
 
40
        do_action( 'export_wp', $args );
 
41
 
 
42
        $sitename = sanitize_key( get_bloginfo( 'name' ) );
 
43
        if ( ! empty($sitename) ) $sitename .= '.';
 
44
        $filename = $sitename . 'wordpress.' . date( 'Y-m-d' ) . '.xml';
 
45
 
 
46
        header( 'Content-Description: File Transfer' );
 
47
        header( 'Content-Disposition: attachment; filename=' . $filename );
 
48
        header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true );
 
49
 
 
50
        if ( 'all' != $args['content'] && post_type_exists( $args['content'] ) ) {
 
51
                $ptype = get_post_type_object( $args['content'] );
 
52
                if ( ! $ptype->can_export )
 
53
                        $args['content'] = 'post';
 
54
 
 
55
                $where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $args['content'] );
 
56
        } else {
 
57
                $post_types = get_post_types( array( 'can_export' => true ) );
 
58
                $esses = array_fill( 0, count($post_types), '%s' );
 
59
                $where = $wpdb->prepare( "{$wpdb->posts}.post_type IN (" . implode( ',', $esses ) . ')', $post_types );
 
60
        }
 
61
 
 
62
        if ( $args['status'] && ( 'post' == $args['content'] || 'page' == $args['content'] ) )
 
63
                $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_status = %s", $args['status'] );
 
64
        else
 
65
                $where .= " AND {$wpdb->posts}.post_status != 'auto-draft'";
 
66
 
 
67
        $join = '';
 
68
        if ( $args['category'] && 'post' == $args['content'] ) {
 
69
                if ( $term = term_exists( $args['category'], 'category' ) ) {
 
70
                        $join = "INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)";
 
71
                        $where .= $wpdb->prepare( " AND {$wpdb->term_relationships}.term_taxonomy_id = %d", $term['term_taxonomy_id'] );
 
72
                }
 
73
        }
 
74
 
 
75
        if ( 'post' == $args['content'] || 'page' == $args['content'] ) {
 
76
                if ( $args['author'] )
 
77
                        $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_author = %d", $args['author'] );
 
78
 
 
79
                if ( $args['start_date'] )
 
80
                        $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date >= %s", date( 'Y-m-d', strtotime($args['start_date']) ) );
 
81
 
 
82
                if ( $args['end_date'] )
 
83
                        $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date < %s", date( 'Y-m-d', strtotime('+1 month', strtotime($args['end_date'])) ) );
 
84
        }
 
85
 
 
86
        // Grab a snapshot of post IDs, just in case it changes during the export.
 
87
        $post_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} $join WHERE $where" );
 
88
 
 
89
        /*
 
90
         * Get the requested terms ready, empty unless posts filtered by category
 
91
         * or all content.
 
92
         */
 
93
        $cats = $tags = $terms = array();
 
94
        if ( isset( $term ) && $term ) {
 
95
                $cat = get_term( $term['term_id'], 'category' );
 
96
                $cats = array( $cat->term_id => $cat );
 
97
                unset( $term, $cat );
 
98
        } else if ( 'all' == $args['content'] ) {
 
99
                $categories = (array) get_categories( array( 'get' => 'all' ) );
 
100
                $tags = (array) get_tags( array( 'get' => 'all' ) );
 
101
 
 
102
                $custom_taxonomies = get_taxonomies( array( '_builtin' => false ) );
 
103
                $custom_terms = (array) get_terms( $custom_taxonomies, array( 'get' => 'all' ) );
 
104
 
 
105
                // Put categories in order with no child going before its parent.
 
106
                while ( $cat = array_shift( $categories ) ) {
 
107
                        if ( $cat->parent == 0 || isset( $cats[$cat->parent] ) )
 
108
                                $cats[$cat->term_id] = $cat;
 
109
                        else
 
110
                                $categories[] = $cat;
 
111
                }
 
112
 
 
113
                // Put terms in order with no child going before its parent.
 
114
                while ( $t = array_shift( $custom_terms ) ) {
 
115
                        if ( $t->parent == 0 || isset( $terms[$t->parent] ) )
 
116
                                $terms[$t->term_id] = $t;
 
117
                        else
 
118
                                $custom_terms[] = $t;
 
119
                }
 
120
 
 
121
                unset( $categories, $custom_taxonomies, $custom_terms );
 
122
        }
 
123
 
 
124
        /**
 
125
         * Wrap given string in XML CDATA tag.
 
126
         *
 
127
         * @since 2.1.0
 
128
         *
 
129
         * @param string $str String to wrap in XML CDATA tag.
 
130
         * @return string
 
131
         */
 
132
        function wxr_cdata( $str ) {
 
133
                if ( seems_utf8( $str ) == false )
 
134
                        $str = utf8_encode( $str );
 
135
 
 
136
                // $str = ent2ncr(esc_html($str));
 
137
                $str = '<![CDATA[' . str_replace( ']]>', ']]]]><![CDATA[>', $str ) . ']]>';
 
138
 
 
139
                return $str;
 
140
        }
 
141
 
 
142
        /**
 
143
         * Return the URL of the site
 
144
         *
 
145
         * @since 2.5.0
 
146
         *
 
147
         * @return string Site URL.
 
148
         */
 
149
        function wxr_site_url() {
 
150
                // Multisite: the base URL.
 
151
                if ( is_multisite() )
 
152
                        return network_home_url();
 
153
                // WordPress (single site): the blog URL.
 
154
                else
 
155
                        return get_bloginfo_rss( 'url' );
 
156
        }
 
157
 
 
158
        /**
 
159
         * Output a cat_name XML tag from a given category object
 
160
         *
 
161
         * @since 2.1.0
 
162
         *
 
163
         * @param object $category Category Object
 
164
         */
 
165
        function wxr_cat_name( $category ) {
 
166
                if ( empty( $category->name ) )
 
167
                        return;
 
168
 
 
169
                echo '<wp:cat_name>' . wxr_cdata( $category->name ) . '</wp:cat_name>';
 
170
        }
 
171
 
 
172
        /**
 
173
         * Output a category_description XML tag from a given category object
 
174
         *
 
175
         * @since 2.1.0
 
176
         *
 
177
         * @param object $category Category Object
 
178
         */
 
179
        function wxr_category_description( $category ) {
 
180
                if ( empty( $category->description ) )
 
181
                        return;
 
182
 
 
183
                echo '<wp:category_description>' . wxr_cdata( $category->description ) . '</wp:category_description>';
 
184
        }
 
185
 
 
186
        /**
 
187
         * Output a tag_name XML tag from a given tag object
 
188
         *
 
189
         * @since 2.3.0
 
190
         *
 
191
         * @param object $tag Tag Object
 
192
         */
 
193
        function wxr_tag_name( $tag ) {
 
194
                if ( empty( $tag->name ) )
 
195
                        return;
 
196
 
 
197
                echo '<wp:tag_name>' . wxr_cdata( $tag->name ) . '</wp:tag_name>';
 
198
        }
 
199
 
 
200
        /**
 
201
         * Output a tag_description XML tag from a given tag object
 
202
         *
 
203
         * @since 2.3.0
 
204
         *
 
205
         * @param object $tag Tag Object
 
206
         */
 
207
        function wxr_tag_description( $tag ) {
 
208
                if ( empty( $tag->description ) )
 
209
                        return;
 
210
 
 
211
                echo '<wp:tag_description>' . wxr_cdata( $tag->description ) . '</wp:tag_description>';
 
212
        }
 
213
 
 
214
        /**
 
215
         * Output a term_name XML tag from a given term object
 
216
         *
 
217
         * @since 2.9.0
 
218
         *
 
219
         * @param object $term Term Object
 
220
         */
 
221
        function wxr_term_name( $term ) {
 
222
                if ( empty( $term->name ) )
 
223
                        return;
 
224
 
 
225
                echo '<wp:term_name>' . wxr_cdata( $term->name ) . '</wp:term_name>';
 
226
        }
 
227
 
 
228
        /**
 
229
         * Output a term_description XML tag from a given term object
 
230
         *
 
231
         * @since 2.9.0
 
232
         *
 
233
         * @param object $term Term Object
 
234
         */
 
235
        function wxr_term_description( $term ) {
 
236
                if ( empty( $term->description ) )
 
237
                        return;
 
238
 
 
239
                echo '<wp:term_description>' . wxr_cdata( $term->description ) . '</wp:term_description>';
 
240
        }
 
241
 
 
242
        /**
 
243
         * Output list of authors with posts
 
244
         *
 
245
         * @since 3.1.0
 
246
         *
 
247
         * @param array $post_ids Array of post IDs to filter the query by. Optional.
 
248
         */
 
249
        function wxr_authors_list( array $post_ids = null ) {
 
250
                global $wpdb;
 
251
 
 
252
                if ( !empty( $post_ids ) ) {
 
253
                        $post_ids = array_map( 'absint', $post_ids );
 
254
                        $and = 'AND ID IN ( ' . implode( ', ', $post_ids ) . ')';
 
255
                } else {
 
256
                        $and = '';
 
257
                }
 
258
 
 
259
                $authors = array();
 
260
                $results = $wpdb->get_results( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_status != 'auto-draft' $and" );
 
261
                foreach ( (array) $results as $result )
 
262
                        $authors[] = get_userdata( $result->post_author );
 
263
 
 
264
                $authors = array_filter( $authors );
 
265
 
 
266
                foreach ( $authors as $author ) {
 
267
                        echo "\t<wp:author>";
 
268
                        echo '<wp:author_id>' . $author->ID . '</wp:author_id>';
 
269
                        echo '<wp:author_login>' . $author->user_login . '</wp:author_login>';
 
270
                        echo '<wp:author_email>' . $author->user_email . '</wp:author_email>';
 
271
                        echo '<wp:author_display_name>' . wxr_cdata( $author->display_name ) . '</wp:author_display_name>';
 
272
                        echo '<wp:author_first_name>' . wxr_cdata( $author->user_firstname ) . '</wp:author_first_name>';
 
273
                        echo '<wp:author_last_name>' . wxr_cdata( $author->user_lastname ) . '</wp:author_last_name>';
 
274
                        echo "</wp:author>\n";
 
275
                }
 
276
        }
 
277
 
 
278
        /**
 
279
         * Ouput all navigation menu terms
 
280
         *
 
281
         * @since 3.1.0
 
282
         */
 
283
        function wxr_nav_menu_terms() {
 
284
                $nav_menus = wp_get_nav_menus();
 
285
                if ( empty( $nav_menus ) || ! is_array( $nav_menus ) )
 
286
                        return;
 
287
 
 
288
                foreach ( $nav_menus as $menu ) {
 
289
                        echo "\t<wp:term><wp:term_id>{$menu->term_id}</wp:term_id><wp:term_taxonomy>nav_menu</wp:term_taxonomy><wp:term_slug>{$menu->slug}</wp:term_slug>";
 
290
                        wxr_term_name( $menu );
 
291
                        echo "</wp:term>\n";
 
292
                }
 
293
        }
 
294
 
 
295
        /**
 
296
         * Output list of taxonomy terms, in XML tag format, associated with a post
 
297
         *
 
298
         * @since 2.3.0
 
299
         */
 
300
        function wxr_post_taxonomy() {
 
301
                $post = get_post();
 
302
 
 
303
                $taxonomies = get_object_taxonomies( $post->post_type );
 
304
                if ( empty( $taxonomies ) )
 
305
                        return;
 
306
                $terms = wp_get_object_terms( $post->ID, $taxonomies );
 
307
 
 
308
                foreach ( (array) $terms as $term ) {
 
309
                        echo "\t\t<category domain=\"{$term->taxonomy}\" nicename=\"{$term->slug}\">" . wxr_cdata( $term->name ) . "</category>\n";
 
310
                }
 
311
        }
 
312
 
 
313
        function wxr_filter_postmeta( $return_me, $meta_key ) {
 
314
                if ( '_edit_lock' == $meta_key )
 
315
                        $return_me = true;
 
316
                return $return_me;
 
317
        }
 
318
        add_filter( 'wxr_export_skip_postmeta', 'wxr_filter_postmeta', 10, 2 );
 
319
 
 
320
        echo '<?xml version="1.0" encoding="' . get_bloginfo('charset') . "\" ?>\n";
 
321
 
 
322
        ?>
 
323
<!-- This is a WordPress eXtended RSS file generated by WordPress as an export of your site. -->
 
324
<!-- It contains information about your site's posts, pages, comments, categories, and other content. -->
 
325
<!-- You may use this file to transfer that content from one site to another. -->
 
326
<!-- This file is not intended to serve as a complete backup of your site. -->
 
327
 
 
328
<!-- To import this information into a WordPress site follow these steps: -->
 
329
<!-- 1. Log in to that site as an administrator. -->
 
330
<!-- 2. Go to Tools: Import in the WordPress admin panel. -->
 
331
<!-- 3. Install the "WordPress" importer from the list. -->
 
332
<!-- 4. Activate & Run Importer. -->
 
333
<!-- 5. Upload this file using the form provided on that page. -->
 
334
<!-- 6. You will first be asked to map the authors in this export file to users -->
 
335
<!--    on the site. For each author, you may choose to map to an -->
 
336
<!--    existing user on the site or to create a new user. -->
 
337
<!-- 7. WordPress will then import each of the posts, pages, comments, categories, etc. -->
 
338
<!--    contained in this file into your site. -->
 
339
 
 
340
<?php the_generator( 'export' ); ?>
 
341
<rss version="2.0"
 
342
        xmlns:excerpt="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/excerpt/"
 
343
        xmlns:content="http://purl.org/rss/1.0/modules/content/"
 
344
        xmlns:wfw="http://wellformedweb.org/CommentAPI/"
 
345
        xmlns:dc="http://purl.org/dc/elements/1.1/"
 
346
        xmlns:wp="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/"
 
347
>
 
348
 
 
349
<channel>
 
350
        <title><?php bloginfo_rss( 'name' ); ?></title>
 
351
        <link><?php bloginfo_rss( 'url' ); ?></link>
 
352
        <description><?php bloginfo_rss( 'description' ); ?></description>
 
353
        <pubDate><?php echo date( 'D, d M Y H:i:s +0000' ); ?></pubDate>
 
354
        <language><?php bloginfo_rss( 'language' ); ?></language>
 
355
        <wp:wxr_version><?php echo WXR_VERSION; ?></wp:wxr_version>
 
356
        <wp:base_site_url><?php echo wxr_site_url(); ?></wp:base_site_url>
 
357
        <wp:base_blog_url><?php bloginfo_rss( 'url' ); ?></wp:base_blog_url>
 
358
 
 
359
<?php wxr_authors_list( $post_ids ); ?>
 
360
 
 
361
<?php foreach ( $cats as $c ) : ?>
 
362
        <wp:category><wp:term_id><?php echo $c->term_id ?></wp:term_id><wp:category_nicename><?php echo $c->slug; ?></wp:category_nicename><wp:category_parent><?php echo $c->parent ? $cats[$c->parent]->slug : ''; ?></wp:category_parent><?php wxr_cat_name( $c ); ?><?php wxr_category_description( $c ); ?></wp:category>
 
363
<?php endforeach; ?>
 
364
<?php foreach ( $tags as $t ) : ?>
 
365
        <wp:tag><wp:term_id><?php echo $t->term_id ?></wp:term_id><wp:tag_slug><?php echo $t->slug; ?></wp:tag_slug><?php wxr_tag_name( $t ); ?><?php wxr_tag_description( $t ); ?></wp:tag>
 
366
<?php endforeach; ?>
 
367
<?php foreach ( $terms as $t ) : ?>
 
368
        <wp:term><wp:term_id><?php echo $t->term_id ?></wp:term_id><wp:term_taxonomy><?php echo $t->taxonomy; ?></wp:term_taxonomy><wp:term_slug><?php echo $t->slug; ?></wp:term_slug><wp:term_parent><?php echo $t->parent ? $terms[$t->parent]->slug : ''; ?></wp:term_parent><?php wxr_term_name( $t ); ?><?php wxr_term_description( $t ); ?></wp:term>
 
369
<?php endforeach; ?>
 
370
<?php if ( 'all' == $args['content'] ) wxr_nav_menu_terms(); ?>
 
371
 
 
372
        <?php
 
373
        /** This action is documented in wp-includes/feed-rss2.php */
 
374
        do_action( 'rss2_head' );
 
375
        ?>
 
376
 
 
377
<?php if ( $post_ids ) {
 
378
        global $wp_query;
 
379
 
 
380
        // Fake being in the loop.
 
381
        $wp_query->in_the_loop = true;
 
382
 
 
383
        // Fetch 20 posts at a time rather than loading the entire table into memory.
 
384
        while ( $next_posts = array_splice( $post_ids, 0, 20 ) ) {
 
385
        $where = 'WHERE ID IN (' . join( ',', $next_posts ) . ')';
 
386
        $posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" );
 
387
 
 
388
        // Begin Loop.
 
389
        foreach ( $posts as $post ) {
 
390
                setup_postdata( $post );
 
391
                $is_sticky = is_sticky( $post->ID ) ? 1 : 0;
 
392
?>
 
393
        <item>
 
394
                <?php /** This filter is documented in wp-includes/feed.php */ ?>
 
395
                <title><?php echo apply_filters( 'the_title_rss', $post->post_title ); ?></title>
 
396
                <link><?php the_permalink_rss() ?></link>
 
397
                <pubDate><?php echo mysql2date( 'D, d M Y H:i:s +0000', get_post_time( 'Y-m-d H:i:s', true ), false ); ?></pubDate>
 
398
                <dc:creator><?php echo wxr_cdata( get_the_author_meta( 'login' ) ); ?></dc:creator>
 
399
                <guid isPermaLink="false"><?php the_guid(); ?></guid>
 
400
                <description></description>
 
401
                <content:encoded><?php
 
402
                        /**
 
403
                         * Filter the post content used for WXR exports.
 
404
                         *
 
405
                         * @since 2.5.0
 
406
                         *
 
407
                         * @param string $post_content Content of the current post.
 
408
                         */
 
409
                        echo wxr_cdata( apply_filters( 'the_content_export', $post->post_content ) );
 
410
                ?></content:encoded>
 
411
                <excerpt:encoded><?php
 
412
                        /**
 
413
                         * Filter the post excerpt used for WXR exports.
 
414
                         *
 
415
                         * @since 2.6.0
 
416
                         *
 
417
                         * @param string $post_excerpt Excerpt for the current post.
 
418
                         */
 
419
                        echo wxr_cdata( apply_filters( 'the_excerpt_export', $post->post_excerpt ) );
 
420
                ?></excerpt:encoded>
 
421
                <wp:post_id><?php echo $post->ID; ?></wp:post_id>
 
422
                <wp:post_date><?php echo $post->post_date; ?></wp:post_date>
 
423
                <wp:post_date_gmt><?php echo $post->post_date_gmt; ?></wp:post_date_gmt>
 
424
                <wp:comment_status><?php echo $post->comment_status; ?></wp:comment_status>
 
425
                <wp:ping_status><?php echo $post->ping_status; ?></wp:ping_status>
 
426
                <wp:post_name><?php echo $post->post_name; ?></wp:post_name>
 
427
                <wp:status><?php echo $post->post_status; ?></wp:status>
 
428
                <wp:post_parent><?php echo $post->post_parent; ?></wp:post_parent>
 
429
                <wp:menu_order><?php echo $post->menu_order; ?></wp:menu_order>
 
430
                <wp:post_type><?php echo $post->post_type; ?></wp:post_type>
 
431
                <wp:post_password><?php echo $post->post_password; ?></wp:post_password>
 
432
                <wp:is_sticky><?php echo $is_sticky; ?></wp:is_sticky>
 
433
<?php   if ( $post->post_type == 'attachment' ) : ?>
 
434
                <wp:attachment_url><?php echo wp_get_attachment_url( $post->ID ); ?></wp:attachment_url>
 
435
<?php   endif; ?>
 
436
<?php   wxr_post_taxonomy(); ?>
 
437
<?php   $postmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID ) );
 
438
                foreach ( $postmeta as $meta ) :
 
439
                        /**
 
440
                         * Filter whether to selectively skip post meta used for WXR exports.
 
441
                         *
 
442
                         * Returning a truthy value to the filter will skip the current meta
 
443
                         * object from being exported.
 
444
                         *
 
445
                         * @since 3.3.0
 
446
                         *
 
447
                         * @param bool   $skip     Whether to skip the current post meta. Default false.
 
448
                         * @param string $meta_key Current meta key.
 
449
                         * @param object $meta     Current meta object.
 
450
                         */
 
451
                        if ( apply_filters( 'wxr_export_skip_postmeta', false, $meta->meta_key, $meta ) )
 
452
                                continue;
 
453
                ?>
 
454
                <wp:postmeta>
 
455
                        <wp:meta_key><?php echo $meta->meta_key; ?></wp:meta_key>
 
456
                        <wp:meta_value><?php echo wxr_cdata( $meta->meta_value ); ?></wp:meta_value>
 
457
                </wp:postmeta>
 
458
<?php   endforeach;
 
459
 
 
460
                $comments = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved <> 'spam'", $post->ID ) );
 
461
                foreach ( $comments as $c ) : ?>
 
462
                <wp:comment>
 
463
                        <wp:comment_id><?php echo $c->comment_ID; ?></wp:comment_id>
 
464
                        <wp:comment_author><?php echo wxr_cdata( $c->comment_author ); ?></wp:comment_author>
 
465
                        <wp:comment_author_email><?php echo $c->comment_author_email; ?></wp:comment_author_email>
 
466
                        <wp:comment_author_url><?php echo esc_url_raw( $c->comment_author_url ); ?></wp:comment_author_url>
 
467
                        <wp:comment_author_IP><?php echo $c->comment_author_IP; ?></wp:comment_author_IP>
 
468
                        <wp:comment_date><?php echo $c->comment_date; ?></wp:comment_date>
 
469
                        <wp:comment_date_gmt><?php echo $c->comment_date_gmt; ?></wp:comment_date_gmt>
 
470
                        <wp:comment_content><?php echo wxr_cdata( $c->comment_content ) ?></wp:comment_content>
 
471
                        <wp:comment_approved><?php echo $c->comment_approved; ?></wp:comment_approved>
 
472
                        <wp:comment_type><?php echo $c->comment_type; ?></wp:comment_type>
 
473
                        <wp:comment_parent><?php echo $c->comment_parent; ?></wp:comment_parent>
 
474
                        <wp:comment_user_id><?php echo $c->user_id; ?></wp:comment_user_id>
 
475
<?php           $c_meta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->commentmeta WHERE comment_id = %d", $c->comment_ID ) );
 
476
                        foreach ( $c_meta as $meta ) :
 
477
                                /**
 
478
                                 * Filter whether to selectively skip comment meta used for WXR exports.
 
479
                                 *
 
480
                                 * Returning a truthy value to the filter will skip the current meta
 
481
                                 * object from being exported.
 
482
                                 *
 
483
                                 * @since 4.0.0
 
484
                                 *
 
485
                                 * @param bool   $skip     Whether to skip the current comment meta. Default false.
 
486
                                 * @param string $meta_key Current meta key.
 
487
                                 * @param object $meta     Current meta object.
 
488
                                 */
 
489
                                if ( apply_filters( 'wxr_export_skip_commentmeta', false, $meta->meta_key, $meta ) ) {
 
490
                                        continue;
 
491
                                }
 
492
                        ?>
 
493
                        <wp:commentmeta>
 
494
                                <wp:meta_key><?php echo $meta->meta_key; ?></wp:meta_key>
 
495
                                <wp:meta_value><?php echo wxr_cdata( $meta->meta_value ); ?></wp:meta_value>
 
496
                        </wp:commentmeta>
 
497
<?php           endforeach; ?>
 
498
                </wp:comment>
 
499
<?php   endforeach; ?>
 
500
        </item>
 
501
<?php
 
502
        }
 
503
        }
 
504
} ?>
 
505
</channel>
 
506
</rss>
 
507
<?php
 
508
}