WordPress.org

Make WordPress Core

Ticket #33563: wordpress-develop.33563.2.diff

File wordpress-develop.33563.2.diff, 45.9 KB (added by screamingdev, 3 years ago)

Swap wxr_* functions and for testing comments_open needed to be fixed in case of wrong post ID's

  • src/wp-admin/includes/export.php

     
    77 */
    88
    99/**
    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 /**
    1910 * Generates the WXR export file for download.
    2011 *
    2112 * @since 2.1.0
     
    137128                unset( $categories, $custom_taxonomies, $custom_terms );
    138129        }
    139130
    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';
    154132
    155                 return $str;
    156         }
    157 
    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         }
    173 
    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;
    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 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;
    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 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;
    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 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";
    228         }
    229 
    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;
    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 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;
    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.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                 }
    287         }
    288 
    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         }
    376133        add_filter( 'wxr_export_skip_postmeta', 'wxr_filter_postmeta', 10, 2 );
    377134
    378135        echo '<?xml version="1.0" encoding="' . get_bloginfo('charset') . "\" ?>\n";
  • src/wp-admin/includes/wxr.php

     
    11<?php
    22/**
    3  * WordPress Export Administration API
     3 * WordPress Export Helper
    44 *
    55 * @package WordPress
    66 * @subpackage Administration
     
    1616define( 'WXR_VERSION', '1.2' );
    1717
    1818/**
    19  * Generates the WXR export file for download.
     19 * Wrap given string in XML CDATA tag.
    2020 *
    2121 * @since 2.1.0
    2222 *
    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
    2725 */
    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 .= '.';
     26function wxr_cdata( $str ) {
     27        if ( ! seems_utf8( $str ) ) {
     28                $str = utf8_encode( $str );
    4829        }
    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 ) . ']]>';
    6132
    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}
    6535
    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 */
     43function wxr_site_url() {
     44        // Multisite: the base URL.
     45        if ( is_multisite() )
     46                return network_home_url();
     47        // WordPress (single site): the blog URL.
    8048        else
    81                 $where .= " AND {$wpdb->posts}.post_status != 'auto-draft'";
     49                return get_bloginfo_rss( 'url' );
     50}
    8251
    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 */
     59function wxr_cat_name( $category ) {
     60        if ( empty( $category->name ) )
     61                return;
    9062
    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}
    9465
    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 */
     73function wxr_category_description( $category ) {
     74        if ( empty( $category->description ) )
     75                return;
    9776
    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}
    10179
    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 */
     87function wxr_tag_name( $tag ) {
     88        if ( empty( $tag->name ) )
     89                return;
    10490
    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}
    11793
    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 */
     101function wxr_tag_description( $tag ) {
     102        if ( empty( $tag->description ) )
     103                return;
    120104
    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}
    128107
    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 */
     115function wxr_term_name( $term ) {
     116        if ( empty( $term->name ) )
     117                return;
    136118
    137                 unset( $categories, $custom_taxonomies, $custom_terms );
    138         }
     119        echo '<wp:term_name>' . wxr_cdata( $term->name ) . "</wp:term_name>\n";
     120}
    139121
    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 */
     129function wxr_term_description( $term ) {
     130        if ( empty( $term->description ) )
     131                return;
    154132
    155                 return $str;
    156         }
     133        echo "\t\t<wp:term_description>" . wxr_cdata( $term->description ) . "</wp:term_description>\n";
     134}
    157135
    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 */
     143function wxr_term_meta( $term ) {
     144        global $wpdb;
    173145
    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 ) );
    184147
    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                }
    186164        }
     165}
    187166
    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 */
     176function wxr_authors_list( array $post_ids = null ) {
     177        global $wpdb;
    198178
    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 = '';
    200184        }
    201185
    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 );
    212190
    213                 echo '<wp:tag_name>' . wxr_cdata( $tag->name ) . "</wp:tag_name>\n";
    214         }
     191        $authors = array_filter( $authors );
    215192
    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";
    228202        }
     203}
    229204
    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 */
     210function wxr_nav_menu_terms() {
     211        $nav_menus = wp_get_nav_menus();
     212        if ( empty( $nav_menus ) || ! is_array( $nav_menus ) )
     213                return;
    240214
    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";
    242222        }
     223}
    243224
    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 */
     230function wxr_post_taxonomy() {
     231        $post = get_post();
    254232
    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 );
    257237
    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";
    287240        }
     241}
    288242
    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 */
     249function 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

     
    11681168 */
    11691169function comments_open( $post_id = null ) {
    11701170
    1171         $_post = get_post($post_id);
     1171        $_post = get_post( $post_id );
    11721172
    1173         $open = ( 'open' == $_post->comment_status );
     1173        $open = $_post && isset( $_post->comment_status ) && ( 'open' == $_post->comment_status );
    11741174
    11751175        /**
    11761176         * Filters whether the current post is open for comments.
  • tests/phpunit/tests/export/export-wp.php

     
    11<?php
    22
    3 require_once dirname( __FILE__ ) . '/base.php';
    4 
    53/**
    64 * @group import
    75 */
    8 class Tests_Import_Import extends WP_Import_UnitTestCase {
    9         function setUp() {
     6class Tests_Export_Export_Wp extends WP_UnitTestCase {
     7        function setUp()
     8        {
    109                parent::setUp();
    1110
    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';
    3012        }
    3113
    32         function tearDown() {
    33                 remove_filter( 'import_allow_create_users', '__return_true' );
    3414
    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() {
    3726
    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());
    19335        }
    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 state
    235                 $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 state
    250         }
    251 
    252         // function test_menu_import
    25336}