Ticket #33563: wordpress-develop.33563.2.diff
File wordpress-develop.33563.2.diff, 45.9 KB (added by , 8 years ago) |
---|
-
src/wp-admin/includes/export.php
7 7 */ 8 8 9 9 /** 10 * Version number for the export format.11 *12 * Bump this when something changes that might affect compatibility.13 *14 * @since 2.5.015 */16 define( 'WXR_VERSION', '1.2' );17 18 /**19 10 * Generates the WXR export file for download. 20 11 * 21 12 * @since 2.1.0 … … 137 128 unset( $categories, $custom_taxonomies, $custom_terms ); 138 129 } 139 130 140 /** 141 * Wrap given string in XML CDATA tag. 142 * 143 * @since 2.1.0 144 * 145 * @param string $str String to wrap in XML CDATA tag. 146 * @return string 147 */ 148 function wxr_cdata( $str ) { 149 if ( ! seems_utf8( $str ) ) { 150 $str = utf8_encode( $str ); 151 } 152 // $str = ent2ncr(esc_html($str)); 153 $str = '<![CDATA[' . str_replace( ']]>', ']]]]><![CDATA[>', $str ) . ']]>'; 131 require_once __DIR__ . '/wxr.php'; 154 132 155 return $str;156 }157 158 /**159 * Return the URL of the site160 *161 * @since 2.5.0162 *163 * @return string Site URL.164 */165 function wxr_site_url() {166 // Multisite: the base URL.167 if ( is_multisite() )168 return network_home_url();169 // WordPress (single site): the blog URL.170 else171 return get_bloginfo_rss( 'url' );172 }173 174 /**175 * Output a cat_name XML tag from a given category object176 *177 * @since 2.1.0178 *179 * @param object $category Category Object180 */181 function wxr_cat_name( $category ) {182 if ( empty( $category->name ) )183 return;184 185 echo '<wp:cat_name>' . wxr_cdata( $category->name ) . "</wp:cat_name>\n";186 }187 188 /**189 * Output a category_description XML tag from a given category object190 *191 * @since 2.1.0192 *193 * @param object $category Category Object194 */195 function wxr_category_description( $category ) {196 if ( empty( $category->description ) )197 return;198 199 echo '<wp:category_description>' . wxr_cdata( $category->description ) . "</wp:category_description>\n";200 }201 202 /**203 * Output a tag_name XML tag from a given tag object204 *205 * @since 2.3.0206 *207 * @param object $tag Tag Object208 */209 function wxr_tag_name( $tag ) {210 if ( empty( $tag->name ) )211 return;212 213 echo '<wp:tag_name>' . wxr_cdata( $tag->name ) . "</wp:tag_name>\n";214 }215 216 /**217 * Output a tag_description XML tag from a given tag object218 *219 * @since 2.3.0220 *221 * @param object $tag Tag Object222 */223 function wxr_tag_description( $tag ) {224 if ( empty( $tag->description ) )225 return;226 227 echo '<wp:tag_description>' . wxr_cdata( $tag->description ) . "</wp:tag_description>\n";228 }229 230 /**231 * Output a term_name XML tag from a given term object232 *233 * @since 2.9.0234 *235 * @param object $term Term Object236 */237 function wxr_term_name( $term ) {238 if ( empty( $term->name ) )239 return;240 241 echo '<wp:term_name>' . wxr_cdata( $term->name ) . "</wp:term_name>\n";242 }243 244 /**245 * Output a term_description XML tag from a given term object246 *247 * @since 2.9.0248 *249 * @param object $term Term Object250 */251 function wxr_term_description( $term ) {252 if ( empty( $term->description ) )253 return;254 255 echo "\t\t<wp:term_description>" . wxr_cdata( $term->description ) . "</wp:term_description>\n";256 }257 258 /**259 * Output termmeta XML tags for a given term object.260 *261 * @since 4.6.0262 *263 * @param WP_Term $term Term object.264 */265 function wxr_term_meta( $term ) {266 global $wpdb;267 268 $termmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->termmeta WHERE term_id = %d", $term->term_id ) );269 270 foreach ( $termmeta as $meta ) {271 /**272 * Filters whether to selectively skip term meta used for WXR exports.273 *274 * Returning a truthy value to the filter will skip the current meta275 * object from being exported.276 *277 * @since 4.6.0278 *279 * @param bool $skip Whether to skip the current piece of term meta. Default false.280 * @param string $meta_key Current meta key.281 * @param object $meta Current meta object.282 */283 if ( ! apply_filters( 'wxr_export_skip_termmeta', false, $meta->meta_key, $meta ) ) {284 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 ) );285 }286 }287 }288 289 /**290 * Output list of authors with posts291 *292 * @since 3.1.0293 *294 * @global wpdb $wpdb WordPress database abstraction object.295 *296 * @param array $post_ids Array of post IDs to filter the query by. Optional.297 */298 function wxr_authors_list( array $post_ids = null ) {299 global $wpdb;300 301 if ( !empty( $post_ids ) ) {302 $post_ids = array_map( 'absint', $post_ids );303 $and = 'AND ID IN ( ' . implode( ', ', $post_ids ) . ')';304 } else {305 $and = '';306 }307 308 $authors = array();309 $results = $wpdb->get_results( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_status != 'auto-draft' $and" );310 foreach ( (array) $results as $result )311 $authors[] = get_userdata( $result->post_author );312 313 $authors = array_filter( $authors );314 315 foreach ( $authors as $author ) {316 echo "\t<wp:author>";317 echo '<wp:author_id>' . intval( $author->ID ) . '</wp:author_id>';318 echo '<wp:author_login>' . wxr_cdata( $author->user_login ) . '</wp:author_login>';319 echo '<wp:author_email>' . wxr_cdata( $author->user_email ) . '</wp:author_email>';320 echo '<wp:author_display_name>' . wxr_cdata( $author->display_name ) . '</wp:author_display_name>';321 echo '<wp:author_first_name>' . wxr_cdata( $author->first_name ) . '</wp:author_first_name>';322 echo '<wp:author_last_name>' . wxr_cdata( $author->last_name ) . '</wp:author_last_name>';323 echo "</wp:author>\n";324 }325 }326 327 /**328 * Ouput all navigation menu terms329 *330 * @since 3.1.0331 */332 function wxr_nav_menu_terms() {333 $nav_menus = wp_get_nav_menus();334 if ( empty( $nav_menus ) || ! is_array( $nav_menus ) )335 return;336 337 foreach ( $nav_menus as $menu ) {338 echo "\t<wp:term>";339 echo '<wp:term_id>' . intval( $menu->term_id ) . '</wp:term_id>';340 echo '<wp:term_taxonomy>nav_menu</wp:term_taxonomy>';341 echo '<wp:term_slug>' . wxr_cdata( $menu->slug ) . '</wp:term_slug>';342 wxr_term_name( $menu );343 echo "</wp:term>\n";344 }345 }346 347 /**348 * Output list of taxonomy terms, in XML tag format, associated with a post349 *350 * @since 2.3.0351 */352 function wxr_post_taxonomy() {353 $post = get_post();354 355 $taxonomies = get_object_taxonomies( $post->post_type );356 if ( empty( $taxonomies ) )357 return;358 $terms = wp_get_object_terms( $post->ID, $taxonomies );359 360 foreach ( (array) $terms as $term ) {361 echo "\t\t<category domain=\"{$term->taxonomy}\" nicename=\"{$term->slug}\">" . wxr_cdata( $term->name ) . "</category>\n";362 }363 }364 365 /**366 *367 * @param bool $return_me368 * @param string $meta_key369 * @return bool370 */371 function wxr_filter_postmeta( $return_me, $meta_key ) {372 if ( '_edit_lock' == $meta_key )373 $return_me = true;374 return $return_me;375 }376 133 add_filter( 'wxr_export_skip_postmeta', 'wxr_filter_postmeta', 10, 2 ); 377 134 378 135 echo '<?xml version="1.0" encoding="' . get_bloginfo('charset') . "\" ?>\n"; -
src/wp-admin/includes/wxr.php
1 1 <?php 2 2 /** 3 * WordPress Export Administration API3 * WordPress Export Helper 4 4 * 5 5 * @package WordPress 6 6 * @subpackage Administration … … 16 16 define( 'WXR_VERSION', '1.2' ); 17 17 18 18 /** 19 * Generates the WXR export file for download.19 * Wrap given string in XML CDATA tag. 20 20 * 21 21 * @since 2.1.0 22 22 * 23 * @global wpdb $wpdb 24 * @global WP_Post $post 25 * 26 * @param array $args Filters defining what should be included in the export. 23 * @param string $str String to wrap in XML CDATA tag. 24 * @return string 27 25 */ 28 function export_wp( $args = array() ) { 29 global $wpdb, $post; 30 31 $defaults = array( 'content' => 'all', 'author' => false, 'category' => false, 32 'start_date' => false, 'end_date' => false, 'status' => false, 33 ); 34 $args = wp_parse_args( $args, $defaults ); 35 36 /** 37 * Fires at the beginning of an export, before any headers are sent. 38 * 39 * @since 2.3.0 40 * 41 * @param array $args An array of export arguments. 42 */ 43 do_action( 'export_wp', $args ); 44 45 $sitename = sanitize_key( get_bloginfo( 'name' ) ); 46 if ( ! empty( $sitename ) ) { 47 $sitename .= '.'; 26 function wxr_cdata( $str ) { 27 if ( ! seems_utf8( $str ) ) { 28 $str = utf8_encode( $str ); 48 29 } 49 $date = date( 'Y-m-d' ); 50 $wp_filename = $sitename . 'wordpress.' . $date . '.xml'; 51 /** 52 * Filters the export filename. 53 * 54 * @since 4.4.0 55 * 56 * @param string $wp_filename The name of the file for download. 57 * @param string $sitename The site name. 58 * @param string $date Today's date, formatted. 59 */ 60 $filename = apply_filters( 'export_wp_filename', $wp_filename, $sitename, $date ); 30 // $str = ent2ncr(esc_html($str)); 31 $str = '<![CDATA[' . str_replace( ']]>', ']]]]><![CDATA[>', $str ) . ']]>'; 61 32 62 header( 'Content-Description: File Transfer' ); 63 header( 'Content-Disposition: attachment; filename=' . $filename ); 64 header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true ); 33 return $str; 34 } 65 35 66 if ( 'all' != $args['content'] && post_type_exists( $args['content'] ) ) { 67 $ptype = get_post_type_object( $args['content'] ); 68 if ( ! $ptype->can_export ) 69 $args['content'] = 'post'; 70 71 $where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $args['content'] ); 72 } else { 73 $post_types = get_post_types( array( 'can_export' => true ) ); 74 $esses = array_fill( 0, count($post_types), '%s' ); 75 $where = $wpdb->prepare( "{$wpdb->posts}.post_type IN (" . implode( ',', $esses ) . ')', $post_types ); 76 } 77 78 if ( $args['status'] && ( 'post' == $args['content'] || 'page' == $args['content'] ) ) 79 $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_status = %s", $args['status'] ); 36 /** 37 * Return the URL of the site 38 * 39 * @since 2.5.0 40 * 41 * @return string Site URL. 42 */ 43 function wxr_site_url() { 44 // Multisite: the base URL. 45 if ( is_multisite() ) 46 return network_home_url(); 47 // WordPress (single site): the blog URL. 80 48 else 81 $where .= " AND {$wpdb->posts}.post_status != 'auto-draft'"; 49 return get_bloginfo_rss( 'url' ); 50 } 82 51 83 $join = ''; 84 if ( $args['category'] && 'post' == $args['content'] ) { 85 if ( $term = term_exists( $args['category'], 'category' ) ) { 86 $join = "INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)"; 87 $where .= $wpdb->prepare( " AND {$wpdb->term_relationships}.term_taxonomy_id = %d", $term['term_taxonomy_id'] ); 88 } 89 } 52 /** 53 * Output a cat_name XML tag from a given category object 54 * 55 * @since 2.1.0 56 * 57 * @param object $category Category Object 58 */ 59 function wxr_cat_name( $category ) { 60 if ( empty( $category->name ) ) 61 return; 90 62 91 if ( 'post' == $args['content'] || 'page' == $args['content'] || 'attachment' == $args['content'] ) { 92 if ( $args['author'] ) 93 $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_author = %d", $args['author'] ); 63 echo '<wp:cat_name>' . wxr_cdata( $category->name ) . "</wp:cat_name>\n"; 64 } 94 65 95 if ( $args['start_date'] ) 96 $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date >= %s", date( 'Y-m-d', strtotime($args['start_date']) ) ); 66 /** 67 * Output a category_description XML tag from a given category object 68 * 69 * @since 2.1.0 70 * 71 * @param object $category Category Object 72 */ 73 function wxr_category_description( $category ) { 74 if ( empty( $category->description ) ) 75 return; 97 76 98 if ( $args['end_date'] ) 99 $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date < %s", date( 'Y-m-d', strtotime('+1 month', strtotime($args['end_date'])) ) ); 100 } 77 echo '<wp:category_description>' . wxr_cdata( $category->description ) . "</wp:category_description>\n"; 78 } 101 79 102 // Grab a snapshot of post IDs, just in case it changes during the export. 103 $post_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} $join WHERE $where" ); 80 /** 81 * Output a tag_name XML tag from a given tag object 82 * 83 * @since 2.3.0 84 * 85 * @param object $tag Tag Object 86 */ 87 function wxr_tag_name( $tag ) { 88 if ( empty( $tag->name ) ) 89 return; 104 90 105 /* 106 * Get the requested terms ready, empty unless posts filtered by category 107 * or all content. 108 */ 109 $cats = $tags = $terms = array(); 110 if ( isset( $term ) && $term ) { 111 $cat = get_term( $term['term_id'], 'category' ); 112 $cats = array( $cat->term_id => $cat ); 113 unset( $term, $cat ); 114 } elseif ( 'all' == $args['content'] ) { 115 $categories = (array) get_categories( array( 'get' => 'all' ) ); 116 $tags = (array) get_tags( array( 'get' => 'all' ) ); 91 echo '<wp:tag_name>' . wxr_cdata( $tag->name ) . "</wp:tag_name>\n"; 92 } 117 93 118 $custom_taxonomies = get_taxonomies( array( '_builtin' => false ) ); 119 $custom_terms = (array) get_terms( $custom_taxonomies, array( 'get' => 'all' ) ); 94 /** 95 * Output a tag_description XML tag from a given tag object 96 * 97 * @since 2.3.0 98 * 99 * @param object $tag Tag Object 100 */ 101 function wxr_tag_description( $tag ) { 102 if ( empty( $tag->description ) ) 103 return; 120 104 121 // Put categories in order with no child going before its parent. 122 while ( $cat = array_shift( $categories ) ) { 123 if ( $cat->parent == 0 || isset( $cats[$cat->parent] ) ) 124 $cats[$cat->term_id] = $cat; 125 else 126 $categories[] = $cat; 127 } 105 echo '<wp:tag_description>' . wxr_cdata( $tag->description ) . "</wp:tag_description>\n"; 106 } 128 107 129 // Put terms in order with no child going before its parent. 130 while ( $t = array_shift( $custom_terms ) ) { 131 if ( $t->parent == 0 || isset( $terms[$t->parent] ) ) 132 $terms[$t->term_id] = $t; 133 else 134 $custom_terms[] = $t; 135 } 108 /** 109 * Output a term_name XML tag from a given term object 110 * 111 * @since 2.9.0 112 * 113 * @param object $term Term Object 114 */ 115 function wxr_term_name( $term ) { 116 if ( empty( $term->name ) ) 117 return; 136 118 137 unset( $categories, $custom_taxonomies, $custom_terms );138 119 echo '<wp:term_name>' . wxr_cdata( $term->name ) . "</wp:term_name>\n"; 120 } 139 121 140 /** 141 * Wrap given string in XML CDATA tag. 142 * 143 * @since 2.1.0 144 * 145 * @param string $str String to wrap in XML CDATA tag. 146 * @return string 147 */ 148 function wxr_cdata( $str ) { 149 if ( ! seems_utf8( $str ) ) { 150 $str = utf8_encode( $str ); 151 } 152 // $str = ent2ncr(esc_html($str)); 153 $str = '<![CDATA[' . str_replace( ']]>', ']]]]><![CDATA[>', $str ) . ']]>'; 122 /** 123 * Output a term_description XML tag from a given term object 124 * 125 * @since 2.9.0 126 * 127 * @param object $term Term Object 128 */ 129 function wxr_term_description( $term ) { 130 if ( empty( $term->description ) ) 131 return; 154 132 155 return $str;156 133 echo "\t\t<wp:term_description>" . wxr_cdata( $term->description ) . "</wp:term_description>\n"; 134 } 157 135 158 /** 159 * Return the URL of the site 160 * 161 * @since 2.5.0 162 * 163 * @return string Site URL. 164 */ 165 function wxr_site_url() { 166 // Multisite: the base URL. 167 if ( is_multisite() ) 168 return network_home_url(); 169 // WordPress (single site): the blog URL. 170 else 171 return get_bloginfo_rss( 'url' ); 172 } 136 /** 137 * Output termmeta XML tags for a given term object. 138 * 139 * @since 4.6.0 140 * 141 * @param WP_Term $term Term object. 142 */ 143 function wxr_term_meta( $term ) { 144 global $wpdb; 173 145 174 /** 175 * Output a cat_name XML tag from a given category object 176 * 177 * @since 2.1.0 178 * 179 * @param object $category Category Object 180 */ 181 function wxr_cat_name( $category ) { 182 if ( empty( $category->name ) ) 183 return; 146 $termmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->termmeta WHERE term_id = %d", $term->term_id ) ); 184 147 185 echo '<wp:cat_name>' . wxr_cdata( $category->name ) . "</wp:cat_name>\n"; 148 foreach ( $termmeta as $meta ) { 149 /** 150 * Filters whether to selectively skip term meta used for WXR exports. 151 * 152 * Returning a truthy value to the filter will skip the current meta 153 * object from being exported. 154 * 155 * @since 4.6.0 156 * 157 * @param bool $skip Whether to skip the current piece of term meta. Default false. 158 * @param string $meta_key Current meta key. 159 * @param object $meta Current meta object. 160 */ 161 if ( ! apply_filters( 'wxr_export_skip_termmeta', false, $meta->meta_key, $meta ) ) { 162 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 ) ); 163 } 186 164 } 165 } 187 166 188 /** 189 * Output a category_description XML tag from a given category object 190 * 191 * @since 2.1.0 192 * 193 * @param object $category Category Object 194 */ 195 function wxr_category_description( $category ) { 196 if ( empty( $category->description ) ) 197 return; 167 /** 168 * Output list of authors with posts 169 * 170 * @since 3.1.0 171 * 172 * @global wpdb $wpdb WordPress database abstraction object. 173 * 174 * @param array $post_ids Array of post IDs to filter the query by. Optional. 175 */ 176 function wxr_authors_list( array $post_ids = null ) { 177 global $wpdb; 198 178 199 echo '<wp:category_description>' . wxr_cdata( $category->description ) . "</wp:category_description>\n"; 179 if ( !empty( $post_ids ) ) { 180 $post_ids = array_map( 'absint', $post_ids ); 181 $and = 'AND ID IN ( ' . implode( ', ', $post_ids ) . ')'; 182 } else { 183 $and = ''; 200 184 } 201 185 202 /** 203 * Output a tag_name XML tag from a given tag object 204 * 205 * @since 2.3.0 206 * 207 * @param object $tag Tag Object 208 */ 209 function wxr_tag_name( $tag ) { 210 if ( empty( $tag->name ) ) 211 return; 186 $authors = array(); 187 $results = $wpdb->get_results( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_status != 'auto-draft' $and" ); 188 foreach ( (array) $results as $result ) 189 $authors[] = get_userdata( $result->post_author ); 212 190 213 echo '<wp:tag_name>' . wxr_cdata( $tag->name ) . "</wp:tag_name>\n"; 214 } 191 $authors = array_filter( $authors ); 215 192 216 /** 217 * Output a tag_description XML tag from a given tag object 218 * 219 * @since 2.3.0 220 * 221 * @param object $tag Tag Object 222 */ 223 function wxr_tag_description( $tag ) { 224 if ( empty( $tag->description ) ) 225 return; 226 227 echo '<wp:tag_description>' . wxr_cdata( $tag->description ) . "</wp:tag_description>\n"; 193 foreach ( $authors as $author ) { 194 echo "\t<wp:author>"; 195 echo '<wp:author_id>' . intval( $author->ID ) . '</wp:author_id>'; 196 echo '<wp:author_login>' . wxr_cdata( $author->user_login ) . '</wp:author_login>'; 197 echo '<wp:author_email>' . wxr_cdata( $author->user_email ) . '</wp:author_email>'; 198 echo '<wp:author_display_name>' . wxr_cdata( $author->display_name ) . '</wp:author_display_name>'; 199 echo '<wp:author_first_name>' . wxr_cdata( $author->first_name ) . '</wp:author_first_name>'; 200 echo '<wp:author_last_name>' . wxr_cdata( $author->last_name ) . '</wp:author_last_name>'; 201 echo "</wp:author>\n"; 228 202 } 203 } 229 204 230 /** 231 * Output a term_name XML tag from a given term object 232 * 233 * @since 2.9.0 234 * 235 * @param object $term Term Object 236 */ 237 function wxr_term_name( $term ) { 238 if ( empty( $term->name ) ) 239 return; 205 /** 206 * Ouput all navigation menu terms 207 * 208 * @since 3.1.0 209 */ 210 function wxr_nav_menu_terms() { 211 $nav_menus = wp_get_nav_menus(); 212 if ( empty( $nav_menus ) || ! is_array( $nav_menus ) ) 213 return; 240 214 241 echo '<wp:term_name>' . wxr_cdata( $term->name ) . "</wp:term_name>\n"; 215 foreach ( $nav_menus as $menu ) { 216 echo "\t<wp:term>"; 217 echo '<wp:term_id>' . intval( $menu->term_id ) . '</wp:term_id>'; 218 echo '<wp:term_taxonomy>nav_menu</wp:term_taxonomy>'; 219 echo '<wp:term_slug>' . wxr_cdata( $menu->slug ) . '</wp:term_slug>'; 220 wxr_term_name( $menu ); 221 echo "</wp:term>\n"; 242 222 } 223 } 243 224 244 /** 245 * Output a term_description XML tag from a given term object 246 * 247 * @since 2.9.0 248 * 249 * @param object $term Term Object 250 */ 251 function wxr_term_description( $term ) { 252 if ( empty( $term->description ) ) 253 return; 225 /** 226 * Output list of taxonomy terms, in XML tag format, associated with a post 227 * 228 * @since 2.3.0 229 */ 230 function wxr_post_taxonomy() { 231 $post = get_post(); 254 232 255 echo "\t\t<wp:term_description>" . wxr_cdata( $term->description ) . "</wp:term_description>\n"; 256 } 233 $taxonomies = get_object_taxonomies( $post->post_type ); 234 if ( empty( $taxonomies ) ) 235 return; 236 $terms = wp_get_object_terms( $post->ID, $taxonomies ); 257 237 258 /** 259 * Output termmeta XML tags for a given term object. 260 * 261 * @since 4.6.0 262 * 263 * @param WP_Term $term Term object. 264 */ 265 function wxr_term_meta( $term ) { 266 global $wpdb; 267 268 $termmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->termmeta WHERE term_id = %d", $term->term_id ) ); 269 270 foreach ( $termmeta as $meta ) { 271 /** 272 * Filters whether to selectively skip term meta used for WXR exports. 273 * 274 * Returning a truthy value to the filter will skip the current meta 275 * object from being exported. 276 * 277 * @since 4.6.0 278 * 279 * @param bool $skip Whether to skip the current piece of term meta. Default false. 280 * @param string $meta_key Current meta key. 281 * @param object $meta Current meta object. 282 */ 283 if ( ! apply_filters( 'wxr_export_skip_termmeta', false, $meta->meta_key, $meta ) ) { 284 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 ) ); 285 } 286 } 238 foreach ( (array) $terms as $term ) { 239 echo "\t\t<category domain=\"{$term->taxonomy}\" nicename=\"{$term->slug}\">" . wxr_cdata( $term->name ) . "</category>\n"; 287 240 } 241 } 288 242 289 /** 290 * Output list of authors with posts 291 * 292 * @since 3.1.0 293 * 294 * @global wpdb $wpdb WordPress database abstraction object. 295 * 296 * @param array $post_ids Array of post IDs to filter the query by. Optional. 297 */ 298 function wxr_authors_list( array $post_ids = null ) { 299 global $wpdb; 300 301 if ( !empty( $post_ids ) ) { 302 $post_ids = array_map( 'absint', $post_ids ); 303 $and = 'AND ID IN ( ' . implode( ', ', $post_ids ) . ')'; 304 } else { 305 $and = ''; 306 } 307 308 $authors = array(); 309 $results = $wpdb->get_results( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_status != 'auto-draft' $and" ); 310 foreach ( (array) $results as $result ) 311 $authors[] = get_userdata( $result->post_author ); 312 313 $authors = array_filter( $authors ); 314 315 foreach ( $authors as $author ) { 316 echo "\t<wp:author>"; 317 echo '<wp:author_id>' . intval( $author->ID ) . '</wp:author_id>'; 318 echo '<wp:author_login>' . wxr_cdata( $author->user_login ) . '</wp:author_login>'; 319 echo '<wp:author_email>' . wxr_cdata( $author->user_email ) . '</wp:author_email>'; 320 echo '<wp:author_display_name>' . wxr_cdata( $author->display_name ) . '</wp:author_display_name>'; 321 echo '<wp:author_first_name>' . wxr_cdata( $author->first_name ) . '</wp:author_first_name>'; 322 echo '<wp:author_last_name>' . wxr_cdata( $author->last_name ) . '</wp:author_last_name>'; 323 echo "</wp:author>\n"; 324 } 325 } 326 327 /** 328 * Ouput all navigation menu terms 329 * 330 * @since 3.1.0 331 */ 332 function wxr_nav_menu_terms() { 333 $nav_menus = wp_get_nav_menus(); 334 if ( empty( $nav_menus ) || ! is_array( $nav_menus ) ) 335 return; 336 337 foreach ( $nav_menus as $menu ) { 338 echo "\t<wp:term>"; 339 echo '<wp:term_id>' . intval( $menu->term_id ) . '</wp:term_id>'; 340 echo '<wp:term_taxonomy>nav_menu</wp:term_taxonomy>'; 341 echo '<wp:term_slug>' . wxr_cdata( $menu->slug ) . '</wp:term_slug>'; 342 wxr_term_name( $menu ); 343 echo "</wp:term>\n"; 344 } 345 } 346 347 /** 348 * Output list of taxonomy terms, in XML tag format, associated with a post 349 * 350 * @since 2.3.0 351 */ 352 function wxr_post_taxonomy() { 353 $post = get_post(); 354 355 $taxonomies = get_object_taxonomies( $post->post_type ); 356 if ( empty( $taxonomies ) ) 357 return; 358 $terms = wp_get_object_terms( $post->ID, $taxonomies ); 359 360 foreach ( (array) $terms as $term ) { 361 echo "\t\t<category domain=\"{$term->taxonomy}\" nicename=\"{$term->slug}\">" . wxr_cdata( $term->name ) . "</category>\n"; 362 } 363 } 364 365 /** 366 * 367 * @param bool $return_me 368 * @param string $meta_key 369 * @return bool 370 */ 371 function wxr_filter_postmeta( $return_me, $meta_key ) { 372 if ( '_edit_lock' == $meta_key ) 373 $return_me = true; 374 return $return_me; 375 } 376 add_filter( 'wxr_export_skip_postmeta', 'wxr_filter_postmeta', 10, 2 ); 377 378 echo '<?xml version="1.0" encoding="' . get_bloginfo('charset') . "\" ?>\n"; 379 380 ?> 381 <!-- This is a WordPress eXtended RSS file generated by WordPress as an export of your site. --> 382 <!-- It contains information about your site's posts, pages, comments, categories, and other content. --> 383 <!-- You may use this file to transfer that content from one site to another. --> 384 <!-- This file is not intended to serve as a complete backup of your site. --> 385 386 <!-- To import this information into a WordPress site follow these steps: --> 387 <!-- 1. Log in to that site as an administrator. --> 388 <!-- 2. Go to Tools: Import in the WordPress admin panel. --> 389 <!-- 3. Install the "WordPress" importer from the list. --> 390 <!-- 4. Activate & Run Importer. --> 391 <!-- 5. Upload this file using the form provided on that page. --> 392 <!-- 6. You will first be asked to map the authors in this export file to users --> 393 <!-- on the site. For each author, you may choose to map to an --> 394 <!-- existing user on the site or to create a new user. --> 395 <!-- 7. WordPress will then import each of the posts, pages, comments, categories, etc. --> 396 <!-- contained in this file into your site. --> 397 398 <?php the_generator( 'export' ); ?> 399 <rss version="2.0" 400 xmlns:excerpt="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/excerpt/" 401 xmlns:content="http://purl.org/rss/1.0/modules/content/" 402 xmlns:wfw="http://wellformedweb.org/CommentAPI/" 403 xmlns:dc="http://purl.org/dc/elements/1.1/" 404 xmlns:wp="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/" 405 > 406 407 <channel> 408 <title><?php bloginfo_rss( 'name' ); ?></title> 409 <link><?php bloginfo_rss( 'url' ); ?></link> 410 <description><?php bloginfo_rss( 'description' ); ?></description> 411 <pubDate><?php echo date( 'D, d M Y H:i:s +0000' ); ?></pubDate> 412 <language><?php bloginfo_rss( 'language' ); ?></language> 413 <wp:wxr_version><?php echo WXR_VERSION; ?></wp:wxr_version> 414 <wp:base_site_url><?php echo wxr_site_url(); ?></wp:base_site_url> 415 <wp:base_blog_url><?php bloginfo_rss( 'url' ); ?></wp:base_blog_url> 416 417 <?php wxr_authors_list( $post_ids ); ?> 418 419 <?php foreach ( $cats as $c ) : ?> 420 <wp:category> 421 <wp:term_id><?php echo intval( $c->term_id ); ?></wp:term_id> 422 <wp:category_nicename><?php echo wxr_cdata( $c->slug ); ?></wp:category_nicename> 423 <wp:category_parent><?php echo wxr_cdata( $c->parent ? $cats[$c->parent]->slug : '' ); ?></wp:category_parent> 424 <?php wxr_cat_name( $c ); 425 wxr_category_description( $c ); 426 wxr_term_meta( $c ); ?> 427 </wp:category> 428 <?php endforeach; ?> 429 <?php foreach ( $tags as $t ) : ?> 430 <wp:tag> 431 <wp:term_id><?php echo intval( $t->term_id ); ?></wp:term_id> 432 <wp:tag_slug><?php echo wxr_cdata( $t->slug ); ?></wp:tag_slug> 433 <?php wxr_tag_name( $t ); 434 wxr_tag_description( $t ); 435 wxr_term_meta( $t ); ?> 436 </wp:tag> 437 <?php endforeach; ?> 438 <?php foreach ( $terms as $t ) : ?> 439 <wp:term> 440 <wp:term_id><?php echo wxr_cdata( $t->term_id ); ?></wp:term_id> 441 <wp:term_taxonomy><?php echo wxr_cdata( $t->taxonomy ); ?></wp:term_taxonomy> 442 <wp:term_slug><?php echo wxr_cdata( $t->slug ); ?></wp:term_slug> 443 <wp:term_parent><?php echo wxr_cdata( $t->parent ? $terms[$t->parent]->slug : '' ); ?></wp:term_parent> 444 <?php wxr_term_name( $t ); 445 wxr_term_description( $t ); 446 wxr_term_meta( $t ); ?> 447 </wp:term> 448 <?php endforeach; ?> 449 <?php if ( 'all' == $args['content'] ) wxr_nav_menu_terms(); ?> 450 451 <?php 452 /** This action is documented in wp-includes/feed-rss2.php */ 453 do_action( 'rss2_head' ); 454 ?> 455 456 <?php if ( $post_ids ) { 457 /** 458 * @global WP_Query $wp_query 459 */ 460 global $wp_query; 461 462 // Fake being in the loop. 463 $wp_query->in_the_loop = true; 464 465 // Fetch 20 posts at a time rather than loading the entire table into memory. 466 while ( $next_posts = array_splice( $post_ids, 0, 20 ) ) { 467 $where = 'WHERE ID IN (' . join( ',', $next_posts ) . ')'; 468 $posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" ); 469 470 // Begin Loop. 471 foreach ( $posts as $post ) { 472 setup_postdata( $post ); 473 $is_sticky = is_sticky( $post->ID ) ? 1 : 0; 474 ?> 475 <item> 476 <title><?php 477 /** This filter is documented in wp-includes/feed.php */ 478 echo apply_filters( 'the_title_rss', $post->post_title ); 479 ?></title> 480 <link><?php the_permalink_rss() ?></link> 481 <pubDate><?php echo mysql2date( 'D, d M Y H:i:s +0000', get_post_time( 'Y-m-d H:i:s', true ), false ); ?></pubDate> 482 <dc:creator><?php echo wxr_cdata( get_the_author_meta( 'login' ) ); ?></dc:creator> 483 <guid isPermaLink="false"><?php the_guid(); ?></guid> 484 <description></description> 485 <content:encoded><?php 486 /** 487 * Filters the post content used for WXR exports. 488 * 489 * @since 2.5.0 490 * 491 * @param string $post_content Content of the current post. 492 */ 493 echo wxr_cdata( apply_filters( 'the_content_export', $post->post_content ) ); 494 ?></content:encoded> 495 <excerpt:encoded><?php 496 /** 497 * Filters the post excerpt used for WXR exports. 498 * 499 * @since 2.6.0 500 * 501 * @param string $post_excerpt Excerpt for the current post. 502 */ 503 echo wxr_cdata( apply_filters( 'the_excerpt_export', $post->post_excerpt ) ); 504 ?></excerpt:encoded> 505 <wp:post_id><?php echo intval( $post->ID ); ?></wp:post_id> 506 <wp:post_date><?php echo wxr_cdata( $post->post_date ); ?></wp:post_date> 507 <wp:post_date_gmt><?php echo wxr_cdata( $post->post_date_gmt ); ?></wp:post_date_gmt> 508 <wp:comment_status><?php echo wxr_cdata( $post->comment_status ); ?></wp:comment_status> 509 <wp:ping_status><?php echo wxr_cdata( $post->ping_status ); ?></wp:ping_status> 510 <wp:post_name><?php echo wxr_cdata( $post->post_name ); ?></wp:post_name> 511 <wp:status><?php echo wxr_cdata( $post->post_status ); ?></wp:status> 512 <wp:post_parent><?php echo intval( $post->post_parent ); ?></wp:post_parent> 513 <wp:menu_order><?php echo intval( $post->menu_order ); ?></wp:menu_order> 514 <wp:post_type><?php echo wxr_cdata( $post->post_type ); ?></wp:post_type> 515 <wp:post_password><?php echo wxr_cdata( $post->post_password ); ?></wp:post_password> 516 <wp:is_sticky><?php echo intval( $is_sticky ); ?></wp:is_sticky> 517 <?php if ( $post->post_type == 'attachment' ) : ?> 518 <wp:attachment_url><?php echo wxr_cdata( wp_get_attachment_url( $post->ID ) ); ?></wp:attachment_url> 519 <?php endif; ?> 520 <?php wxr_post_taxonomy(); ?> 521 <?php $postmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID ) ); 522 foreach ( $postmeta as $meta ) : 523 /** 524 * Filters whether to selectively skip post meta used for WXR exports. 525 * 526 * Returning a truthy value to the filter will skip the current meta 527 * object from being exported. 528 * 529 * @since 3.3.0 530 * 531 * @param bool $skip Whether to skip the current post meta. Default false. 532 * @param string $meta_key Current meta key. 533 * @param object $meta Current meta object. 534 */ 535 if ( apply_filters( 'wxr_export_skip_postmeta', false, $meta->meta_key, $meta ) ) 536 continue; 537 ?> 538 <wp:postmeta> 539 <wp:meta_key><?php echo wxr_cdata( $meta->meta_key ); ?></wp:meta_key> 540 <wp:meta_value><?php echo wxr_cdata( $meta->meta_value ); ?></wp:meta_value> 541 </wp:postmeta> 542 <?php endforeach; 543 544 $_comments = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved <> 'spam'", $post->ID ) ); 545 $comments = array_map( 'get_comment', $_comments ); 546 foreach ( $comments as $c ) : ?> 547 <wp:comment> 548 <wp:comment_id><?php echo intval( $c->comment_ID ); ?></wp:comment_id> 549 <wp:comment_author><?php echo wxr_cdata( $c->comment_author ); ?></wp:comment_author> 550 <wp:comment_author_email><?php echo wxr_cdata( $c->comment_author_email ); ?></wp:comment_author_email> 551 <wp:comment_author_url><?php echo esc_url_raw( $c->comment_author_url ); ?></wp:comment_author_url> 552 <wp:comment_author_IP><?php echo wxr_cdata( $c->comment_author_IP ); ?></wp:comment_author_IP> 553 <wp:comment_date><?php echo wxr_cdata( $c->comment_date ); ?></wp:comment_date> 554 <wp:comment_date_gmt><?php echo wxr_cdata( $c->comment_date_gmt ); ?></wp:comment_date_gmt> 555 <wp:comment_content><?php echo wxr_cdata( $c->comment_content ) ?></wp:comment_content> 556 <wp:comment_approved><?php echo wxr_cdata( $c->comment_approved ); ?></wp:comment_approved> 557 <wp:comment_type><?php echo wxr_cdata( $c->comment_type ); ?></wp:comment_type> 558 <wp:comment_parent><?php echo intval( $c->comment_parent ); ?></wp:comment_parent> 559 <wp:comment_user_id><?php echo intval( $c->user_id ); ?></wp:comment_user_id> 560 <?php $c_meta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->commentmeta WHERE comment_id = %d", $c->comment_ID ) ); 561 foreach ( $c_meta as $meta ) : 562 /** 563 * Filters whether to selectively skip comment meta used for WXR exports. 564 * 565 * Returning a truthy value to the filter will skip the current meta 566 * object from being exported. 567 * 568 * @since 4.0.0 569 * 570 * @param bool $skip Whether to skip the current comment meta. Default false. 571 * @param string $meta_key Current meta key. 572 * @param object $meta Current meta object. 573 */ 574 if ( apply_filters( 'wxr_export_skip_commentmeta', false, $meta->meta_key, $meta ) ) { 575 continue; 576 } 577 ?> 578 <wp:commentmeta> 579 <wp:meta_key><?php echo wxr_cdata( $meta->meta_key ); ?></wp:meta_key> 580 <wp:meta_value><?php echo wxr_cdata( $meta->meta_value ); ?></wp:meta_value> 581 </wp:commentmeta> 582 <?php endforeach; ?> 583 </wp:comment> 584 <?php endforeach; ?> 585 </item> 586 <?php 587 } 588 } 589 } ?> 590 </channel> 591 </rss> 592 <?php 593 } 243 /** 244 * 245 * @param bool $return_me 246 * @param string $meta_key 247 * @return bool 248 */ 249 function wxr_filter_postmeta( $return_me, $meta_key ) { 250 if ( '_edit_lock' == $meta_key ) 251 $return_me = true; 252 return $return_me; 253 } 254 No newline at end of file -
src/wp-includes/comment-template.php
1168 1168 */ 1169 1169 function comments_open( $post_id = null ) { 1170 1170 1171 $_post = get_post( $post_id);1171 $_post = get_post( $post_id ); 1172 1172 1173 $open = ( 'open' == $_post->comment_status );1173 $open = $_post && isset( $_post->comment_status ) && ( 'open' == $_post->comment_status ); 1174 1174 1175 1175 /** 1176 1176 * Filters whether the current post is open for comments. -
tests/phpunit/tests/export/export-wp.php
1 1 <?php 2 2 3 require_once dirname( __FILE__ ) . '/base.php';4 5 3 /** 6 4 * @group import 7 5 */ 8 class Tests_Import_Import extends WP_Import_UnitTestCase { 9 function setUp() { 6 class Tests_Export_Export_Wp extends WP_UnitTestCase { 7 function setUp() 8 { 10 9 parent::setUp(); 11 10 12 if ( ! defined( 'WP_IMPORTING' ) ) 13 define( 'WP_IMPORTING', true ); 14 15 if ( ! defined( 'WP_LOAD_IMPORTERS' ) ) 16 define( 'WP_LOAD_IMPORTERS', true ); 17 18 add_filter( 'import_allow_create_users', '__return_true' ); 19 20 if ( ! file_exists( DIR_TESTDATA . '/plugins/wordpress-importer/wordpress-importer.php' ) ) { 21 $this->markTestSkipped( 'WordPress Importer plugin is not installed.' ); 22 } 23 24 require_once DIR_TESTDATA . '/plugins/wordpress-importer/wordpress-importer.php'; 25 26 global $wpdb; 27 // crude but effective: make sure there's no residual data in the main tables 28 foreach ( array('posts', 'postmeta', 'comments', 'terms', 'term_taxonomy', 'term_relationships', 'users', 'usermeta') as $table) 29 $wpdb->query("DELETE FROM {$wpdb->$table}"); 11 require_once ABSPATH . '/wp-admin/includes/export.php'; 30 12 } 31 13 32 function tearDown() {33 remove_filter( 'import_allow_create_users', '__return_true' );34 14 35 parent::tearDown(); 36 } 15 /** 16 * export_wp() shall not throw errors due to previously declared functions. 17 * 18 * As of ticket #33563 calling `export_wp()` multiple times causes WP to die. 19 * The function has been refactored and should no longer be such a pain. 20 * 21 * @see https://core.trac.wordpress.org/ticket/33563 22 * 23 * @runInSeparateProcess 24 */ 25 function test_it_can_run_multiple_times() { 37 26 38 function test_small_import() { 39 global $wpdb; 40 41 $authors = array( 'admin' => false, 'editor' => false, 'author' => false ); 42 $this->_import_wp( DIR_TESTDATA . '/export/small-export.xml', $authors ); 43 44 // ensure that authors were imported correctly 45 $user_count = count_users(); 46 $this->assertEquals( 3, $user_count['total_users'] ); 47 $admin = get_user_by( 'login', 'admin' ); 48 $this->assertEquals( 'admin', $admin->user_login ); 49 $this->assertEquals( 'local@host.null', $admin->user_email ); 50 $editor = get_user_by( 'login', 'editor' ); 51 $this->assertEquals( 'editor', $editor->user_login ); 52 $this->assertEquals( 'editor@example.org', $editor->user_email ); 53 $this->assertEquals( 'FirstName', $editor->user_firstname ); 54 $this->assertEquals( 'LastName', $editor->user_lastname ); 55 $author = get_user_by( 'login', 'author' ); 56 $this->assertEquals( 'author', $author->user_login ); 57 $this->assertEquals( 'author@example.org', $author->user_email ); 58 59 // check that terms were imported correctly 60 $this->assertEquals( 30, wp_count_terms( 'category' ) ); 61 $this->assertEquals( 3, wp_count_terms( 'post_tag' ) ); 62 $foo = get_term_by( 'slug', 'foo', 'category' ); 63 $this->assertEquals( 0, $foo->parent ); 64 $bar = get_term_by( 'slug', 'bar', 'category' ); 65 $foo_bar = get_term_by( 'slug', 'foo-bar', 'category' ); 66 $this->assertEquals( $bar->term_id, $foo_bar->parent ); 67 68 // check that posts/pages were imported correctly 69 $post_count = wp_count_posts( 'post' ); 70 $this->assertEquals( 5, $post_count->publish ); 71 $this->assertEquals( 1, $post_count->private ); 72 $page_count = wp_count_posts( 'page' ); 73 $this->assertEquals( 4, $page_count->publish ); 74 $this->assertEquals( 1, $page_count->draft ); 75 $comment_count = wp_count_comments(); 76 $this->assertEquals( 1, $comment_count->total_comments ); 77 78 $posts = get_posts( array( 'numberposts' => 20, 'post_type' => 'any', 'post_status' => 'any', 'orderby' => 'ID' ) ); 79 $this->assertEquals( 11, count($posts) ); 80 81 $post = $posts[0]; 82 $this->assertEquals( 'Many Categories', $post->post_title ); 83 $this->assertEquals( 'many-categories', $post->post_name ); 84 $this->assertEquals( $admin->ID, $post->post_author ); 85 $this->assertEquals( 'post', $post->post_type ); 86 $this->assertEquals( 'publish', $post->post_status ); 87 $this->assertEquals( 0, $post->post_parent ); 88 $cats = wp_get_post_categories( $post->ID ); 89 $this->assertEquals( 27, count($cats) ); 90 91 $post = $posts[1]; 92 $this->assertEquals( 'Non-standard post format', $post->post_title ); 93 $this->assertEquals( 'non-standard-post-format', $post->post_name ); 94 $this->assertEquals( $admin->ID, $post->post_author ); 95 $this->assertEquals( 'post', $post->post_type ); 96 $this->assertEquals( 'publish', $post->post_status ); 97 $this->assertEquals( 0, $post->post_parent ); 98 $cats = wp_get_post_categories( $post->ID ); 99 $this->assertEquals( 1, count($cats) ); 100 $this->assertTrue( has_post_format( 'aside', $post->ID ) ); 101 102 $post = $posts[2]; 103 $this->assertEquals( 'Top-level Foo', $post->post_title ); 104 $this->assertEquals( 'top-level-foo', $post->post_name ); 105 $this->assertEquals( $admin->ID, $post->post_author ); 106 $this->assertEquals( 'post', $post->post_type ); 107 $this->assertEquals( 'publish', $post->post_status ); 108 $this->assertEquals( 0, $post->post_parent ); 109 $cats = wp_get_post_categories( $post->ID, array( 'fields' => 'all' ) ); 110 $this->assertEquals( 1, count($cats) ); 111 $this->assertEquals( 'foo', $cats[0]->slug ); 112 113 $post = $posts[3]; 114 $this->assertEquals( 'Foo-child', $post->post_title ); 115 $this->assertEquals( 'foo-child', $post->post_name ); 116 $this->assertEquals( $editor->ID, $post->post_author ); 117 $this->assertEquals( 'post', $post->post_type ); 118 $this->assertEquals( 'publish', $post->post_status ); 119 $this->assertEquals( 0, $post->post_parent ); 120 $cats = wp_get_post_categories( $post->ID, array( 'fields' => 'all' ) ); 121 $this->assertEquals( 1, count($cats) ); 122 $this->assertEquals( 'foo-bar', $cats[0]->slug ); 123 124 $post = $posts[4]; 125 $this->assertEquals( 'Private Post', $post->post_title ); 126 $this->assertEquals( 'private-post', $post->post_name ); 127 $this->assertEquals( $admin->ID, $post->post_author ); 128 $this->assertEquals( 'post', $post->post_type ); 129 $this->assertEquals( 'private', $post->post_status ); 130 $this->assertEquals( 0, $post->post_parent ); 131 $cats = wp_get_post_categories( $post->ID ); 132 $this->assertEquals( 1, count($cats) ); 133 $tags = wp_get_post_tags( $post->ID ); 134 $this->assertEquals( 3, count($tags) ); 135 $this->assertEquals( 'tag1', $tags[0]->slug ); 136 $this->assertEquals( 'tag2', $tags[1]->slug ); 137 $this->assertEquals( 'tag3', $tags[2]->slug ); 138 139 $post = $posts[5]; 140 $this->assertEquals( '1-col page', $post->post_title ); 141 $this->assertEquals( '1-col-page', $post->post_name ); 142 $this->assertEquals( $admin->ID, $post->post_author ); 143 $this->assertEquals( 'page', $post->post_type ); 144 $this->assertEquals( 'publish', $post->post_status ); 145 $this->assertEquals( 0, $post->post_parent ); 146 $this->assertEquals( 'onecolumn-page.php', get_post_meta( $post->ID, '_wp_page_template', true ) ); 147 148 $post = $posts[6]; 149 $this->assertEquals( 'Draft Page', $post->post_title ); 150 $this->assertEquals( '', $post->post_name ); 151 $this->assertEquals( $admin->ID, $post->post_author ); 152 $this->assertEquals( 'page', $post->post_type ); 153 $this->assertEquals( 'draft', $post->post_status ); 154 $this->assertEquals( 0, $post->post_parent ); 155 $this->assertEquals( 'default', get_post_meta( $post->ID, '_wp_page_template', true ) ); 156 157 $post = $posts[7]; 158 $this->assertEquals( 'Parent Page', $post->post_title ); 159 $this->assertEquals( 'parent-page', $post->post_name ); 160 $this->assertEquals( $admin->ID, $post->post_author ); 161 $this->assertEquals( 'page', $post->post_type ); 162 $this->assertEquals( 'publish', $post->post_status ); 163 $this->assertEquals( 0, $post->post_parent ); 164 $this->assertEquals( 'default', get_post_meta( $post->ID, '_wp_page_template', true ) ); 165 166 $post = $posts[8]; 167 $this->assertEquals( 'Child Page', $post->post_title ); 168 $this->assertEquals( 'child-page', $post->post_name ); 169 $this->assertEquals( $admin->ID, $post->post_author ); 170 $this->assertEquals( 'page', $post->post_type ); 171 $this->assertEquals( 'publish', $post->post_status ); 172 $this->assertEquals( $posts[7]->ID, $post->post_parent ); 173 $this->assertEquals( 'default', get_post_meta( $post->ID, '_wp_page_template', true ) ); 174 175 $post = $posts[9]; 176 $this->assertEquals( 'Sample Page', $post->post_title ); 177 $this->assertEquals( 'sample-page', $post->post_name ); 178 $this->assertEquals( $admin->ID, $post->post_author ); 179 $this->assertEquals( 'page', $post->post_type ); 180 $this->assertEquals( 'publish', $post->post_status ); 181 $this->assertEquals( 0, $post->post_parent ); 182 $this->assertEquals( 'default', get_post_meta( $post->ID, '_wp_page_template', true ) ); 183 184 $post = $posts[10]; 185 $this->assertEquals( 'Hello world!', $post->post_title ); 186 $this->assertEquals( 'hello-world', $post->post_name ); 187 $this->assertEquals( $author->ID, $post->post_author ); 188 $this->assertEquals( 'post', $post->post_type ); 189 $this->assertEquals( 'publish', $post->post_status ); 190 $this->assertEquals( 0, $post->post_parent ); 191 $cats = wp_get_post_categories( $post->ID ); 192 $this->assertEquals( 1, count($cats) ); 27 ob_start(); 28 export_wp(); 29 $export_content = ob_get_clean(); 30 31 ob_start(); 32 export_wp(); 33 34 $this->assertEquals($export_content, ob_get_clean()); 193 35 } 194 195 function test_double_import() {196 $authors = array( 'admin' => false, 'editor' => false, 'author' => false );197 $this->_import_wp( DIR_TESTDATA . '/export/small-export.xml', $authors );198 $this->_import_wp( DIR_TESTDATA . '/export/small-export.xml', $authors );199 200 $user_count = count_users();201 $this->assertEquals( 3, $user_count['total_users'] );202 $admin = get_user_by( 'login', 'admin' );203 $this->assertEquals( 'admin', $admin->user_login );204 $this->assertEquals( 'local@host.null', $admin->user_email );205 $editor = get_user_by( 'login', 'editor' );206 $this->assertEquals( 'editor', $editor->user_login );207 $this->assertEquals( 'editor@example.org', $editor->user_email );208 $this->assertEquals( 'FirstName', $editor->user_firstname );209 $this->assertEquals( 'LastName', $editor->user_lastname );210 $author = get_user_by( 'login', 'author' );211 $this->assertEquals( 'author', $author->user_login );212 $this->assertEquals( 'author@example.org', $author->user_email );213 214 $this->assertEquals( 30, wp_count_terms( 'category' ) );215 $this->assertEquals( 3, wp_count_terms( 'post_tag' ) );216 $foo = get_term_by( 'slug', 'foo', 'category' );217 $this->assertEquals( 0, $foo->parent );218 $bar = get_term_by( 'slug', 'bar', 'category' );219 $foo_bar = get_term_by( 'slug', 'foo-bar', 'category' );220 $this->assertEquals( $bar->term_id, $foo_bar->parent );221 222 $post_count = wp_count_posts( 'post' );223 $this->assertEquals( 5, $post_count->publish );224 $this->assertEquals( 1, $post_count->private );225 $page_count = wp_count_posts( 'page' );226 $this->assertEquals( 4, $page_count->publish );227 $this->assertEquals( 1, $page_count->draft );228 $comment_count = wp_count_comments();229 $this->assertEquals( 1, $comment_count->total_comments );230 }231 232 function test_ordering_of_importers() {233 global $wp_importers;234 $_wp_importers = $wp_importers; // Preserve global state235 $wp_importers = array(236 'xyz1' => array( 'xyz1' ),237 'XYZ2' => array( 'XYZ2' ),238 'abc2' => array( 'abc2' ),239 'ABC1' => array( 'ABC1' ),240 'def1' => array( 'def1' ),241 );242 $this->assertEquals( array(243 'ABC1' => array( 'ABC1' ),244 'abc2' => array( 'abc2' ),245 'def1' => array( 'def1' ),246 'xyz1' => array( 'xyz1' ),247 'XYZ2' => array( 'XYZ2' ),248 ), get_importers() );249 $wp_importers = $_wp_importers; // Restore global state250 }251 252 // function test_menu_import253 36 }