Matt Johnson / @xmatt / alleyinteractive.com
http://xmattus.github.io/content-migration-beyond-wxr
We're gonna talk about code!
wp_posts
tableIn functions.php
for your theme:
if ( defined( 'WP_CLI' ) ) {
require_once( MY_THEME_DIR . '/inc/class-migration-cli.php' );
}
In class-migration-cli.php
:
class Migration_CLI extends WP_CLI_Command {
public function fix_my_data( $args, $assoc_args ) {
$per_page = 100;
$page = 0;
do {
$posts = get_posts( array(
... // Your WP_Query arguments here.
'posts_per_page' => $per_page,
'offset' => $per_page * $page++,
) );
foreach ( $posts as $post ) {
// Do your stuff here.
wp_update_post( $post );
}
} while ( $per_page == count( $posts ) );
}
}
WP_CLI::add_command( 'migration', 'Migration_CLI' );
Then run it on your server, local dev, or what have you:
$ cd /var/www/my_wp_site.com
$ wp migration fix_my_data
Returning to class-migration-cli.php
:
class Migration_CLI extends WP_CLI_Command {
public function migrate_data( $args, $assoc_args ) {
$this->connect_to_legacy_source();
while ( $this->has_legacy_data() ) {
// Extract:
$row = $this->get_legacy_post();
$post = array(
'post_type' => 'post',
'post_title' => $row['title'],
'post_content' => $row['content'],
'post_date' => date( 'Y-m-d H:i:s', strtotime( $row['date' ] ) ),
)
// Transform:
if ( $row['is_slideshow'] ) {
$post['post_type'] = 'slideshow';
}
// Load:
$post_id = wp_insert_post( $post );
update_post_meta( $post_id, 'legacy_id', $row['id'] );
if ( $row['is_slideshow'] ) {
update_post_meta( $post_id, 'slides', $this->get_legacy_slides( $row['id'] ) );
}
}
}
}
WP_CLI::add_command( 'migration', 'Migration_CLI' );
This line:
update_post_meta( $post_id, 'legacy_id', $row['id'] );
means we can identify this post next time we run the script:
if ( $post_id = $this->new_post_exists( $row['id'] ) ) {
$post['ID'] = $post_id;
wp_update_post( $post );
} else {
$post_id = wp_insert_post( $post );
}
..and not have to wipe our our WP site each time we test the migration.
has_legacy_data()
: return true
until no legacy items left.get_legacy_post()
: returns an array with the next legacy item.get_legacy_slides()
: returns some special structured data (like slides in a slideshow).new_post_exists()
: returns the post_id
of the WP post with this legacy id, or false
if there isn't one.
Want to do cool stuff like this?
We're hiring.
info@alleyinteractive.com