Skip to content

Instantly share code, notes, and snippets.

@panks
Last active December 16, 2015 21:49
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save panks/5502750 to your computer and use it in GitHub Desktop.
Save panks/5502750 to your computer and use it in GitHub Desktop.
New /wp-admin/includes/export.php for WordPress which generates JSON output.
<?php
/**
* WordPress Export Administration API
*
* @package WordPress
* @subpackage Administration
*/
/**
* Version number for the export format.
*
* Bump this when something changes that might affect compatibility.
*
* @since 2.5.0
*/
define( 'WXR_VERSION', '1.2' );
/**
* Generates the WXR export file for download
*
* @since 2.1.0
*
* @param array $args Filters defining what should be included in the export
*/
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' );
$sitename = sanitize_key( get_bloginfo( 'name' ) );
if ( ! empty($sitename) ) $sitename .= '.';
$filename = $sitename . 'wordpress.' . date( 'Y-m-d' ) . '.json';
header( 'Content-Description: File Transfer' );
header( 'Content-Disposition: attachment; filename=' . $filename );
header( 'Content-Type: application/json; 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'";
$join = '';
if ( $args['category'] && 'post' == $args['content'] ) {
if ( $term = term_exists( $args['category'], 'category' ) ) {
$join = "INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)";
$where .= $wpdb->prepare( " AND {$wpdb->term_relationships}.term_taxonomy_id = %d", $term['term_taxonomy_id'] );
}
}
if ( 'post' == $args['content'] || 'page' == $args['content'] ) {
if ( $args['author'] )
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_author = %d", $args['author'] );
if ( $args['start_date'] )
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date >= %s", date( 'Y-m-d', strtotime($args['start_date']) ) );
if ( $args['end_date'] )
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date < %s", date( 'Y-m-d', strtotime('+1 month', strtotime($args['end_date'])) ) );
}
// grab a snapshot of post IDs, just in case it changes during the export
$post_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} $join WHERE $where" );
// get the requested terms ready, empty unless posts filtered by category or all content
$cats = $tags = $terms = array();
if ( isset( $term ) && $term ) {
$cat = get_term( $term['term_id'], 'category' );
$cats = array( $cat->term_id => $cat );
unset( $term, $cat );
} else if ( '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( $custom_taxonomies, array( 'get' => 'all' ) );
// put categories in order with no child going before its parent
while ( $cat = array_shift( $categories ) ) {
if ( $cat->parent == 0 || isset( $cats[$cat->parent] ) )
$cats[$cat->term_id] = $cat;
else
$categories[] = $cat;
}
// put terms in order with no child going before its parent
while ( $t = array_shift( $custom_terms ) ) {
if ( $t->parent == 0 || isset( $terms[$t->parent] ) )
$terms[$t->term_id] = $t;
else
$custom_terms[] = $t;
}
unset( $categories, $custom_taxonomies, $custom_terms );
}
/**
* Return the URL of the site
*
* @since 2.5.0
*
* @return string Site URL.
*/
function wxr_site_url() {
// ms: the base url
if ( is_multisite() )
return network_home_url();
// wp: the blog url
else
return get_bloginfo_rss( 'url' );
}
/**
* Output a cat_name JSON from a given category object
*
* @since 2.1.0
*
* @param object $category Category Object
*/
function wxr_cat_name( $category ) {
if ( empty( $category->name ) )
return;
// echo '<wp:cat_name>' . wxr_cdata( $category->name ) . '</wp:cat_name>';
echo ",\n\"wp:cat_name\": \"" . $category->name . "\"";
}
/**
* Output a category_description JSON from a given category object
*
* @since 2.1.0
*
* @param object $category Category Object
*/
function wxr_category_description( $category ) {
if ( empty( $category->description ) )
return;
echo ",\n\"wp:category_description\": \"" . $category->description . "\"";
}
/**
* Output a tag_name JSON from a given tag object
*
* @since 2.3.0
*
* @param object $tag Tag Object
*/
function wxr_tag_name( $tag ) {
if ( empty( $tag->name ) )
return;
echo ",\n\"wp:tag_name\": \"" . $tag->name . "\"";
}
/**
* Output a tag_description JSON from a given tag object
*
* @since 2.3.0
*
* @param object $tag Tag Object
*/
function wxr_tag_description( $tag ) {
if ( empty( $tag->description ) )
return;
echo ',\n"wp:tag_description": "' . $tag->description . '"';
}
/**
* Output a term_name JSON from a given term object
*
* @since 2.9.0
*
* @param object $term Term Object
*/
function wxr_term_name( $term ) {
if ( empty( $term->name ) )
return;
echo '"wp:term_name": "' . $term->name . '"';
}
/**
* Output a term_description JSON from a given term object
*
* @since 2.9.0
*
* @param object $term Term Object
*/
function wxr_term_description( $term ) {
if ( empty( $term->description ) )
return;
echo '"wp:term_description": "' . $term->description . '"';
}
/**
* Output list of authors with posts
*
* @since 3.1.0
*/
function wxr_authors_list() {
global $wpdb;
$bs = "\x08";
$authors = array();
$results = $wpdb->get_results( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_status != 'auto-draft'" );
foreach ( (array) $results as $result )
$authors[] = get_userdata( $result->post_author );
$authors = array_filter( $authors );
echo "\"wp:author\": [\n";
foreach ( $authors as $author ) {
echo "{\n";
echo "\t\"wp:author_id\": \"" . $author->ID . "\",\n";
echo "\t\"wp:author_login\": \"" . $author->user_login . "\",\n";
echo "\t\"wp:author_email\": \"" . $author->user_email . "\",\n";
echo "\t\"wp:author_display_name\": \"" . $author->display_name . "\",\n";
echo "\t\"wp:author_first_name\": \"" . $author->user_firstname . "\",\n";
echo "\t\"wp:author_last_name\": \"" . $author->user_lastname . "\"\n";
if ($author == end($authors))
echo "}\n";
else
echo "},\n";
}
echo "],\n";
}
/**
* Ouput 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;
echo "\"wp:term\": [";
foreach ( $nav_menus as $menu ) {
echo "{\n\t\"wp:term_id\": \"{$menu->term_id}\",\n\t\"wp:term_taxonomy\": \"nav_menu\",\n\t\"wp:term_slug\": \"{$menu->slug}\"},\n";
wxr_term_name( $menu );
echo ",\n";
}
echo "]\n";
}
/**
* Output list of taxonomy terms, in JSON 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 );
echo "\"category\": [\n";
foreach ( (array) $terms as $term ) {
// echo "\t\t<category domain=\"{$term->taxonomy}\" nicename=\"{$term->slug}\">" . wxr_cdata( $term->name ) . "</category>\n";
echo "{\n\t\"-domain\": \"{$term->taxonomy}\",\n\t\"-nicename\": \"{$term->slug}\",\n\t\"-#cdata-section\": \"{$term->name}\"\n";
if ($term == end($terms))
echo "}\n";
else
echo "},\n";
}
echo "],\n";
}
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";?>
"channel": {
"title": "<?php bloginfo_rss( 'name' ); ?>",
"link": "<?php bloginfo_rss( 'url' ); ?>",
"description": "<?php bloginfo_rss( 'description' ); ?>",
"pubDate": "<?php echo date( 'D, d M Y H:i:s +0000' ); ?>",
"language": "<?php bloginfo_rss( 'language' ); ?>",
"wp:wxr_version": "<?php echo WXR_VERSION; ?>",
"wp:base_site_url": "<?php echo wxr_site_url(); ?>",
"wp:base_blog_url": "<?php bloginfo_rss( 'url' ); ?>",
<?php wxr_authors_list(); ?>
"wp:category": [
<?php foreach ( $cats as $c ) : ?>
{
"wp:term_id": "<?php echo $c->term_id ?>",
"wp:category_nicename": "<?php echo $c->slug; ?>",
"wp:category_parent": "<?php echo $c->parent ? $cats[$c->parent]->slug : ''; ?>"<?php wxr_cat_name( $c ); ?><?php wxr_category_description( $c ); ?>
<?php
if ($c == end($cats))
echo "\n}\n";
else
echo "\n},\n";
?>
<?php endforeach; ?>
],
"wp:tag": [
<?php foreach ( $tags as $t ) : ?>
{
"wp:term_id": "<?php echo $t->term_id ?>",
"wp:tag_slug": "<?php echo $t->slug; ?>"<?php wxr_tag_name( $t ); ?><?php wxr_tag_description( $t ); ?>
<?php
if ($t == end($tags))
echo "\n}\n";
else
echo "\n},\n";
?>
<?php endforeach; ?>
],
"wp:term": [
<?php foreach ( $terms as $t ) : ?>
{
"wp:term_id": "<?php echo $t->term_id ?>",
"wp:term_taxonomy": "<?php echo $t->taxonomy; ?>",
"wp:term_slug": "<?php echo $t->slug; ?>",
"wp:term_parent": "<?php echo $t->parent ? $terms[$t->parent]->slug : ''; ?>",
<?php wxr_term_name( $t ); ?>,
<?php wxr_term_description( $t ); ?>
<?php endforeach; ?>
],
<?php if ( 'all' == $args['content'] ) wxr_nav_menu_terms(); ?>
<?php// do_action( 'rss2_head' ); ?>
<?php if ( $post_ids ) {
global $wp_query;
$wp_query->in_the_loop = true; // Fake being in the loop.
?>
"item": [
<?php
// fetch 20 posts at a time rather than loading the entire table into memory
while ( $next_posts = array_splice( $post_ids, 0, 20 ) ) {
$where = 'WHERE ID IN (' . join( ',', $next_posts ) . ')';
$posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" );
// Begin Loop
foreach ( $posts as $post ) {
setup_postdata( $post );
$is_sticky = is_sticky( $post->ID ) ? 1 : 0;
?>
{
"title": <?php echo json_encode(apply_filters( 'the_title_rss', $post->post_title )); ?>,
"link": "<?php the_permalink_rss() ?>",
"pubDate": "<?php echo mysql2date( 'D, d M Y H:i:s +0000', get_post_time( 'Y-m-d H:i:s', true ), false ); ?>",
"dc:creator": "<?php echo get_the_author_meta( 'login' ); ?>",
"guid": "<?php the_guid(); ?>",
"content:encoded": <?php echo json_encode(apply_filters( 'the_content_export', $post->post_content )); ?>,
"excerpt:encoded": <?php echo json_encode(apply_filters( 'the_excerpt_export', $post->post_excerpt )); ?>,
"wp:post_id": "<?php echo $post->ID; ?>",
"wp:post_date": "<?php echo $post->post_date; ?>",
"wp:post_date_gmt": "<?php echo $post->post_date_gmt; ?>",
"wp:comment_status": "<?php echo $post->comment_status; ?>",
"wp:ping_status": "<?php echo $post->ping_status; ?>",
"wp:post_name": "<?php echo $post->post_name; ?>",
"wp:status": "<?php echo $post->post_status; ?>",
"wp:post_parent": "<?php echo $post->post_parent; ?>",
"wp:menu_order": "<?php echo $post->menu_order; ?>",
"wp:post_type": "<?php echo $post->post_type; ?>",
"wp:post_password": "<?php echo $post->post_password; ?>",
"wp:is_sticky": "<?php echo $is_sticky; ?>",
<?php if ( $post->post_type == 'attachment' ) : ?>
"wp:attachment_url": "<?php echo wp_get_attachment_url( $post->ID ); ?>",
<?php endif; ?>
<?php wxr_post_taxonomy(); ?>
<?php $postmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID ) );
$flag = true;
echo "\"wp:postmeta\": [";
foreach ( $postmeta as $meta ) :
if ( apply_filters( 'wxr_export_skip_postmeta', false, $meta->meta_key, $meta ) )
continue;
if($flag==true){
$flag = false;
echo "\n{\n";
}else{
echo ",\n{\n";
}
?>
"wp:meta_key": "<?php echo $meta->meta_key; ?>",
"wp:meta_value": <?php echo json_encode($meta->meta_value); ?>
}<?php endforeach; ?>
],
"wp:comment" : [
<?php $comments = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved <> 'spam'", $post->ID ) );
foreach ( $comments as $c ) : ?>
{
"wp:comment_id": "<?php echo $c->comment_ID; ?>",
"wp:comment_author": "<?php echo $c->comment_author; ?>",
"wp:comment_author_email": "<?php echo $c->comment_author_email; ?>",
"wp:comment_author_url": "<?php echo esc_url_raw( $c->comment_author_url ); ?>",
"wp:comment_author_IP": "<?php echo $c->comment_author_IP; ?>",
"wp:comment_date": "<?php echo $c->comment_date; ?>",
"wp:comment_date_gmt": "<?php echo $c->comment_date_gmt; ?>",
"wp:comment_content": <?php echo json_encode($c->comment_content); ?>,
"wp:comment_approved": "<?php echo $c->comment_approved; ?>",
"wp:comment_type": "<?php echo $c->comment_type; ?>",
"wp:comment_parent": "<?php echo $c->comment_parent; ?>",
"wp:comment_user_id": "<?php echo $c->user_id; ?>",
"wp:commentmeta": [
<?php $c_meta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->commentmeta WHERE comment_id = %d", $c->comment_ID ) );
foreach ( $c_meta as $meta ) : ?>
{
"wp:meta_key": "<?php echo $meta->meta_key; ?>",
"wp:meta_value": "<?php echo json_encode($meta->meta_value); ?>"
},
<?php endforeach; ?>
]
<?php
if ($c == end($comments))
echo "\n}\n";
else
echo "\n},\n";
?>
<?php endforeach; ?>
]
<?php
if ($post == end($posts))
echo "\n}\n";
else
echo "\n},\n";
?>
<?php
}
}
} ?>
]
}
}
<?php
}
@da1nonly
Copy link

da1nonly commented Aug 9, 2013

hi just wondering is the json import feature done,

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment