<?php
// config info
$import = array(
‘wp_host’ => ‘localhost’, // hostname
‘wp_user’ => ‘wordpress’, // username
‘wp_pass’ => ‘wordpress’, // password
‘wp_name’ => ‘wordpress’, // name of the database
‘wpprefix’ => ‘wp‘, // table prefix
);
echo ‘<pre>’;
// keep habari from executing
define( ‘UNIT_TEST’, true );
// bootstrap it
include( ‘index.php’ );
// create a connection to our wordpress database
try {
$wpdb = DatabaseConnection::ConnectionFactory( "mysql:host=" . $import[‘wp_host’] . ";dbname=" . $import[‘wp_name’] );
$wpdb->connect( "mysql:host=" . $import[‘wp_host’] . ";dbname=" . $import[‘wp_name’], $import[‘wp_user’], $import[‘wp_pass’] );
}
catch( Exception $e ) {
die(‘Unable to connect to WordPress database. ‘ . $e->getMessage());
}
// users
$habari_users = Users::get(); // get all the habari users
$wp_users = array();
foreach ( $habari_users as $habari_user ) {
// see if the user exists already in WordPress
$wp_user = $wpdb->get_row( ‘select id, user_login from ‘ . $import[‘wp_prefix’] . ‘users where user_login = ?’, array( $habari_user->username ) );
// if it doesn’t, create it
if ( !$wp_user ) {
$wpdb->query( ‘insert into ‘ . $import[‘wp_prefix’] . ‘users (
user_login,
user_pass,
user_nicename,
user_email,
user_registered,
display_name
) values ( ?, ?, ?, ?, UTC_TIMESTAMP(), ? ) ‘, array(
$habari_user->username,
$habari_user->password,
$habari_user->username,
$habari_user->email,
$habari_user->info->displayname
)
);
$wp_users[ $habari_user->username ] = $wpdb->last_insert_id();
echo ‘Created user ‘ . $habari_user->username . ‘ with id ‘ . $wpdb->last_insert_id() . "n";
}
else {
echo ‘Found existing user ‘ . $wp_user->user_login . ‘ with id ‘ . $wp_user->id . "n";
$wp_users[ $wp_user->user_login ] = $wp_user->id;
}
}
// posts and pages
// get the total number of posts, either published or draft
$total_posts = Posts::get( array( ‘count’ => true, ‘ignore_permissions’ => true, ‘content_type’ => array( ‘entry’, ‘page’ ), ‘status’ => array( ‘published’, ‘draft’ ) ) );
$wp_posts = array();
echo ‘Total Posts: ‘ . $total_posts . "n";
for ( $i = 0; $i < $total_posts / 10; $i++ ) {
$posts = Posts::get( array( ‘limit’ => 10, ‘offset’ => $i 10, ‘ignore_permissions’ => true, ‘content_type’ => array( ‘entry’, ‘page’ ), ‘status’ => array( ‘published’, ‘draft’ ) ) );
echo ‘Got ‘ . count( $posts ) . ‘ posts’ . "n";
foreach ( $posts as $post ) {
$insert_query = ‘insert into ‘ . $import[‘wp_prefix’] . ‘posts (
post_author,
post_date,
post_date_gmt,
post_content,
post_title,
post_status,
comment_status,
post_name,
post_modified,
post_modified_gmt,
guid,
post_type
) values (
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
)’;
$insert_params = array(
$wp_users[ $post->author->username ], // post author ID, converted to the WordPress user’s
$post->pubdate->format( ‘Y-m-d H-i-s’ ),
gmdate( ‘Y-m-d H-i-s’, $post->pubdate->int ),
$post->content,
$post->title,
Post::status_name( $post->status ) == ‘published’ ? ‘publish’ : Post::status_name( $post->status ), // post status (published or draft, basically), converted to a string
$post->info->comments_disabled ? ‘closed’ : ‘open’,
$post->slug,
$post->modified->format( ‘Y-m-d H-i-s’ ),
gmdate( ‘Y-m-d H-i-s’, $post->modified->int ),
$post->guid,
Post::type_name( $post->content_type ) == ‘entry’ ? ‘post’ : ‘page’
);
$result = $wpdb->query( $insert_query, $insert_params );
if ( !$result ) {
echo ‘Failed to insert post ‘ . $post->slug . "n";
}
else {
$wp_posts[ $post->id ] = $wpdb->last_insert_id();
}
}
}
// tags
// here we don’t use the habari API because it would be cumbersome - if only it were as robust as the Posts API is…
$total_tags = DB::get_value( ‘select count() from {tags}’ );
$wp_tax = array();
echo ‘Total Tags: ‘ . $total_tags . "n";
for ( $i = 0; $i < $total_tags / 10; $i++ ) {
$tags = DB::get_results( ‘select id, tag_text, tag_slug from {tags} order by id limit 10 offset ‘ . $i 10 );
echo ‘Got ‘ . count( $tags ) . ‘ tags’ . "n";
foreach ( $tags as $tag ) {
// first, see if it already exists as a term in WordPress
$wp_tag = $wpdb->get_row( ‘select term_id, name, slug from ‘ . $import[‘wp_prefix’] . ‘terms where slug = ?’, array( $tag->tag_slug ) );
if ( !$wp_tag ) {
$insert_query = ‘insert into ‘ . $import[‘wp_prefix’] . ‘terms ( name, slug ) values ( ?, ? )’;
$insert_params = array( $tag->tag_text, $tag->tag_slug );
$wpdb->query( $insert_query, $insert_params );
//$wp_tags[ $tag->tag_slug ] = $wpdb->last_insert_id();
$tag_id = $wpdb->last_insert_id();
}
else {
//$wp_tags[ $wp_tag->slug ] = $wp_tag->term_id;
$tag_id = $wp_tag->term_id;
}
// and either way, make sure it’s actually specified as a part of the tag taxonomy
$wp_taxonomy = $wpdb->get_row( ‘select term_taxonomy_id from ‘ . $import[‘wp_prefix’] . ‘term_taxonomy where taxonomy = ? and term_id = ?’, array( ‘post_tag’, $tag_id ) );
if ( !$wp_taxonomy ) {
$insert_query = ‘insert into ‘ . $import[‘wp_prefix’] . ‘term_taxonomy ( term_id, taxonomy ) values ( ?, ? )’;
$insert_params = array( $tag_id, ‘post_tag’ );
$wpdb->query( $insert_query, $insert_params );
$wp_tax[ $tag->id ] = $wpdb->last_insert_id();
}
else {
$wp_tax[ $tag->id ] = $wp_taxonomy->term_taxonomy_id;
}
}
}
// now we have to link all our tags and posts
$total_joins = DB::get_value( ‘select count() from {tag2post}’ );
echo ‘Total Tag to Post relationships: ‘ . $total_joins . "n";
for ( $i = 0; $i < $total_joins / 10; $i++ ) {
// get the joins
$joins = DB::get_results( ‘select tag_id, post_id from {tag2post} order by tag_id, post_id limit 10 offset ‘ . $i 10 );
echo ‘Got ‘ . count( $joins ) . ‘ relationships’ . "n";
foreach ( $joins as $join ) {
// if it’s not in the list of posts we imported earlier, skip it - it’s probably a different content type
if ( !array_key_exists( $join->post_id, $wp_posts ) ) {
continue;
}
$insert_query = ‘insert into ‘ . $import[‘wp_prefix’] . ‘term_relationships ( object_id, term_taxonomy_id ) values ( ?, ? )’;
$insert_params = array( $wp_posts[ $join->post_id ], $wp_tax[ $join->tag_id ] );
$wpdb->query( $insert_query, $insert_params );
}
}
// update the tag counts
$wpdb->query( ‘update ‘ . $import[‘wp_prefix’] . ‘term_taxonomy t set count = ( select count(object_id) from ‘ . $import[‘wp_prefix’] . ‘term_relationships where term_taxonomy_id = t.term_taxonomy_id )’);
// comments
$total_comments = DB::get_value ( ‘select count() from {comments}’ );
echo ‘Total comments: ‘ . $total_comments . "n";
// get the comment types from habari
$comment_types = Comment::list_comment_types();
$comment_statuses = Comment::list_comment_statuses();
for ( $i = 0; $i < $total_comments / 10; $i++ ) {
// get the comments
$comments = DB::get_results( ‘select post_id, name, email, url, ip, date, content, status, type from {comments} order by id limit 10 offset ‘ . $i 10 );
echo ‘Got ‘ . count( $comments ) . ‘ comments’ . "n";
foreach ( $comments as $comment ) {
$comment->date = HabariDateTime::date_create( $comment->date );
$comment_status = $comment_statuses[ $comment->status ];
$comment_type = $comment_types[ $comment->type ];
if ( $comment_status == ‘approved’ ) {
$comment_approved = true;
}
else {
$comment_approved = false;
}
$insert_query = ‘insert into ‘ . $import[‘wp_prefix’] . ‘comments (
comment_post_id,
comment_author,
comment_author_email,
comment_author_url,
comment_author_ip,
comment_date,
comment_date_gmt,
comment_content,
comment_approved,
comment_type
) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )’;
$insert_params = array(
$wp_posts[ $comment->post_id ],
$comment->name,
$comment->email,
$comment->url,
long2ip( $comment->ip ),
$comment->date->format( ‘Y-m-d H-i-s’ ),
gmdate( ‘Y-m-d H-i-s’, $comment->date->int ),
$comment->content,
$comment_approved,
$comment_type
);
$wpdb->query( $insert_query, $insert_params );
}
}
// update comment user_id links based on user display names
$wpdb->query( ‘update ‘ . $import[‘wp_prefix’] . ‘comments c set user_id = ( select ID from ‘ . $import[‘wp_prefix’] . ‘users where display_name = c.comment_author ) where comment_author in ( select distinct display_name from ‘ . $import[‘wp_prefix’] . ‘users )’);
// update post comment counts
$wpdb->query( ‘update ‘ . $import[‘wp_prefix’] . ‘posts p set comment_count = ( select count() from ‘ . $import[‘wp_prefix’] . ‘comments where comment_post_ID = p.ID and comment_approved = ‘1’ )’ );
echo ‘</pre>’;
?>