Skip to content

Instantly share code, notes, and snippets.

@barooney
Created April 26, 2018 18:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save barooney/d7decd263db6e1eff61552999ac28bca to your computer and use it in GitHub Desktop.
Save barooney/d7decd263db6e1eff61552999ac28bca to your computer and use it in GitHub Desktop.
Import Ghost exports to WordPress

Place the Ghost export as ghost.json and the ghost-import.php into the base folder of WordPress - next to the wp-load.php.

Then, either run the script from the command line (suggested if you're going to import a large dataset), otherwise point your browser to http://your-wordpress-url/ghost-import.php. After the import is completed, you might delete the two files.

This importer is not guaranteed to work - based on Ghost or WordPress extensions used. It worked at some point and might break with any upcoming release of either tool.

<?php
define( 'WP_POST_REVISIONS', false );
define( 'BASE_URL', 'YOUR_GHOST_URL' );
include './wp-load.php';
if ( ! function_exists( 'wp_crop_image' ) ) {
include( ABSPATH . 'wp-admin/includes/image.php' );
}
$ghost = json_decode( file_get_contents( './ghost.json' ) );
// Users
echo "USERS:\n";
$ghostUsers = $ghost->db[0]->data->users;
$ghostUserLookup = [];
foreach ( $ghostUsers as $ghostUser ) {
$userId = username_exists( $ghostUser->slug );
if ( ! $userId and email_exists( $ghostUser->email ) == false ) {
$random_password = wp_generate_password( $length = 12, $include_standard_special_chars = false );
$userId = wp_create_user( $ghostUser->slug, $random_password, $ghostUser->email );
echo $ghostUser->slug . " (ID " . $userId . "), password = " . $random_password . "\n";
} else {
echo $ghostUser->slug . " (ID " . $userId . ") already migrated.\n";
}
$ghostUserLookup[ $ghostUser->id ] = $userId;
wp_update_user( array( 'ID' => $userId, 'user_url' => $ghostUser->website ) );
update_user_meta( $userId, 'description', $ghostUser->bio );
}
// Roles
$ghostRoles = $ghost->db[0]->data->roles;
$ghostRoleLookup = [];
foreach ( $ghostRoles as $ghostRole ) {
switch ( $ghostRole->name ) {
case 'Owner':
$ghostRoleLookup[ $ghostRole->id ] = 'administrator';
break;
case 'Administrator':
$ghostRoleLookup[ $ghostRole->id ] = 'administrator';
break;
case 'Editor':
$ghostRoleLookup[ $ghostRole->id ] = 'editor';
break;
case 'Author':
$ghostRoleLookup[ $ghostRole->id ] = 'author';
break;
default:
break;
}
}
// Match roles to users
echo "ROLES_USERS:\n";
$ghostRolesUsers = $ghost->db[0]->data->roles_users;
foreach ( $ghostRolesUsers as $ghostRoleUser ) {
$userId = $ghostUserLookup[ $ghostRoleUser->user_id ];
if ( $userId === null ) {
continue;
}
$user = new WP_User( $userId );
$role = $ghostRoleLookup[ $ghostRoleUser->role_id ];
echo "Assigning " . $user->user_login . " to role " . $role . "\n";
$user->set_role( $role );
}
// Tags
echo "TAGS:\n";
$ghostTags = $ghost->db[0]->data->tags;
$ghostTagLookup = [];
foreach ( $ghostTags as $ghostTag ) {
$term = term_exists( $ghostTag->name, 'post_tag' );
if ( ! $term ) {
$term = wp_insert_term( $ghostTag->name, 'post_tag', array(
'description' => $ghostTag->description,
'slug' => $ghostTag->slug,
) );
}
$ghostTagLookup[ $ghostTag->id ] = $term['term_id'];
echo $ghostTag->name . " => " . $term['term_id'] . "\n";
}
// Post Tags
echo "POST_TAGS:\n";
$ghostPostTags = $ghost->db[0]->data->posts_tags;
$ghostPostTagLookup = [];
foreach( $ghostPostTags as $ghostPostTag ) {
if ( ! isset( $ghostPostTagLookup[ $ghostPostTag->post_id ] ) ) {
$ghostPostTagLookup[ $ghostPostTag->post_id ] = array();
}
if ( isset( $ghostTagLookup[ $ghostPostTag->tag_id ] ) ) {
$ghostPostTagLookup[ $ghostPostTag->post_id ][] = $ghostTagLookup[ $ghostPostTag->tag_id ];
}
}
// Posts
echo "POSTS:\n";
$ghostPosts = $ghost->db[0]->data->posts;
$ghostPostLookup = [];
foreach ( $ghostPosts as $ghostPost ) {
echo $ghostPost->title . "\n";
$args = array(
'post_author' => $ghostUserLookup[ $ghostPost->author_id ],
'post_date' => $ghostPost->published_at,
'post_content' => $ghostPost->html,
'post_content_filtered' => $ghostPost->plaintext,
'post_title' => $ghostPost->title,
'post_status' => $ghostPost->status === 'published' ? 'publish' : 'draft',
'post_name' => $ghostPost->slug,
// 'tags_input' => $ghostPostTagLookup[ $ghostPost->id ],
);
$postId = wp_insert_post( $args );
wp_set_object_terms( $postId, $ghostPostTagLookup[ $ghostPost->id ], 'post_tag', false );
$text = $ghostPost->html;
// find images
$result = preg_match_all( '/<img.+?src="(.+?)".+?>/', $text, $matches );
if ( $result && count( $matches ) >= 2 ) {
$urls = $matches[1];
foreach ( $urls as $k => $url ) {
if ( strpos( $url, '/blog/content' ) !== 0 ) {
continue;
}
$downloadUrl = BASE_URL . $url;
echo $downloadUrl . "... ";
$filename = basename( $url );
$uploadDir = wp_upload_dir( $ghostPost->published_at );
$uploadFile = $uploadDir['path'] . '/' . $filename;
$contents = file_get_contents( $downloadUrl );
$saveFile = fopen( $uploadFile, 'w' );
fwrite( $saveFile, $contents );
fclose( $saveFile );
$wp_filetype = wp_check_filetype( basename( $filename ), null );
$attachment = array(
'post_author' => $ghostUserLookup[ $ghostPost->author_id ],
'post_mime_type' => $wp_filetype['type'],
'post_title' => $filename,
'post_content' => '',
'post_status' => 'inherit',
'post_date' => $ghostPost->published_at,
'post_parent' => $postId,
);
$attachId = wp_insert_attachment( $attachment, $uploadFile );
$imagenew = get_post( $attachId );
$fullsizepath = get_attached_file( $imagenew->ID );
$attach_data = wp_generate_attachment_metadata( $attachId, $fullsizepath );
wp_update_attachment_metadata( $attachId, $attach_data );
$text = str_replace( $url, wp_get_attachment_url( $attachId ), $text );
if ( $k == 0 ) {
set_post_thumbnail( $postId, $attachId );
}
echo "done \n";
}
}
// replace links
$text = str_replace( BASE_URL . '/blog', get_home_url( '/' ), $text );
wp_update_post( array(
'ID' => $postId,
'post_content' => $text,
) );
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment