函数文档

export_wp()

💡 云策文档标注

概述

export_wp() 函数用于生成 WordPress 导出文件(WXR 格式),支持按内容类型、作者、分类、日期等参数筛选导出内容。默认导出所有启用了 can_export 参数的文章类型,并自动跳过状态为 'auto-draft' 的文章。

关键要点

  • 函数生成 WXR 格式的 XML 文件,用于 WordPress 内容导出。
  • 支持参数包括 content(内容类型)、author(作者)、category(分类)、start_date(开始日期)、end_date(结束日期)和 status(文章状态)。
  • 导出内容受 can_export 参数限制,无效或未启用的自定义文章类型会回退到默认导出。
  • 包含多个辅助函数(如 wxr_cdata、wxr_site_url)用于处理 XML 输出和数据结构。
  • 提供多个 Hook(如 export_wp、export_wp_filename)允许开发者在导出过程中自定义行为。

代码示例

function export_wp( $args = array() ) {
    global $wpdb, $post;

    $defaults = array(
        'content'    => 'all',
        'author'     => false,
        'category'   => false,
        'start_date' => false,
        'end_date'   => false,
        'status'     => false,
    );
    $args = wp_parse_args( $args, $defaults );

    do_action( 'export_wp', $args );

    // 生成文件名和设置 HTTP 头
    $sitename = sanitize_key( get_bloginfo( 'name' ) );
    if ( ! empty( $sitename ) ) {
        $sitename .= '.';
    }
    $date = gmdate( 'Y-m-d' );
    $wp_filename = $sitename . 'WordPress.' . $date . '.xml';
    $filename = apply_filters( 'export_wp_filename', $wp_filename, $sitename, $date );

    header( 'Content-Description: File Transfer' );
    header( 'Content-Disposition: attachment; filename=' . $filename );
    header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true );

    // 构建查询条件
    if ( 'all' !== $args['content'] && post_type_exists( $args['content'] ) ) {
        $ptype = get_post_type_object( $args['content'] );
        if ( ! $ptype->can_export ) {
            $args['content'] = 'post';
        }
        $where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $args['content'] );
    } else {
        $post_types = get_post_types( array( 'can_export' => true ) );
        $esses = array_fill( 0, count( $post_types ), '%s' );
        $where = $wpdb->prepare( "{$wpdb->posts}.post_type IN (" . implode( ',', $esses ) . ')", $post_types );
    }

    if ( $args['status'] && ( 'post' === $args['content'] || 'page' === $args['content'] ) ) {
        $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_status = %s", $args['status'] );
    } else {
        $where .= " AND {$wpdb->posts}.post_status != 'auto-draft'";
    }

    // 更多查询逻辑和输出处理...
}

注意事项

  • 导出文件为 XML 格式,包含文章、页面、附件、分类、标签、自定义文章类型和元数据。
  • 使用 wpdb 类进行数据库查询,确保 SQL 注入防护。
  • 导出过程中会触发多个 Hook,允许开发者自定义文件名、跳过特定元数据等。
  • 函数内部处理了多站点环境和附件导出逻辑。

📄 原文内容

Generates the WXR export file for download.

Description

Default behavior is to export all content, however, note that post content will only be exported for post types with the can_export argument enabled. Any posts with the ‘auto-draft’ status will be skipped.

Parameters

$argsarrayoptional
Arguments for generating the WXR export file for download.

  • content string
    Type of content to export. If set, only the post content of this post type will be exported. Accepts 'all', 'post', 'page', 'attachment', or a defined custom post. If an invalid custom post type is supplied, every post type for which can_export is enabled will be exported instead. If a valid custom post type is supplied but can_export is disabled, then 'posts' will be exported instead. When 'all' is supplied, only post types with can_export enabled will be exported. Default 'all'.
  • author string
    Author to export content for. Only used when $content is 'post', 'page', or 'attachment'. Accepts false (all) or a specific author ID. Default false (all).
  • category string
    Category (slug) to export content for. Used only when $content is 'post'. If set, only post content assigned to $category will be exported. Accepts false or a specific category slug. Default is false (all categories).
  • start_date string
    Start date to export content from. Expected date format is 'Y-m-d'. Used only when $content is 'post', 'page' or 'attachment'. Default false (since the beginning of time).
  • end_date string
    End date to export content to. Expected date format is 'Y-m-d'. Used only when $content is 'post', 'page' or 'attachment'. Default false (latest publish date).
  • status string
    Post status to export posts for. Used only when $content is 'post' or 'page'.
    Accepts false (all statuses except 'auto-draft'), or a specific status, i.e.
    'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', or 'trash'. Default false (all statuses except 'auto-draft').

Default:array()

Source

function export_wp( $args = array() ) {
global $wpdb, $post;

$defaults = array(
'content' => 'all',
'author' => false,
'category' => false,
'start_date' => false,
'end_date' => false,
'status' => false,
);
$args = wp_parse_args( $args, $defaults );

/**
* Fires at the beginning of an export, before any headers are sent.
*
* @since 2.3.0
*
* @param array $args An array of export arguments.
*/
do_action( 'export_wp', $args );

$sitename = sanitize_key( get_bloginfo( 'name' ) );
if ( ! empty( $sitename ) ) {
$sitename .= '.';
}
$date = gmdate( 'Y-m-d' );
$wp_filename = $sitename . 'WordPress.' . $date . '.xml';
/**
* Filters the export filename.
*
* @since 4.4.0
*
* @param string $wp_filename The name of the file for download.
* @param string $sitename The site name.
* @param string $date Today's date, formatted.
*/
$filename = apply_filters( 'export_wp_filename', $wp_filename, $sitename, $date );

header( 'Content-Description: File Transfer' );
header( 'Content-Disposition: attachment; filename=' . $filename );
header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true );

if ( 'all' !== $args['content'] && post_type_exists( $args['content'] ) ) {
$ptype = get_post_type_object( $args['content'] );
if ( ! $ptype->can_export ) {
$args['content'] = 'post';
}

$where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $args['content'] );
} else {
$post_types = get_post_types( array( 'can_export' => true ) );
$esses = array_fill( 0, count( $post_types ), '%s' );

// phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
$where = $wpdb->prepare( "{$wpdb->posts}.post_type IN (" . implode( ',', $esses ) . ')', $post_types );
}

if ( $args['status'] && ( 'post' === $args['content'] || 'page' === $args['content'] ) ) {
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_status = %s", $args['status'] );
} else {
$where .= " AND {$wpdb->posts}.post_status != 'auto-draft'";
}

$join = '';
if ( $args['category'] && 'post' === $args['content'] ) {
$term = term_exists( $args['category'], 'category' );
if ( $term ) {
$join = "INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)";
$where .= $wpdb->prepare( " AND {$wpdb->term_relationships}.term_taxonomy_id = %d", $term['term_taxonomy_id'] );
}
}

if ( in_array( $args['content'], array( 'post', 'page', 'attachment' ), true ) ) {
if ( $args['author'] ) {
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_author = %d", $args['author'] );
}

if ( $args['start_date'] ) {
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date >= %s", gmdate( 'Y-m-d', strtotime( $args['start_date'] ) ) );
}

if ( $args['end_date'] ) {
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date < %s", gmdate( 'Y-m-d', strtotime( '+1 month', strtotime( $args['end_date'] ) ) ) );
}
}

// Grab a snapshot of post IDs, just in case it changes during the export.
$post_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} $join WHERE $where" );

// Get IDs for the attachments of each post, unless all content is already being exported.
if ( ! in_array( $args['content'], array( 'all', 'attachment' ), true ) ) {
// Array to hold all additional IDs (attachments and thumbnails).
$additional_ids = array();

// Create a copy of the post IDs array to avoid modifying the original array.
$processing_ids = $post_ids;

while ( $next_posts = array_splice( $processing_ids, 0, 20 ) ) {
$posts_in = array_map( 'absint', $next_posts );
$placeholders = array_fill( 0, count( $posts_in ), '%d' );

// Create a string for the placeholders.
$in_placeholder = implode( ',', $placeholders );

// Prepare the SQL statement for attachment ids.
$attachment_ids = $wpdb->get_col(
$wpdb->prepare(
"
SELECT ID
FROM $wpdb->posts
WHERE post_parent IN ($in_placeholder) AND post_type = 'attachment'
",
$posts_in
)
);

$thumbnails_ids = $wpdb->get_col(
$wpdb->prepare(
"
SELECT meta_value
FROM $wpdb->postmeta
WHERE $wpdb->postmeta.post_id IN ($in_placeholder)
AND $wpdb->postmeta.meta_key = '_thumbnail_id'
",
$posts_in
)
);

$additional_ids = array_merge( $additional_ids, $attachment_ids, $thumbnails_ids );
}

// Merge the additional IDs back with the original post IDs after processing all posts
$post_ids = array_unique( array_merge( $post_ids, $additional_ids ) );
}

/*
* Get the requested terms ready, empty unless posts filtered by category
* or all content.
*/
$cats = array();
$tags = array();
$terms = array();
if ( isset( $term ) && $term ) {
$cat = get_term( $term['term_id'], 'category' );
$cats = array( $cat->term_id => $cat );
unset( $term, $cat );
} elseif ( 'all' === $args['content'] ) {
$categories = (array) get_categories( array( 'get' => 'all' ) );
$tags = (array) get_tags( array( 'get' => 'all' ) );

$custom_taxonomies = get_taxonomies( array( '_builtin' => false ) );
$custom_terms = (array) get_terms(
array(
'taxonomy' => $custom_taxonomies,
'get' => 'all',
)
);

// Put categories in order with no child going before its parent.
while ( $cat = array_shift( $categories ) ) {
if ( ! $cat->parent || isset( $cats[ $cat->parent ] ) ) {
$cats[ $cat->term_id ] = $cat;
} else {
$categories[] = $cat;
}
}

// Put terms in order with no child going before its parent.
while ( $t = array_shift( $custom_terms ) ) {
if ( ! $t->parent || isset( $terms[ $t->parent ] ) ) {
$terms[ $t->term_id ] = $t;
} else {
$custom_terms[] = $t;
}
}

unset( $categories, $custom_taxonomies, $custom_terms );
}

/**
* Wraps given string in XML CDATA tag.
*
* @since 2.1.0
*
* @param string|null $str String to wrap in XML CDATA tag. May be null.
* @return string
*/
function wxr_cdata( $str ) {
$str = (string) $str;

if ( ! wp_is_valid_utf8( $str ) ) {
$str = utf8_encode( $str );
}
// $str = ent2ncr(esc_html($str));
$str = '', ']]]]>';

return $str;
}

/**
* Returns the URL of the site.
*
* @since 2.5.0
*
* @return string Site URL.
*/
function wxr_site_url() {
if ( is_multisite() ) {
// Multisite: the base URL.
return network_home_url();
} else {
// WordPress (single site): the site URL.
return get_bloginfo_rss( 'url' );
}
}

/**
* Outputs a cat_name XML tag from a given category object.
*
* @since 2.1.0
*
* @param WP_Term $category Category Object.
*/
function wxr_cat_name( $category ) {
if ( empty( $category->name ) ) {
return;
}

echo '<wp:cat_name>' . wxr_cdata( $category->name ) . "</wp:cat_name>n";
}

/**
* Outputs a category_description XML tag from a given category object.
*
* @since 2.1.0
*
* @param WP_Term $category Category Object.
*/
function wxr_category_description( $category ) {
if ( empty( $category->description ) ) {
return;
}

echo '<wp:category_description>' . wxr_cdata( $category->description ) . "</wp:category_description>n";
}

/**
* Outputs a tag_name XML tag from a given tag object.
*
* @since 2.3.0
*
* @param WP_Term $tag Tag Object.
*/
function wxr_tag_name( $tag ) {
if ( empty( $tag->name ) ) {
return;
}

echo '<wp:tag_name>' . wxr_cdata( $tag->name ) . "</wp:tag_name>n";
}

/**
* Outputs a tag_description XML tag from a given tag object.
*
* @since 2.3.0
*
* @param WP_Term $tag Tag Object.
*/
function wxr_tag_description( $tag ) {
if ( empty( $tag->description ) ) {
return;
}

echo '<wp:tag_description>' . wxr_cdata( $tag->description ) . "</wp:tag_description>n";
}

/**
* Outputs a term_name XML tag from a given term object.
*
* @since 2.9.0
*
* @param WP_Term $term Term Object.
*/
function wxr_term_name( $term ) {
if ( empty( $term->name ) ) {
return;
}

echo '<wp:term_name>' . wxr_cdata( $term->name ) . "</wp:term_name>n";
}

/**
* Outputs a term_description XML tag from a given term object.
*
* @since 2.9.0
*
* @param WP_Term $term Term Object.
*/
function wxr_term_description( $term ) {
if ( empty( $term->description ) ) {
return;
}

echo "tt<wp:term_description>" . wxr_cdata( $term->description ) . "</wp:term_description>n";
}

/**
* Outputs term meta XML tags for a given term object.
*
* @since 4.6.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param WP_Term $term Term object.
*/
function wxr_term_meta( $term ) {
global $wpdb;

$termmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->termmeta WHERE term_id = %d", $term->term_id ) );

foreach ( $termmeta as $meta ) {
/**
* Filters whether to selectively skip term meta used for WXR exports.
*
* Returning a truthy value from the filter will skip the current meta
* object from being exported.
*
* @since 4.6.0
*
* @param bool $skip Whether to skip the current piece of term meta. Default false.
* @param string $meta_key Current meta key.
* @param object $meta Current meta object.
*/
if ( ! apply_filters( 'wxr_export_skip_termmeta', false, $meta->meta_key, $meta ) ) {
printf( "tt<wp:termmeta>nttt<wp:meta_key>%s</wp:meta_key>nttt<wp:meta_value>%s</wp:meta_value>ntt</wp:termmeta>n", wxr_cdata( $meta->meta_key ), wxr_cdata( $meta->meta_value ) );
}
}
}

/**
* Outputs list of authors with posts.
*
* @since 3.1.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param int[] $post_ids Optional. Array of post IDs to filter the query by.
*/
function wxr_authors_list( ?array $post_ids = null ) {
global $wpdb;

if ( ! empty( $post_ids ) ) {
$post_ids = array_map( 'absint', $post_ids );
$post_id_chunks = array_chunk( $post_ids, 20 );
} else {
$post_id_chunks = array( array() );
}

$authors = array();

foreach ( $post_id_chunks as $next_posts ) {
$and = ! empty( $next_posts ) ? 'AND ID IN (' . implode( ', ', $next_posts ) . ')' : '';

$results = $wpdb->get_results( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_status != 'auto-draft' $and" );

foreach ( (array) $results as $result ) {
$authors[] = get_userdata( $result->post_author );
}
}

$authors = array_filter( $authors );
$authors = array_unique( $authors, SORT_REGULAR ); // Remove duplicate authors.

foreach ( $authors as $author ) {
echo "t<wp:author>";
echo '<wp:author_id>' . (int) $author->ID . '</wp:author_id>';
echo '<wp:author_login>' . wxr_cdata( $author->user_login ) . '</wp:author_login>';
echo '<wp:author_email>' . wxr_cdata( $author->user_email ) . '</wp:author_email>';
echo '<wp:author_display_name>' . wxr_cdata( $author->display_name ) . '</wp:author_display_name>';
echo '<wp:author_first_name>' . wxr_cdata( $author->first_name ) . '</wp:author_first_name>';
echo '<wp:author_last_name>' . wxr_cdata( $author->last_name ) . '</wp:author_last_name>';
echo "</wp:author>n";
}
}

/**
* Outputs all navigation menu terms.
*
* @since 3.1.0
*/
function wxr_nav_menu_terms() {
$nav_menus = wp_get_nav_menus();
if ( empty( $nav_menus ) || ! is_array( $nav_menus ) ) {
return;
}

foreach ( $nav_menus as $menu ) {
echo "t<wp:term>";
echo '<wp:term_id>' . (int) $menu->term_id . '</wp:term_id>';
echo '<wp:term_taxonomy>nav_menu</wp:term_taxonomy>';
echo '<wp:term_slug>' . wxr_cdata( $menu->slug ) . '</wp:term_slug>';
wxr_term_name( $menu );
echo "</wp:term>n";
}
}

/**
* Outputs list of taxonomy terms, in XML tag format, associated with a post.
*
* @since 2.3.0
*/
function wxr_post_taxonomy() {
$post = get_post();

$taxonomies = get_object_taxonomies( $post->post_type );
if ( empty( $taxonomies ) ) {
return;
}
$terms = wp_get_object_terms( $post->ID, $taxonomies );

foreach ( (array) $terms as $term ) {
echo "tt<category domain="{$term->taxonomy}" nicename="{$term->slug}">" . wxr_cdata( $term->name ) . "</category>n";
}
}

/**
* Determines whether to selectively skip post meta used for WXR exports.
*
* @since 3.3.0
*
* @param bool $return_me Whether to skip the current post meta. Default false.
* @param string $meta_key Meta key.
* @return bool
*/
function wxr_filter_postmeta( $return_me, $meta_key ) {
if ( '_edit_lock' === $meta_key ) {
$return_me = true;
}
return $return_me;
}
add_filter( 'wxr_export_skip_postmeta', 'wxr_filter_postmeta', 10, 2 );

echo 'n";

?>
<!-- This is a WordPress eXtended RSS file generated by WordPress as an export of your site. -->
<!-- It contains information about your site's posts, pages, comments, categories, and other content. -->
<!-- You may use this file to transfer that content from one site to another. -->
<!-- This file is not intended to serve as a complete backup of your site. -->

<!-- To import this information into a WordPress site follow these steps: -->
<!-- 1. Log in to that site as an administrator. -->
<!-- 2. Go to Tools: Import in the WordPress admin panel. -->
<!-- 3. Install the "WordPress" importer from the list. -->
<!-- 4. Activate & Run Importer. -->
<!-- 5. Upload this file using the form provided on that page. -->
<!-- 6. You will first be asked to map the authors in this export file to users -->
<!-- on the site. For each author, you may choose to map to an -->
<!-- existing user on the site or to create a new user. -->
<!-- 7. WordPress will then import each of the posts, pages, comments, categories, etc. -->
<!-- contained in this file into your site. -->

<rss version="2.0"
xmlns:excerpt="https://wordpress.org/export/<?php echo WXR_VERSION; ?>/excerpt/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:wp="https://wordpress.org/export/<?php echo WXR_VERSION; ?>/"
>

<channel>
<title></title>
<link></link>
<description></description>
<pubDate></pubdate>
<language></language>
<wp:wxr_version></wp:wxr_version>
<wp:base_site_url></wp:base_site_url>
<wp:base_blog_url></wp:base_blog_url>

<wp:category>
<wp:term_id>term_id; ?></wp:term_id>
<wp:category_nicename>slug ); ?></wp:category_nicename>
<wp:category_parent>parent ? $cats[ $c->parent ]->slug : '' ); ?></wp:category_parent>

</wp:category>

<wp:tag>
<wp:term_id>term_id; ?></wp:term_id>
<wp:tag_slug>slug ); ?></wp:tag_slug>

</wp:tag>

<wp:term>
<wp:term_id>term_id; ?></wp:term_id>
<wp:term_taxonomy>taxonomy ); ?></wp:term_taxonomy>
<wp:term_slug>slug ); ?></wp:term_slug>
<wp:term_parent>parent ? $terms[ $t->parent ]->slug : '' ); ?></wp:term_parent>

</wp:term>

in_the_loop = true;

// Fetch 20 posts at a time rather than loading the entire table into memory.
while ( $next_posts = array_splice( $post_ids, 0, 20 ) ) {
$where = 'WHERE ID IN (' . implode( ',', $next_posts ) . ')';
$posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" );

// Begin Loop.
foreach ( $posts as $post ) {
setup_postdata( $post );

/**
* Filters the post title used for WXR exports.
*
* @since 5.7.0
*
* @param string $post_title Title of the current post.
*/
$title = wxr_cdata( apply_filters( 'the_title_export', $post->post_title ) );

/**
* Filters the post content used for WXR exports.
*
* @since 2.5.0
*
* @param string $post_content Content of the current post.
*/
$content = wxr_cdata( apply_filters( 'the_content_export', $post->post_content ) );

/**
* Filters the post excerpt used for WXR exports.
*
* @since 2.6.0
*
* @param string $post_excerpt Excerpt for the current post.
*/
$excerpt = wxr_cdata( apply_filters( 'the_excerpt_export', $post->post_excerpt ) );

$is_sticky = is_sticky( $post->ID ) ? 1 : 0;
?>
<item>
<title></title>
<link></link>
<pubDate></pubdate>
<dc:creator></dc:creator>
<guid isPermaLink="false"></guid>
<description></description>
<content:encoded></content:encoded>
<excerpt:encoded></excerpt:encoded>
<wp:post_id>ID; ?></wp:post_id>
<wp:post_date>post_date ); ?></wp:post_date>
<wp:post_date_gmt>post_date_gmt ); ?></wp:post_date_gmt>
<wp:post_modified>post_modified ); ?></wp:post_modified>
<wp:post_modified_gmt>post_modified_gmt ); ?></wp:post_modified_gmt>
<wp:comment_status>comment_status ); ?></wp:comment_status>
<wp:ping_status>ping_status ); ?></wp:ping_status>
<wp:post_name>post_name ); ?></wp:post_name>
<wp:status>post_status ); ?></wp:status>
<wp:post_parent>post_parent; ?></wp:post_parent>
<wp:menu_order>menu_order; ?></wp:menu_order>
<wp:post_type>post_type ); ?></wp:post_type>
<wp:post_password>post_password ); ?></wp:post_password>
<wp:is_sticky></wp:is_sticky>
post_type ) : ?>
<wp:attachment_url>ID ) ); ?></wp:attachment_url>

get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID ) );
foreach ( $postmeta as $meta ) :
/**
* Filters whether to selectively skip post meta used for WXR exports.
*
* Returning a truthy value from the filter will skip the current meta
* object from being exported.
*
* @since 3.3.0
*
* @param bool $skip Whether to skip the current post meta. Default false.
* @param string $meta_key Current meta key.
* @param object $meta Current meta object.
*/
if ( apply_filters( 'wxr_export_skip_postmeta', false, $meta->meta_key, $meta ) ) {
continue;
}
?>
<wp:postmeta>
<wp:meta_key>meta_key ); ?></wp:meta_key>
<wp:meta_value>meta_value ); ?></wp:meta_value>
</wp:postmeta>
get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved <> 'spam'", $post->ID ) );
$comments = array_map( 'get_comment', $_comments );
foreach ( $comments as $c ) :
?>
<wp:comment>
<wp:comment_id>comment_ID; ?></wp:comment_id>
<wp:comment_author>comment_author ); ?></wp:comment_author>
<wp:comment_author_email>comment_author_email ); ?></wp:comment_author_email>
<wp:comment_author_url>comment_author_url ); ?></wp:comment_author_url>
<wp:comment_author_IP>comment_author_IP ); ?></wp:comment_author_ip>
<wp:comment_date>comment_date ); ?></wp:comment_date>
<wp:comment_date_gmt>comment_date_gmt ); ?></wp:comment_date_gmt>
<wp:comment_content>comment_content ); ?></wp:comment_content>
<wp:comment_approved>comment_approved ); ?></wp:comment_approved>
<wp:comment_type>comment_type ); ?></wp:comment_type>
<wp:comment_parent>comment_parent; ?></wp:comment_parent>
<wp:comment_user_id>user_id; ?></wp:comment_user_id>
get_results( $wpdb->prepare( "SELECT * FROM $wpdb->commentmeta WHERE comment_id = %d", $c->comment_ID ) );
foreach ( $c_meta as $meta ) :
/**
* Filters whether to selectively skip comment meta used for WXR exports.
*
* Returning a truthy value from the filter will skip the current meta
* object from being exported.
*
* @since 4.0.0
*
* @param bool $skip Whether to skip the current comment meta. Default false.
* @param string $meta_key Current meta key.
* @param object $meta Current meta object.
*/
if ( apply_filters( 'wxr_export_skip_commentmeta', false, $meta->meta_key, $meta ) ) {
continue;
}
?>
<wp:commentmeta>
<wp:meta_key>meta_key ); ?></wp:meta_key>
<wp:meta_value>meta_value ); ?></wp:meta_value>
</wp:commentmeta>

</wp:comment>

</item>

</channel>
</rss>
</pre><p class="wporg-dot-link-list"><a href="https://developer.wordpress.org/reference/files/wp-admin/includes/export.php/">View all references</a> <a href="https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-admin/includes/export.php#L57">View on Trac</a> <a href="https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-admin/includes/export.php#L57-L741">View on GitHub</a></p></section>
<section class="wp-block-wporg-code-reference-hooks"><h2 id="hooks" class="is-toc-heading wp-block-heading has-heading-5-font-size" tabindex="-1" ><a href="#hooks">Hooks</a></h2> <dl><dt class="wp-block-wporg-code-reference-title has-normal-font-size"><a href="https://developer.wordpress.org/reference/hooks/export_wp/"><span class="hook-func">do_action</span>( ‘export_wp’, <nobr><span class="arg-type">array</span> <span class="arg-name">$args</span></nobr> )</a></dt><dd><p>Fires at the beginning of an export, before any headers are sent.</p>
</dd><dt class="wp-block-wporg-code-reference-title has-normal-font-size"><a href="https://developer.wordpress.org/reference/hooks/export_wp_filename/"><span class="hook-func">apply_filters</span>( ‘export_wp_filename’, <nobr><span class="arg-type">string</span> <span class="arg-name">$wp_filename</span></nobr>, <nobr><span class="arg-type">string</span> <span class="arg-name">$sitename</span></nobr>, <nobr><span class="arg-type">string</span> <span class="arg-name">$date</span></nobr> )</a></dt><dd><p>Filters the export filename.</p>
</dd><dt class="wp-block-wporg-code-reference-title has-normal-font-size"><a href="https://developer.wordpress.org/reference/hooks/rss2_head/"><span class="hook-func">do_action</span>( ‘rss2_head’ )</a></dt><dd><p>Fires at the end of the RSS2 Feed Header.</p>
</dd><dt class="wp-block-wporg-code-reference-title has-normal-font-size"><a href="https://developer.wordpress.org/reference/hooks/the_content_export/"><span class="hook-func">apply_filters</span>( ‘the_content_export’, <nobr><span class="arg-type">string</span> <span class="arg-name">$post_content</span></nobr> )</a></dt><dd><p>Filters the post content used for WXR exports.</p>
</dd><dt class="wp-block-wporg-code-reference-title has-normal-font-size"><a href="https://developer.wordpress.org/reference/hooks/the_excerpt_export/"><span class="hook-func">apply_filters</span>( ‘the_excerpt_export’, <nobr><span class="arg-type">string</span> <span class="arg-name">$post_excerpt</span></nobr> )</a></dt><dd><p>Filters the post excerpt used for WXR exports.</p>
</dd><dt class="wp-block-wporg-code-reference-title has-normal-font-size"><a href="https://developer.wordpress.org/reference/hooks/the_title_export/"><span class="hook-func">apply_filters</span>( ‘the_title_export’, <nobr><span class="arg-type">string</span> <span class="arg-name">$post_title</span></nobr> )</a></dt><dd><p>Filters the post title used for WXR exports.</p>
</dd><dt class="wp-block-wporg-code-reference-title has-normal-font-size"><a href="https://developer.wordpress.org/reference/hooks/wxr_export_skip_commentmeta/"><span class="hook-func">apply_filters</span>( ‘wxr_export_skip_commentmeta’, <nobr><span class="arg-type">bool</span> <span class="arg-name">$skip</span></nobr>, <nobr><span class="arg-type">string</span> <span class="arg-name">$meta_key</span></nobr>, <nobr><span class="arg-type">object</span> <span class="arg-name">$meta</span></nobr> )</a></dt><dd><p>Filters whether to selectively skip comment meta used for WXR exports.</p>
</dd><dt class="wp-block-wporg-code-reference-title has-normal-font-size"><a href="https://developer.wordpress.org/reference/hooks/wxr_export_skip_postmeta/"><span class="hook-func">apply_filters</span>( ‘wxr_export_skip_postmeta’, <nobr><span class="arg-type">bool</span> <span class="arg-name">$skip</span></nobr>, <nobr><span class="arg-type">string</span> <span class="arg-name">$meta_key</span></nobr>, <nobr><span class="arg-type">object</span> <span class="arg-name">$meta</span></nobr> )</a></dt><dd><p>Filters whether to selectively skip post meta used for WXR exports.</p>
</dd></dl></section>
<section class="wp-block-wporg-code-reference-related" data-nosnippet="true"><h2 id="related" class="is-toc-heading wp-block-heading has-heading-5-font-size" tabindex="-1" ><a href="#related">Related</a></h2> <section style="margin-top:var(--wp--preset--spacing--20)" class="wp-block-wporg-code-table" id="uses"><figure class="wp-block-table "><table><thead><tr><th scope="col">Uses</th><th scope="col">Description</th></tr></thead><tbody><tr class=""><td><a href="https://developer.wordpress.org/reference/functions/wxr_term_meta/">wxr_term_meta()</a><code>wp-admin/includes/export.php

Outputs term meta XML tags for a given term object.

wxr_post_taxonomy()wp-admin/includes/export.php

Outputs list of taxonomy terms, in XML tag format, associated with a post.

wxr_site_url()wp-admin/includes/export.php

Returns the URL of the site.

wxr_authors_list()wp-admin/includes/export.php

Outputs list of authors with posts.

wxr_cdata()wp-admin/includes/export.php

Wraps given string in XML CDATA tag.

wxr_cat_name()wp-admin/includes/export.php

Outputs a cat_name XML tag from a given category object.

wxr_category_description()wp-admin/includes/export.php

Outputs a category_description XML tag from a given category object.

wxr_tag_name()wp-admin/includes/export.php

Outputs a tag_name XML tag from a given tag object.

wxr_tag_description()wp-admin/includes/export.php

Outputs a tag_description XML tag from a given tag object.

wxr_term_name()wp-admin/includes/export.php

Outputs a term_name XML tag from a given term object.

wxr_term_description()wp-admin/includes/export.php

Outputs a term_description XML tag from a given term object.

wxr_nav_menu_terms()wp-admin/includes/export.php

Outputs all navigation menu terms.

the_generator()wp-includes/general-template.php

Displays the generator XML or Comment for RSS, ATOM, etc.

get_post_time()wp-includes/general-template.php

Retrieves the localized time of the post.

setup_postdata()wp-includes/query.php

Set up global post data.

get_tags()wp-includes/category.php

Retrieves all post tags.

get_categories()wp-includes/category.php

Retrieves a list of category objects.

mysql2date()wp-includes/functions.php

Converts given MySQL date string into a different format.

term_exists()wp-includes/taxonomy.php

Determines whether a taxonomy term exists.

get_terms()wp-includes/taxonomy.php

Retrieves the terms in a given taxonomy or list of taxonomies.

get_taxonomies()wp-includes/taxonomy.php

Retrieves a list of registered taxonomy names or objects.

the_permalink_rss()wp-includes/feed.php

Displays the permalink to the post for use in feeds.

bloginfo_rss()wp-includes/feed.php

Displays RSS container for the bloginfo function.

the_guid()wp-includes/post-template.php

Displays the Post Global Unique Identifier (guid).

wp_get_attachment_url()wp-includes/post.php

Retrieves the URL for an attachment.

is_sticky()wp-includes/post.php

Determines whether a post is sticky.

post_type_exists()wp-includes/post.php

Determines whether a post type is registered.

get_the_author_meta()wp-includes/author-template.php

Retrieves the requested data of the author of the current post.

wpdb::get_col()wp-includes/class-wpdb.php

Retrieves one column from the database.

sanitize_key()wp-includes/formatting.php

Sanitizes a string key.

get_bloginfo()wp-includes/general-template.php

Retrieves information about the current site.

sanitize_url()wp-includes/formatting.php

Sanitizes a URL for database or redirect usage.

wp_parse_args()wp-includes/functions.php

Merges user defined arguments into defaults array.

get_term()wp-includes/taxonomy.php

Gets all term data from database by term ID.

do_action()wp-includes/plugin.php

Calls the callback functions that have been added to an action hook.

apply_filters()wp-includes/plugin.php

Calls the callback functions that have been added to a filter hook.

add_filter()wp-includes/plugin.php

Adds a callback function to a filter hook.

get_option()wp-includes/option.php

Retrieves an option value based on an option name.

get_post_type_object()wp-includes/post.php

Retrieves a post type object by name.

get_post_types()wp-includes/post.php

Gets a list of all registered post type objects.

wpdb::get_results()wp-includes/class-wpdb.php

Retrieves an entire SQL result set from the database (i.e., many rows).

wpdb::prepare()wp-includes/class-wpdb.php

Prepares a SQL query for safe execution.

Show 37 moreShow less

Changelog

Version Description
5.7.0 Added the post_modified and post_modified_gmt fields to the export file.
2.1.0 Introduced.