author | ymh <ymh.work@gmail.com> |
Wed, 21 Sep 2022 18:19:35 +0200 | |
changeset 18 | be944660c56a |
parent 16 | a86126ab1dd4 |
child 21 | 48c4eec2b7e6 |
permissions | -rw-r--r-- |
0 | 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 |
/** |
|
5 | 19 |
* Generates the WXR export file for download. |
0 | 20 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
21 |
* Default behavior is to export all content, however, note that post content will only |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
22 |
* be exported for post types with the `can_export` argument enabled. Any posts with the |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
23 |
* 'auto-draft' status will be skipped. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
24 |
* |
0 | 25 |
* @since 2.1.0 |
18 | 26 |
* @since 5.7.0 Added the `post_modified` and `post_modified_gmt` fields to the export file. |
0 | 27 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
28 |
* @global wpdb $wpdb WordPress database abstraction object. |
16 | 29 |
* @global WP_Post $post Global post object. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
30 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
31 |
* @param array $args { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
32 |
* Optional. Arguments for generating the WXR export file for download. Default empty array. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
33 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
34 |
* @type string $content Type of content to export. If set, only the post content of this post type |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
35 |
* will be exported. Accepts 'all', 'post', 'page', 'attachment', or a defined |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
36 |
* custom post. If an invalid custom post type is supplied, every post type for |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
37 |
* which `can_export` is enabled will be exported instead. If a valid custom post |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
38 |
* type is supplied but `can_export` is disabled, then 'posts' will be exported |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
39 |
* instead. When 'all' is supplied, only post types with `can_export` enabled will |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
40 |
* be exported. Default 'all'. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
41 |
* @type string $author Author to export content for. Only used when `$content` is 'post', 'page', or |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
42 |
* 'attachment'. Accepts false (all) or a specific author ID. Default false (all). |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
43 |
* @type string $category Category (slug) to export content for. Used only when `$content` is 'post'. If |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
44 |
* set, only post content assigned to `$category` will be exported. Accepts false |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
45 |
* or a specific category slug. Default is false (all categories). |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
46 |
* @type string $start_date Start date to export content from. Expected date format is 'Y-m-d'. Used only |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
47 |
* when `$content` is 'post', 'page' or 'attachment'. Default false (since the |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
48 |
* beginning of time). |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
49 |
* @type string $end_date End date to export content to. Expected date format is 'Y-m-d'. Used only when |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
50 |
* `$content` is 'post', 'page' or 'attachment'. Default false (latest publish date). |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
51 |
* @type string $status Post status to export posts for. Used only when `$content` is 'post' or 'page'. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
52 |
* Accepts false (all statuses except 'auto-draft'), or a specific status, i.e. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
53 |
* 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', or |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
54 |
* 'trash'. Default false (all statuses except 'auto-draft'). |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
55 |
* } |
0 | 56 |
*/ |
57 |
function export_wp( $args = array() ) { |
|
58 |
global $wpdb, $post; |
|
59 |
||
9 | 60 |
$defaults = array( |
61 |
'content' => 'all', |
|
62 |
'author' => false, |
|
63 |
'category' => false, |
|
64 |
'start_date' => false, |
|
65 |
'end_date' => false, |
|
66 |
'status' => false, |
|
0 | 67 |
); |
9 | 68 |
$args = wp_parse_args( $args, $defaults ); |
0 | 69 |
|
5 | 70 |
/** |
71 |
* Fires at the beginning of an export, before any headers are sent. |
|
72 |
* |
|
73 |
* @since 2.3.0 |
|
74 |
* |
|
75 |
* @param array $args An array of export arguments. |
|
76 |
*/ |
|
77 |
do_action( 'export_wp', $args ); |
|
0 | 78 |
|
79 |
$sitename = sanitize_key( get_bloginfo( 'name' ) ); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
80 |
if ( ! empty( $sitename ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
81 |
$sitename .= '.'; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
82 |
} |
16 | 83 |
$date = gmdate( 'Y-m-d' ); |
9 | 84 |
$wp_filename = $sitename . 'WordPress.' . $date . '.xml'; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
85 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
86 |
* Filters the export filename. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
87 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
88 |
* @since 4.4.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
89 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
90 |
* @param string $wp_filename The name of the file for download. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
91 |
* @param string $sitename The site name. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
92 |
* @param string $date Today's date, formatted. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
93 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
94 |
$filename = apply_filters( 'export_wp_filename', $wp_filename, $sitename, $date ); |
0 | 95 |
|
96 |
header( 'Content-Description: File Transfer' ); |
|
97 |
header( 'Content-Disposition: attachment; filename=' . $filename ); |
|
98 |
header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true ); |
|
99 |
||
16 | 100 |
if ( 'all' !== $args['content'] && post_type_exists( $args['content'] ) ) { |
0 | 101 |
$ptype = get_post_type_object( $args['content'] ); |
9 | 102 |
if ( ! $ptype->can_export ) { |
0 | 103 |
$args['content'] = 'post'; |
9 | 104 |
} |
0 | 105 |
|
106 |
$where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $args['content'] ); |
|
107 |
} else { |
|
108 |
$post_types = get_post_types( array( 'can_export' => true ) ); |
|
9 | 109 |
$esses = array_fill( 0, count( $post_types ), '%s' ); |
16 | 110 |
|
111 |
// phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare |
|
112 |
$where = $wpdb->prepare( "{$wpdb->posts}.post_type IN (" . implode( ',', $esses ) . ')', $post_types ); |
|
0 | 113 |
} |
114 |
||
16 | 115 |
if ( $args['status'] && ( 'post' === $args['content'] || 'page' === $args['content'] ) ) { |
0 | 116 |
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_status = %s", $args['status'] ); |
9 | 117 |
} else { |
0 | 118 |
$where .= " AND {$wpdb->posts}.post_status != 'auto-draft'"; |
9 | 119 |
} |
0 | 120 |
|
121 |
$join = ''; |
|
16 | 122 |
if ( $args['category'] && 'post' === $args['content'] ) { |
123 |
$term = term_exists( $args['category'], 'category' ); |
|
124 |
if ( $term ) { |
|
9 | 125 |
$join = "INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)"; |
0 | 126 |
$where .= $wpdb->prepare( " AND {$wpdb->term_relationships}.term_taxonomy_id = %d", $term['term_taxonomy_id'] ); |
127 |
} |
|
128 |
} |
|
129 |
||
16 | 130 |
if ( in_array( $args['content'], array( 'post', 'page', 'attachment' ), true ) ) { |
9 | 131 |
if ( $args['author'] ) { |
0 | 132 |
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_author = %d", $args['author'] ); |
9 | 133 |
} |
0 | 134 |
|
9 | 135 |
if ( $args['start_date'] ) { |
16 | 136 |
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date >= %s", gmdate( 'Y-m-d', strtotime( $args['start_date'] ) ) ); |
9 | 137 |
} |
0 | 138 |
|
9 | 139 |
if ( $args['end_date'] ) { |
16 | 140 |
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date < %s", gmdate( 'Y-m-d', strtotime( '+1 month', strtotime( $args['end_date'] ) ) ) ); |
9 | 141 |
} |
0 | 142 |
} |
143 |
||
5 | 144 |
// Grab a snapshot of post IDs, just in case it changes during the export. |
0 | 145 |
$post_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} $join WHERE $where" ); |
146 |
||
5 | 147 |
/* |
148 |
* Get the requested terms ready, empty unless posts filtered by category |
|
149 |
* or all content. |
|
150 |
*/ |
|
16 | 151 |
$cats = array(); |
152 |
$tags = array(); |
|
153 |
$terms = array(); |
|
0 | 154 |
if ( isset( $term ) && $term ) { |
9 | 155 |
$cat = get_term( $term['term_id'], 'category' ); |
0 | 156 |
$cats = array( $cat->term_id => $cat ); |
157 |
unset( $term, $cat ); |
|
16 | 158 |
} elseif ( 'all' === $args['content'] ) { |
0 | 159 |
$categories = (array) get_categories( array( 'get' => 'all' ) ); |
9 | 160 |
$tags = (array) get_tags( array( 'get' => 'all' ) ); |
0 | 161 |
|
162 |
$custom_taxonomies = get_taxonomies( array( '_builtin' => false ) ); |
|
16 | 163 |
$custom_terms = (array) get_terms( |
164 |
array( |
|
165 |
'taxonomy' => $custom_taxonomies, |
|
166 |
'get' => 'all', |
|
167 |
) |
|
168 |
); |
|
0 | 169 |
|
5 | 170 |
// Put categories in order with no child going before its parent. |
0 | 171 |
while ( $cat = array_shift( $categories ) ) { |
18 | 172 |
if ( ! $cat->parent || isset( $cats[ $cat->parent ] ) ) { |
9 | 173 |
$cats[ $cat->term_id ] = $cat; |
174 |
} else { |
|
0 | 175 |
$categories[] = $cat; |
9 | 176 |
} |
0 | 177 |
} |
178 |
||
5 | 179 |
// Put terms in order with no child going before its parent. |
0 | 180 |
while ( $t = array_shift( $custom_terms ) ) { |
18 | 181 |
if ( ! $t->parent || isset( $terms[ $t->parent ] ) ) { |
9 | 182 |
$terms[ $t->term_id ] = $t; |
183 |
} else { |
|
0 | 184 |
$custom_terms[] = $t; |
9 | 185 |
} |
0 | 186 |
} |
187 |
||
188 |
unset( $categories, $custom_taxonomies, $custom_terms ); |
|
189 |
} |
|
190 |
||
191 |
/** |
|
192 |
* Wrap given string in XML CDATA tag. |
|
193 |
* |
|
194 |
* @since 2.1.0 |
|
195 |
* |
|
196 |
* @param string $str String to wrap in XML CDATA tag. |
|
197 |
* @return string |
|
198 |
*/ |
|
199 |
function wxr_cdata( $str ) { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
200 |
if ( ! seems_utf8( $str ) ) { |
0 | 201 |
$str = utf8_encode( $str ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
202 |
} |
0 | 203 |
// $str = ent2ncr(esc_html($str)); |
204 |
$str = '<![CDATA[' . str_replace( ']]>', ']]]]><![CDATA[>', $str ) . ']]>'; |
|
205 |
||
206 |
return $str; |
|
207 |
} |
|
208 |
||
209 |
/** |
|
210 |
* Return the URL of the site |
|
211 |
* |
|
212 |
* @since 2.5.0 |
|
213 |
* |
|
214 |
* @return string Site URL. |
|
215 |
*/ |
|
216 |
function wxr_site_url() { |
|
9 | 217 |
if ( is_multisite() ) { |
218 |
// Multisite: the base URL. |
|
0 | 219 |
return network_home_url(); |
9 | 220 |
} else { |
221 |
// WordPress (single site): the blog URL. |
|
0 | 222 |
return get_bloginfo_rss( 'url' ); |
9 | 223 |
} |
0 | 224 |
} |
225 |
||
226 |
/** |
|
227 |
* Output a cat_name XML tag from a given category object |
|
228 |
* |
|
229 |
* @since 2.1.0 |
|
230 |
* |
|
18 | 231 |
* @param WP_Term $category Category Object |
0 | 232 |
*/ |
233 |
function wxr_cat_name( $category ) { |
|
9 | 234 |
if ( empty( $category->name ) ) { |
0 | 235 |
return; |
9 | 236 |
} |
0 | 237 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
238 |
echo '<wp:cat_name>' . wxr_cdata( $category->name ) . "</wp:cat_name>\n"; |
0 | 239 |
} |
240 |
||
241 |
/** |
|
242 |
* Output a category_description XML tag from a given category object |
|
243 |
* |
|
244 |
* @since 2.1.0 |
|
245 |
* |
|
18 | 246 |
* @param WP_Term $category Category Object |
0 | 247 |
*/ |
248 |
function wxr_category_description( $category ) { |
|
9 | 249 |
if ( empty( $category->description ) ) { |
0 | 250 |
return; |
9 | 251 |
} |
0 | 252 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
253 |
echo '<wp:category_description>' . wxr_cdata( $category->description ) . "</wp:category_description>\n"; |
0 | 254 |
} |
255 |
||
256 |
/** |
|
257 |
* Output a tag_name XML tag from a given tag object |
|
258 |
* |
|
259 |
* @since 2.3.0 |
|
260 |
* |
|
18 | 261 |
* @param WP_Term $tag Tag Object |
0 | 262 |
*/ |
263 |
function wxr_tag_name( $tag ) { |
|
9 | 264 |
if ( empty( $tag->name ) ) { |
0 | 265 |
return; |
9 | 266 |
} |
0 | 267 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
268 |
echo '<wp:tag_name>' . wxr_cdata( $tag->name ) . "</wp:tag_name>\n"; |
0 | 269 |
} |
270 |
||
271 |
/** |
|
272 |
* Output a tag_description XML tag from a given tag object |
|
273 |
* |
|
274 |
* @since 2.3.0 |
|
275 |
* |
|
18 | 276 |
* @param WP_Term $tag Tag Object |
0 | 277 |
*/ |
278 |
function wxr_tag_description( $tag ) { |
|
9 | 279 |
if ( empty( $tag->description ) ) { |
0 | 280 |
return; |
9 | 281 |
} |
0 | 282 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
283 |
echo '<wp:tag_description>' . wxr_cdata( $tag->description ) . "</wp:tag_description>\n"; |
0 | 284 |
} |
285 |
||
286 |
/** |
|
287 |
* Output a term_name XML tag from a given term object |
|
288 |
* |
|
289 |
* @since 2.9.0 |
|
290 |
* |
|
18 | 291 |
* @param WP_Term $term Term Object |
0 | 292 |
*/ |
293 |
function wxr_term_name( $term ) { |
|
9 | 294 |
if ( empty( $term->name ) ) { |
0 | 295 |
return; |
9 | 296 |
} |
0 | 297 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
298 |
echo '<wp:term_name>' . wxr_cdata( $term->name ) . "</wp:term_name>\n"; |
0 | 299 |
} |
300 |
||
301 |
/** |
|
302 |
* Output a term_description XML tag from a given term object |
|
303 |
* |
|
304 |
* @since 2.9.0 |
|
305 |
* |
|
18 | 306 |
* @param WP_Term $term Term Object |
0 | 307 |
*/ |
308 |
function wxr_term_description( $term ) { |
|
9 | 309 |
if ( empty( $term->description ) ) { |
0 | 310 |
return; |
9 | 311 |
} |
0 | 312 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
313 |
echo "\t\t<wp:term_description>" . wxr_cdata( $term->description ) . "</wp:term_description>\n"; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
314 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
315 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
316 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
317 |
* Output term meta XML tags for a given term object. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
318 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
319 |
* @since 4.6.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
320 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
321 |
* @param WP_Term $term Term object. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
322 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
323 |
function wxr_term_meta( $term ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
324 |
global $wpdb; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
325 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
326 |
$termmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->termmeta WHERE term_id = %d", $term->term_id ) ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
327 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
328 |
foreach ( $termmeta as $meta ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
329 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
330 |
* Filters whether to selectively skip term meta used for WXR exports. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
331 |
* |
16 | 332 |
* Returning a truthy value from the filter will skip the current meta |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
333 |
* object from being exported. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
334 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
335 |
* @since 4.6.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
336 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
337 |
* @param bool $skip Whether to skip the current piece of term meta. Default false. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
338 |
* @param string $meta_key Current meta key. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
339 |
* @param object $meta Current meta object. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
340 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
341 |
if ( ! apply_filters( 'wxr_export_skip_termmeta', false, $meta->meta_key, $meta ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
342 |
printf( "\t\t<wp:termmeta>\n\t\t\t<wp:meta_key>%s</wp:meta_key>\n\t\t\t<wp:meta_value>%s</wp:meta_value>\n\t\t</wp:termmeta>\n", wxr_cdata( $meta->meta_key ), wxr_cdata( $meta->meta_value ) ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
343 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
344 |
} |
0 | 345 |
} |
346 |
||
347 |
/** |
|
348 |
* Output list of authors with posts |
|
349 |
* |
|
350 |
* @since 3.1.0 |
|
5 | 351 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
352 |
* @global wpdb $wpdb WordPress database abstraction object. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
353 |
* |
9 | 354 |
* @param int[] $post_ids Optional. Array of post IDs to filter the query by. |
0 | 355 |
*/ |
5 | 356 |
function wxr_authors_list( array $post_ids = null ) { |
0 | 357 |
global $wpdb; |
358 |
||
9 | 359 |
if ( ! empty( $post_ids ) ) { |
5 | 360 |
$post_ids = array_map( 'absint', $post_ids ); |
9 | 361 |
$and = 'AND ID IN ( ' . implode( ', ', $post_ids ) . ')'; |
5 | 362 |
} else { |
363 |
$and = ''; |
|
364 |
} |
|
365 |
||
0 | 366 |
$authors = array(); |
5 | 367 |
$results = $wpdb->get_results( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_status != 'auto-draft' $and" ); |
9 | 368 |
foreach ( (array) $results as $result ) { |
0 | 369 |
$authors[] = get_userdata( $result->post_author ); |
9 | 370 |
} |
0 | 371 |
|
372 |
$authors = array_filter( $authors ); |
|
373 |
||
374 |
foreach ( $authors as $author ) { |
|
375 |
echo "\t<wp:author>"; |
|
18 | 376 |
echo '<wp:author_id>' . (int) $author->ID . '</wp:author_id>'; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
377 |
echo '<wp:author_login>' . wxr_cdata( $author->user_login ) . '</wp:author_login>'; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
378 |
echo '<wp:author_email>' . wxr_cdata( $author->user_email ) . '</wp:author_email>'; |
0 | 379 |
echo '<wp:author_display_name>' . wxr_cdata( $author->display_name ) . '</wp:author_display_name>'; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
380 |
echo '<wp:author_first_name>' . wxr_cdata( $author->first_name ) . '</wp:author_first_name>'; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
381 |
echo '<wp:author_last_name>' . wxr_cdata( $author->last_name ) . '</wp:author_last_name>'; |
0 | 382 |
echo "</wp:author>\n"; |
383 |
} |
|
384 |
} |
|
385 |
||
386 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
387 |
* Output all navigation menu terms |
0 | 388 |
* |
389 |
* @since 3.1.0 |
|
390 |
*/ |
|
391 |
function wxr_nav_menu_terms() { |
|
392 |
$nav_menus = wp_get_nav_menus(); |
|
9 | 393 |
if ( empty( $nav_menus ) || ! is_array( $nav_menus ) ) { |
0 | 394 |
return; |
9 | 395 |
} |
0 | 396 |
|
397 |
foreach ( $nav_menus as $menu ) { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
398 |
echo "\t<wp:term>"; |
18 | 399 |
echo '<wp:term_id>' . (int) $menu->term_id . '</wp:term_id>'; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
400 |
echo '<wp:term_taxonomy>nav_menu</wp:term_taxonomy>'; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
401 |
echo '<wp:term_slug>' . wxr_cdata( $menu->slug ) . '</wp:term_slug>'; |
0 | 402 |
wxr_term_name( $menu ); |
403 |
echo "</wp:term>\n"; |
|
404 |
} |
|
405 |
} |
|
406 |
||
407 |
/** |
|
408 |
* Output list of taxonomy terms, in XML tag format, associated with a post |
|
409 |
* |
|
410 |
* @since 2.3.0 |
|
411 |
*/ |
|
412 |
function wxr_post_taxonomy() { |
|
413 |
$post = get_post(); |
|
414 |
||
415 |
$taxonomies = get_object_taxonomies( $post->post_type ); |
|
9 | 416 |
if ( empty( $taxonomies ) ) { |
0 | 417 |
return; |
9 | 418 |
} |
0 | 419 |
$terms = wp_get_object_terms( $post->ID, $taxonomies ); |
420 |
||
421 |
foreach ( (array) $terms as $term ) { |
|
422 |
echo "\t\t<category domain=\"{$term->taxonomy}\" nicename=\"{$term->slug}\">" . wxr_cdata( $term->name ) . "</category>\n"; |
|
423 |
} |
|
424 |
} |
|
425 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
426 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
427 |
* @param bool $return_me |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
428 |
* @param string $meta_key |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
429 |
* @return bool |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
430 |
*/ |
0 | 431 |
function wxr_filter_postmeta( $return_me, $meta_key ) { |
16 | 432 |
if ( '_edit_lock' === $meta_key ) { |
0 | 433 |
$return_me = true; |
9 | 434 |
} |
0 | 435 |
return $return_me; |
436 |
} |
|
437 |
add_filter( 'wxr_export_skip_postmeta', 'wxr_filter_postmeta', 10, 2 ); |
|
438 |
||
9 | 439 |
echo '<?xml version="1.0" encoding="' . get_bloginfo( 'charset' ) . "\" ?>\n"; |
0 | 440 |
|
441 |
?> |
|
442 |
<!-- This is a WordPress eXtended RSS file generated by WordPress as an export of your site. --> |
|
443 |
<!-- It contains information about your site's posts, pages, comments, categories, and other content. --> |
|
444 |
<!-- You may use this file to transfer that content from one site to another. --> |
|
445 |
<!-- This file is not intended to serve as a complete backup of your site. --> |
|
446 |
||
447 |
<!-- To import this information into a WordPress site follow these steps: --> |
|
448 |
<!-- 1. Log in to that site as an administrator. --> |
|
449 |
<!-- 2. Go to Tools: Import in the WordPress admin panel. --> |
|
450 |
<!-- 3. Install the "WordPress" importer from the list. --> |
|
451 |
<!-- 4. Activate & Run Importer. --> |
|
452 |
<!-- 5. Upload this file using the form provided on that page. --> |
|
453 |
<!-- 6. You will first be asked to map the authors in this export file to users --> |
|
454 |
<!-- on the site. For each author, you may choose to map to an --> |
|
455 |
<!-- existing user on the site or to create a new user. --> |
|
456 |
<!-- 7. WordPress will then import each of the posts, pages, comments, categories, etc. --> |
|
457 |
<!-- contained in this file into your site. --> |
|
458 |
||
9 | 459 |
<?php the_generator( 'export' ); ?> |
0 | 460 |
<rss version="2.0" |
461 |
xmlns:excerpt="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/excerpt/" |
|
462 |
xmlns:content="http://purl.org/rss/1.0/modules/content/" |
|
463 |
xmlns:wfw="http://wellformedweb.org/CommentAPI/" |
|
464 |
xmlns:dc="http://purl.org/dc/elements/1.1/" |
|
465 |
xmlns:wp="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/" |
|
466 |
> |
|
467 |
||
468 |
<channel> |
|
469 |
<title><?php bloginfo_rss( 'name' ); ?></title> |
|
470 |
<link><?php bloginfo_rss( 'url' ); ?></link> |
|
471 |
<description><?php bloginfo_rss( 'description' ); ?></description> |
|
16 | 472 |
<pubDate><?php echo gmdate( 'D, d M Y H:i:s +0000' ); ?></pubDate> |
0 | 473 |
<language><?php bloginfo_rss( 'language' ); ?></language> |
474 |
<wp:wxr_version><?php echo WXR_VERSION; ?></wp:wxr_version> |
|
475 |
<wp:base_site_url><?php echo wxr_site_url(); ?></wp:base_site_url> |
|
476 |
<wp:base_blog_url><?php bloginfo_rss( 'url' ); ?></wp:base_blog_url> |
|
477 |
||
9 | 478 |
<?php wxr_authors_list( $post_ids ); ?> |
0 | 479 |
|
9 | 480 |
<?php foreach ( $cats as $c ) : ?> |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
481 |
<wp:category> |
18 | 482 |
<wp:term_id><?php echo (int) $c->term_id; ?></wp:term_id> |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
483 |
<wp:category_nicename><?php echo wxr_cdata( $c->slug ); ?></wp:category_nicename> |
9 | 484 |
<wp:category_parent><?php echo wxr_cdata( $c->parent ? $cats[ $c->parent ]->slug : '' ); ?></wp:category_parent> |
485 |
<?php |
|
486 |
wxr_cat_name( $c ); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
487 |
wxr_category_description( $c ); |
9 | 488 |
wxr_term_meta( $c ); |
489 |
?> |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
490 |
</wp:category> |
9 | 491 |
<?php endforeach; ?> |
492 |
<?php foreach ( $tags as $t ) : ?> |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
493 |
<wp:tag> |
18 | 494 |
<wp:term_id><?php echo (int) $t->term_id; ?></wp:term_id> |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
495 |
<wp:tag_slug><?php echo wxr_cdata( $t->slug ); ?></wp:tag_slug> |
9 | 496 |
<?php |
497 |
wxr_tag_name( $t ); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
498 |
wxr_tag_description( $t ); |
9 | 499 |
wxr_term_meta( $t ); |
500 |
?> |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
501 |
</wp:tag> |
9 | 502 |
<?php endforeach; ?> |
503 |
<?php foreach ( $terms as $t ) : ?> |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
504 |
<wp:term> |
18 | 505 |
<wp:term_id><?php echo (int) $t->term_id; ?></wp:term_id> |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
506 |
<wp:term_taxonomy><?php echo wxr_cdata( $t->taxonomy ); ?></wp:term_taxonomy> |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
507 |
<wp:term_slug><?php echo wxr_cdata( $t->slug ); ?></wp:term_slug> |
9 | 508 |
<wp:term_parent><?php echo wxr_cdata( $t->parent ? $terms[ $t->parent ]->slug : '' ); ?></wp:term_parent> |
509 |
<?php |
|
510 |
wxr_term_name( $t ); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
511 |
wxr_term_description( $t ); |
9 | 512 |
wxr_term_meta( $t ); |
513 |
?> |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
514 |
</wp:term> |
9 | 515 |
<?php endforeach; ?> |
516 |
<?php |
|
16 | 517 |
if ( 'all' === $args['content'] ) { |
9 | 518 |
wxr_nav_menu_terms();} |
519 |
?> |
|
0 | 520 |
|
5 | 521 |
<?php |
522 |
/** This action is documented in wp-includes/feed-rss2.php */ |
|
523 |
do_action( 'rss2_head' ); |
|
524 |
?> |
|
0 | 525 |
|
9 | 526 |
<?php |
527 |
if ( $post_ids ) { |
|
528 |
/** |
|
16 | 529 |
* @global WP_Query $wp_query WordPress Query object. |
9 | 530 |
*/ |
531 |
global $wp_query; |
|
532 |
||
533 |
// Fake being in the loop. |
|
534 |
$wp_query->in_the_loop = true; |
|
0 | 535 |
|
9 | 536 |
// Fetch 20 posts at a time rather than loading the entire table into memory. |
537 |
while ( $next_posts = array_splice( $post_ids, 0, 20 ) ) { |
|
18 | 538 |
$where = 'WHERE ID IN (' . implode( ',', $next_posts ) . ')'; |
9 | 539 |
$posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" ); |
540 |
||
541 |
// Begin Loop. |
|
542 |
foreach ( $posts as $post ) { |
|
543 |
setup_postdata( $post ); |
|
544 |
||
18 | 545 |
/** |
546 |
* Filters the post title used for WXR exports. |
|
547 |
* |
|
548 |
* @since 5.7.0 |
|
549 |
* |
|
550 |
* @param string $post_title Title of the current post. |
|
551 |
*/ |
|
552 |
$title = wxr_cdata( apply_filters( 'the_title_export', $post->post_title ) ); |
|
5 | 553 |
|
9 | 554 |
/** |
555 |
* Filters the post content used for WXR exports. |
|
556 |
* |
|
557 |
* @since 2.5.0 |
|
558 |
* |
|
559 |
* @param string $post_content Content of the current post. |
|
560 |
*/ |
|
561 |
$content = wxr_cdata( apply_filters( 'the_content_export', $post->post_content ) ); |
|
0 | 562 |
|
9 | 563 |
/** |
564 |
* Filters the post excerpt used for WXR exports. |
|
565 |
* |
|
566 |
* @since 2.6.0 |
|
567 |
* |
|
568 |
* @param string $post_excerpt Excerpt for the current post. |
|
569 |
*/ |
|
570 |
$excerpt = wxr_cdata( apply_filters( 'the_excerpt_export', $post->post_excerpt ) ); |
|
571 |
||
572 |
$is_sticky = is_sticky( $post->ID ) ? 1 : 0; |
|
573 |
?> |
|
0 | 574 |
<item> |
9 | 575 |
<title><?php echo $title; ?></title> |
576 |
<link><?php the_permalink_rss(); ?></link> |
|
0 | 577 |
<pubDate><?php echo mysql2date( 'D, d M Y H:i:s +0000', get_post_time( 'Y-m-d H:i:s', true ), false ); ?></pubDate> |
578 |
<dc:creator><?php echo wxr_cdata( get_the_author_meta( 'login' ) ); ?></dc:creator> |
|
579 |
<guid isPermaLink="false"><?php the_guid(); ?></guid> |
|
580 |
<description></description> |
|
9 | 581 |
<content:encoded><?php echo $content; ?></content:encoded> |
582 |
<excerpt:encoded><?php echo $excerpt; ?></excerpt:encoded> |
|
18 | 583 |
<wp:post_id><?php echo (int) $post->ID; ?></wp:post_id> |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
584 |
<wp:post_date><?php echo wxr_cdata( $post->post_date ); ?></wp:post_date> |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
585 |
<wp:post_date_gmt><?php echo wxr_cdata( $post->post_date_gmt ); ?></wp:post_date_gmt> |
18 | 586 |
<wp:post_modified><?php echo wxr_cdata( $post->post_modified ); ?></wp:post_modified> |
587 |
<wp:post_modified_gmt><?php echo wxr_cdata( $post->post_modified_gmt ); ?></wp:post_modified_gmt> |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
588 |
<wp:comment_status><?php echo wxr_cdata( $post->comment_status ); ?></wp:comment_status> |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
589 |
<wp:ping_status><?php echo wxr_cdata( $post->ping_status ); ?></wp:ping_status> |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
590 |
<wp:post_name><?php echo wxr_cdata( $post->post_name ); ?></wp:post_name> |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
591 |
<wp:status><?php echo wxr_cdata( $post->post_status ); ?></wp:status> |
18 | 592 |
<wp:post_parent><?php echo (int) $post->post_parent; ?></wp:post_parent> |
593 |
<wp:menu_order><?php echo (int) $post->menu_order; ?></wp:menu_order> |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
594 |
<wp:post_type><?php echo wxr_cdata( $post->post_type ); ?></wp:post_type> |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
595 |
<wp:post_password><?php echo wxr_cdata( $post->post_password ); ?></wp:post_password> |
18 | 596 |
<wp:is_sticky><?php echo (int) $is_sticky; ?></wp:is_sticky> |
16 | 597 |
<?php if ( 'attachment' === $post->post_type ) : ?> |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
598 |
<wp:attachment_url><?php echo wxr_cdata( wp_get_attachment_url( $post->ID ) ); ?></wp:attachment_url> |
9 | 599 |
<?php endif; ?> |
600 |
<?php wxr_post_taxonomy(); ?> |
|
601 |
<?php |
|
602 |
$postmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID ) ); |
|
603 |
foreach ( $postmeta as $meta ) : |
|
604 |
/** |
|
605 |
* Filters whether to selectively skip post meta used for WXR exports. |
|
606 |
* |
|
16 | 607 |
* Returning a truthy value from the filter will skip the current meta |
9 | 608 |
* object from being exported. |
609 |
* |
|
610 |
* @since 3.3.0 |
|
611 |
* |
|
612 |
* @param bool $skip Whether to skip the current post meta. Default false. |
|
613 |
* @param string $meta_key Current meta key. |
|
614 |
* @param object $meta Current meta object. |
|
615 |
*/ |
|
616 |
if ( apply_filters( 'wxr_export_skip_postmeta', false, $meta->meta_key, $meta ) ) { |
|
617 |
continue; |
|
618 |
} |
|
619 |
?> |
|
0 | 620 |
<wp:postmeta> |
9 | 621 |
<wp:meta_key><?php echo wxr_cdata( $meta->meta_key ); ?></wp:meta_key> |
622 |
<wp:meta_value><?php echo wxr_cdata( $meta->meta_value ); ?></wp:meta_value> |
|
0 | 623 |
</wp:postmeta> |
9 | 624 |
<?php |
625 |
endforeach; |
|
5 | 626 |
|
9 | 627 |
$_comments = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved <> 'spam'", $post->ID ) ); |
628 |
$comments = array_map( 'get_comment', $_comments ); |
|
629 |
foreach ( $comments as $c ) : |
|
630 |
?> |
|
0 | 631 |
<wp:comment> |
18 | 632 |
<wp:comment_id><?php echo (int) $c->comment_ID; ?></wp:comment_id> |
0 | 633 |
<wp:comment_author><?php echo wxr_cdata( $c->comment_author ); ?></wp:comment_author> |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
634 |
<wp:comment_author_email><?php echo wxr_cdata( $c->comment_author_email ); ?></wp:comment_author_email> |
0 | 635 |
<wp:comment_author_url><?php echo esc_url_raw( $c->comment_author_url ); ?></wp:comment_author_url> |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
636 |
<wp:comment_author_IP><?php echo wxr_cdata( $c->comment_author_IP ); ?></wp:comment_author_IP> |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
637 |
<wp:comment_date><?php echo wxr_cdata( $c->comment_date ); ?></wp:comment_date> |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
638 |
<wp:comment_date_gmt><?php echo wxr_cdata( $c->comment_date_gmt ); ?></wp:comment_date_gmt> |
9 | 639 |
<wp:comment_content><?php echo wxr_cdata( $c->comment_content ); ?></wp:comment_content> |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
640 |
<wp:comment_approved><?php echo wxr_cdata( $c->comment_approved ); ?></wp:comment_approved> |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
641 |
<wp:comment_type><?php echo wxr_cdata( $c->comment_type ); ?></wp:comment_type> |
18 | 642 |
<wp:comment_parent><?php echo (int) $c->comment_parent; ?></wp:comment_parent> |
643 |
<wp:comment_user_id><?php echo (int) $c->user_id; ?></wp:comment_user_id> |
|
9 | 644 |
<?php |
645 |
$c_meta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->commentmeta WHERE comment_id = %d", $c->comment_ID ) ); |
|
646 |
foreach ( $c_meta as $meta ) : |
|
647 |
/** |
|
648 |
* Filters whether to selectively skip comment meta used for WXR exports. |
|
649 |
* |
|
16 | 650 |
* Returning a truthy value from the filter will skip the current meta |
9 | 651 |
* object from being exported. |
652 |
* |
|
653 |
* @since 4.0.0 |
|
654 |
* |
|
655 |
* @param bool $skip Whether to skip the current comment meta. Default false. |
|
656 |
* @param string $meta_key Current meta key. |
|
657 |
* @param object $meta Current meta object. |
|
658 |
*/ |
|
659 |
if ( apply_filters( 'wxr_export_skip_commentmeta', false, $meta->meta_key, $meta ) ) { |
|
660 |
continue; |
|
661 |
} |
|
662 |
?> |
|
663 |
<wp:commentmeta> |
|
664 |
<wp:meta_key><?php echo wxr_cdata( $meta->meta_key ); ?></wp:meta_key> |
|
665 |
<wp:meta_value><?php echo wxr_cdata( $meta->meta_value ); ?></wp:meta_value> |
|
0 | 666 |
</wp:commentmeta> |
9 | 667 |
<?php endforeach; ?> |
0 | 668 |
</wp:comment> |
9 | 669 |
<?php endforeach; ?> |
670 |
</item> |
|
671 |
<?php |
|
672 |
} |
|
673 |
} |
|
0 | 674 |
} |
9 | 675 |
?> |
0 | 676 |
</channel> |
677 |
</rss> |
|
9 | 678 |
<?php |
0 | 679 |
} |