diff -r c7c34916027a -r 177826044cd9 wp/wp-admin/includes/export.php --- a/wp/wp-admin/includes/export.php Mon Oct 14 18:06:33 2019 +0200 +++ b/wp/wp-admin/includes/export.php Mon Oct 14 18:28:13 2019 +0200 @@ -56,10 +56,15 @@ function export_wp( $args = array() ) { global $wpdb, $post; - $defaults = array( 'content' => 'all', 'author' => false, 'category' => false, - 'start_date' => false, 'end_date' => false, 'status' => false, + $defaults = array( + 'content' => 'all', + 'author' => false, + 'category' => false, + 'start_date' => false, + 'end_date' => false, + 'status' => false, ); - $args = wp_parse_args( $args, $defaults ); + $args = wp_parse_args( $args, $defaults ); /** * Fires at the beginning of an export, before any headers are sent. @@ -74,8 +79,8 @@ if ( ! empty( $sitename ) ) { $sitename .= '.'; } - $date = date( 'Y-m-d' ); - $wp_filename = $sitename . 'wordpress.' . $date . '.xml'; + $date = date( 'Y-m-d' ); + $wp_filename = $sitename . 'WordPress.' . $date . '.xml'; /** * Filters the export filename. * @@ -93,38 +98,43 @@ if ( 'all' != $args['content'] && post_type_exists( $args['content'] ) ) { $ptype = get_post_type_object( $args['content'] ); - if ( ! $ptype->can_export ) + if ( ! $ptype->can_export ) { $args['content'] = 'post'; + } $where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $args['content'] ); } else { $post_types = get_post_types( array( 'can_export' => true ) ); - $esses = array_fill( 0, count($post_types), '%s' ); - $where = $wpdb->prepare( "{$wpdb->posts}.post_type IN (" . implode( ',', $esses ) . ')', $post_types ); + $esses = array_fill( 0, count( $post_types ), '%s' ); + $where = $wpdb->prepare( "{$wpdb->posts}.post_type IN (" . implode( ',', $esses ) . ')', $post_types ); } - if ( $args['status'] && ( 'post' == $args['content'] || 'page' == $args['content'] ) ) + if ( $args['status'] && ( 'post' == $args['content'] || 'page' == $args['content'] ) ) { $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_status = %s", $args['status'] ); - else + } else { $where .= " AND {$wpdb->posts}.post_status != 'auto-draft'"; + } $join = ''; if ( $args['category'] && 'post' == $args['content'] ) { if ( $term = term_exists( $args['category'], 'category' ) ) { - $join = "INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)"; + $join = "INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)"; $where .= $wpdb->prepare( " AND {$wpdb->term_relationships}.term_taxonomy_id = %d", $term['term_taxonomy_id'] ); } } if ( 'post' == $args['content'] || 'page' == $args['content'] || 'attachment' == $args['content'] ) { - if ( $args['author'] ) + if ( $args['author'] ) { $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_author = %d", $args['author'] ); + } - if ( $args['start_date'] ) - $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date >= %s", date( 'Y-m-d', strtotime($args['start_date']) ) ); + if ( $args['start_date'] ) { + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date >= %s", date( 'Y-m-d', strtotime( $args['start_date'] ) ) ); + } - if ( $args['end_date'] ) - $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date < %s", date( 'Y-m-d', strtotime('+1 month', strtotime($args['end_date'])) ) ); + if ( $args['end_date'] ) { + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date < %s", date( 'Y-m-d', strtotime( '+1 month', strtotime( $args['end_date'] ) ) ) ); + } } // Grab a snapshot of post IDs, just in case it changes during the export. @@ -136,30 +146,32 @@ */ $cats = $tags = $terms = array(); if ( isset( $term ) && $term ) { - $cat = get_term( $term['term_id'], 'category' ); + $cat = get_term( $term['term_id'], 'category' ); $cats = array( $cat->term_id => $cat ); unset( $term, $cat ); } elseif ( 'all' == $args['content'] ) { $categories = (array) get_categories( array( 'get' => 'all' ) ); - $tags = (array) get_tags( array( 'get' => 'all' ) ); + $tags = (array) get_tags( array( 'get' => 'all' ) ); $custom_taxonomies = get_taxonomies( array( '_builtin' => false ) ); - $custom_terms = (array) get_terms( $custom_taxonomies, array( 'get' => 'all' ) ); + $custom_terms = (array) get_terms( $custom_taxonomies, array( 'get' => 'all' ) ); // Put categories in order with no child going before its parent. while ( $cat = array_shift( $categories ) ) { - if ( $cat->parent == 0 || isset( $cats[$cat->parent] ) ) - $cats[$cat->term_id] = $cat; - else + if ( $cat->parent == 0 || isset( $cats[ $cat->parent ] ) ) { + $cats[ $cat->term_id ] = $cat; + } else { $categories[] = $cat; + } } // Put terms in order with no child going before its parent. while ( $t = array_shift( $custom_terms ) ) { - if ( $t->parent == 0 || isset( $terms[$t->parent] ) ) - $terms[$t->term_id] = $t; - else + if ( $t->parent == 0 || isset( $terms[ $t->parent ] ) ) { + $terms[ $t->term_id ] = $t; + } else { $custom_terms[] = $t; + } } unset( $categories, $custom_taxonomies, $custom_terms ); @@ -191,12 +203,13 @@ * @return string Site URL. */ function wxr_site_url() { - // Multisite: the base URL. - if ( is_multisite() ) + if ( is_multisite() ) { + // Multisite: the base URL. return network_home_url(); - // WordPress (single site): the blog URL. - else + } else { + // WordPress (single site): the blog URL. return get_bloginfo_rss( 'url' ); + } } /** @@ -207,8 +220,9 @@ * @param object $category Category Object */ function wxr_cat_name( $category ) { - if ( empty( $category->name ) ) + if ( empty( $category->name ) ) { return; + } echo '' . wxr_cdata( $category->name ) . "\n"; } @@ -221,8 +235,9 @@ * @param object $category Category Object */ function wxr_category_description( $category ) { - if ( empty( $category->description ) ) + if ( empty( $category->description ) ) { return; + } echo '' . wxr_cdata( $category->description ) . "\n"; } @@ -235,8 +250,9 @@ * @param object $tag Tag Object */ function wxr_tag_name( $tag ) { - if ( empty( $tag->name ) ) + if ( empty( $tag->name ) ) { return; + } echo '' . wxr_cdata( $tag->name ) . "\n"; } @@ -249,8 +265,9 @@ * @param object $tag Tag Object */ function wxr_tag_description( $tag ) { - if ( empty( $tag->description ) ) + if ( empty( $tag->description ) ) { return; + } echo '' . wxr_cdata( $tag->description ) . "\n"; } @@ -263,8 +280,9 @@ * @param object $term Term Object */ function wxr_term_name( $term ) { - if ( empty( $term->name ) ) + if ( empty( $term->name ) ) { return; + } echo '' . wxr_cdata( $term->name ) . "\n"; } @@ -277,8 +295,9 @@ * @param object $term Term Object */ function wxr_term_description( $term ) { - if ( empty( $term->description ) ) + if ( empty( $term->description ) ) { return; + } echo "\t\t" . wxr_cdata( $term->description ) . "\n"; } @@ -321,22 +340,23 @@ * * @global wpdb $wpdb WordPress database abstraction object. * - * @param array $post_ids Array of post IDs to filter the query by. Optional. + * @param int[] $post_ids Optional. Array of post IDs to filter the query by. */ function wxr_authors_list( array $post_ids = null ) { global $wpdb; - if ( !empty( $post_ids ) ) { + if ( ! empty( $post_ids ) ) { $post_ids = array_map( 'absint', $post_ids ); - $and = 'AND ID IN ( ' . implode( ', ', $post_ids ) . ')'; + $and = 'AND ID IN ( ' . implode( ', ', $post_ids ) . ')'; } else { $and = ''; } $authors = array(); $results = $wpdb->get_results( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_status != 'auto-draft' $and" ); - foreach ( (array) $results as $result ) + foreach ( (array) $results as $result ) { $authors[] = get_userdata( $result->post_author ); + } $authors = array_filter( $authors ); @@ -359,8 +379,9 @@ */ function wxr_nav_menu_terms() { $nav_menus = wp_get_nav_menus(); - if ( empty( $nav_menus ) || ! is_array( $nav_menus ) ) + if ( empty( $nav_menus ) || ! is_array( $nav_menus ) ) { return; + } foreach ( $nav_menus as $menu ) { echo "\t"; @@ -381,8 +402,9 @@ $post = get_post(); $taxonomies = get_object_taxonomies( $post->post_type ); - if ( empty( $taxonomies ) ) + if ( empty( $taxonomies ) ) { return; + } $terms = wp_get_object_terms( $post->ID, $taxonomies ); foreach ( (array) $terms as $term ) { @@ -391,19 +413,19 @@ } /** - * * @param bool $return_me * @param string $meta_key * @return bool */ function wxr_filter_postmeta( $return_me, $meta_key ) { - if ( '_edit_lock' == $meta_key ) + if ( '_edit_lock' == $meta_key ) { $return_me = true; + } return $return_me; } add_filter( 'wxr_export_skip_postmeta', 'wxr_filter_postmeta', 10, 2 ); - echo '\n"; + echo '\n"; ?> @@ -423,7 +445,7 @@ - + - + - + term_id ); ?> slug ); ?> - parent ? $cats[$c->parent]->slug : '' ); ?> - parent ? $cats[ $c->parent ]->slug : '' ); ?> + + wxr_term_meta( $c ); + ?> - - + + term_id ); ?> slug ); ?> - + wxr_term_meta( $t ); + ?> - - + + term_id ); ?> taxonomy ); ?> slug ); ?> - parent ? $terms[$t->parent]->slug : '' ); ?> - parent ? $terms[ $t->parent ]->slug : '' ); ?> + + wxr_term_meta( $t ); + ?> - - + + -in_the_loop = true; - // Fake being in the loop. - $wp_query->in_the_loop = true; + // Fetch 20 posts at a time rather than loading the entire table into memory. + while ( $next_posts = array_splice( $post_ids, 0, 20 ) ) { + $where = 'WHERE ID IN (' . join( ',', $next_posts ) . ')'; + $posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" ); + + // Begin Loop. + foreach ( $posts as $post ) { + setup_postdata( $post ); + + /** This filter is documented in wp-includes/feed.php */ + $title = apply_filters( 'the_title_rss', $post->post_title ); - // Fetch 20 posts at a time rather than loading the entire table into memory. - while ( $next_posts = array_splice( $post_ids, 0, 20 ) ) { - $where = 'WHERE ID IN (' . join( ',', $next_posts ) . ')'; - $posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" ); + /** + * Filters the post content used for WXR exports. + * + * @since 2.5.0 + * + * @param string $post_content Content of the current post. + */ + $content = wxr_cdata( apply_filters( 'the_content_export', $post->post_content ) ); - // Begin Loop. - foreach ( $posts as $post ) { - setup_postdata( $post ); - $is_sticky = is_sticky( $post->ID ) ? 1 : 0; -?> + /** + * Filters the post excerpt used for WXR exports. + * + * @since 2.6.0 + * + * @param string $post_excerpt Excerpt for the current post. + */ + $excerpt = wxr_cdata( apply_filters( 'the_excerpt_export', $post->post_excerpt ) ); + + $is_sticky = is_sticky( $post->ID ) ? 1 : 0; + ?> - <?php - /** This filter is documented in wp-includes/feed.php */ - echo apply_filters( 'the_title_rss', $post->post_title ); - ?> - + <?php echo $title; ?> + - post_content ) ); - ?> - post_excerpt ) ); - ?> + + ID ); ?> post_date ); ?> post_date_gmt ); ?> @@ -542,36 +575,40 @@ post_type ); ?> post_password ); ?> -post_type == 'attachment' ) : ?> + post_type == 'attachment' ) : ?> ID ) ); ?> - - -get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID ) ); - foreach ( $postmeta as $meta ) : - /** - * Filters whether to selectively skip post meta used for WXR exports. - * - * Returning a truthy value to the filter will skip the current meta - * object from being exported. - * - * @since 3.3.0 - * - * @param bool $skip Whether to skip the current post meta. Default false. - * @param string $meta_key Current meta key. - * @param object $meta Current meta object. - */ - if ( apply_filters( 'wxr_export_skip_postmeta', false, $meta->meta_key, $meta ) ) - continue; - ?> + + + get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID ) ); + foreach ( $postmeta as $meta ) : + /** + * Filters whether to selectively skip post meta used for WXR exports. + * + * Returning a truthy value to the filter will skip the current meta + * object from being exported. + * + * @since 3.3.0 + * + * @param bool $skip Whether to skip the current post meta. Default false. + * @param string $meta_key Current meta key. + * @param object $meta Current meta object. + */ + if ( apply_filters( 'wxr_export_skip_postmeta', false, $meta->meta_key, $meta ) ) { + continue; + } + ?> - meta_key ); ?> - meta_value ); ?> + meta_key ); ?> + meta_value ); ?> -get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved <> 'spam'", $post->ID ) ); - $comments = array_map( 'get_comment', $_comments ); - foreach ( $comments as $c ) : ?> + $_comments = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved <> 'spam'", $post->ID ) ); + $comments = array_map( 'get_comment', $_comments ); + foreach ( $comments as $c ) : + ?> comment_ID ); ?> comment_author ); ?> @@ -580,42 +617,44 @@ comment_author_IP ); ?> comment_date ); ?> comment_date_gmt ); ?> - comment_content ) ?> + comment_content ); ?> comment_approved ); ?> comment_type ); ?> comment_parent ); ?> user_id ); ?> -get_results( $wpdb->prepare( "SELECT * FROM $wpdb->commentmeta WHERE comment_id = %d", $c->comment_ID ) ); - foreach ( $c_meta as $meta ) : - /** - * Filters whether to selectively skip comment meta used for WXR exports. - * - * Returning a truthy value to the filter will skip the current meta - * object from being exported. - * - * @since 4.0.0 - * - * @param bool $skip Whether to skip the current comment meta. Default false. - * @param string $meta_key Current meta key. - * @param object $meta Current meta object. - */ - if ( apply_filters( 'wxr_export_skip_commentmeta', false, $meta->meta_key, $meta ) ) { - continue; - } - ?> - - meta_key ); ?> - meta_value ); ?> + get_results( $wpdb->prepare( "SELECT * FROM $wpdb->commentmeta WHERE comment_id = %d", $c->comment_ID ) ); + foreach ( $c_meta as $meta ) : + /** + * Filters whether to selectively skip comment meta used for WXR exports. + * + * Returning a truthy value to the filter will skip the current meta + * object from being exported. + * + * @since 4.0.0 + * + * @param bool $skip Whether to skip the current comment meta. Default false. + * @param string $meta_key Current meta key. + * @param object $meta Current meta object. + */ + if ( apply_filters( 'wxr_export_skip_commentmeta', false, $meta->meta_key, $meta ) ) { + continue; + } + ?> + + meta_key ); ?> + meta_value ); ?> - + - - - + + + ?> -