This entry was originally published at
my site's personal web log. Additional information or
comments may be available on
the original posting.
Movable Type is a pretty frustrating platform to work with because every so often (or, “way too often,” depending on who you ask) a function of the system simply doesn’t do what you’d expect it to do. Such is the case with the “Clone Blog” functionality. Although it dutifully copies most of a website from one “blog” object to another, a few things are missing.
Most notably, custom fields and templates’ linked files are not copied. This is a deal-breaker for any large installation that uses the built-in MT “Clone” feature.
To get around this limitation, I wrote a stupid, quick ‘n’ dirty PHP script to finish the cloning process, called finishclone.php. It takes only 1 argument: the “new ID” you are cloning to. If all goes well, you’ll see output like this:
[root@dev www]$ php finishclone.php 28
Cloning process complete.
[root@dev www]$
In this example, 28 is the newly created blog’s ID. The blog you want to clone from is set as a constant within the script. I’ll leave modifying the script to support more flexible command line arguments as an exercise for the reader.
php
/**
* Ease the final steps in cloning a Movable Type blog.
*
* Description: This script should be run after Movable Type's "Clone Blog"
* function has completed and before the cloned blog is used.
*
* Author: "Meitar Moscovitz"
*/
// Set constants.
define('MT_ORIG_BLOG', 0); // the ID of the blog you are cloning from
define('MYSQL_HOST', 'localhost');
define('MYSQL_USER', 'movabletype');
define('MYSQL_PASS', 'PASSWORD_HERE');
define('MYSQL_DB', 'movabletype');
// Get command line arguments.
if (2 > $_SERVER['argc']) { die('Tell me the ID of the blog to clone into.'); }
$blog_id = (int) $argv[1];
// Connect to db
if ( !mysql_pconnect( MYSQL_HOST, MYSQL_USER, MYSQL_PASS ) ) {
die( 'Connection to the database has failed: ' . mysql_error( ) );
}
mysql_select_db( MYSQL_DB );
// Clone custom fields.
$result = mysql_query('SELECT * FROM mt_field WHERE field_blog_id='.MT_ORIG_BLOG.';');
while ($row = mysql_fetch_object($result)) {
mysql_query(
sprintf("INSERT INTO mt_field ("
."field_basename,"
."field_blog_id,"
."field_default,"
."field_description,"
."field_name,"
."field_obj_type,"
."field_options,"
."field_required,"
."field_tag,"
."field_type) "
."VALUES('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s');",
mysql_real_escape_string($row->field_basename),
mysql_real_escape_string($blog_id),
mysql_real_escape_string($row->field_default),
mysql_real_escape_string($row->field_description),
mysql_real_escape_string($row->field_name),
mysql_real_escape_string($row->field_obj_type),
mysql_real_escape_string($row->field_options),
mysql_real_escape_string($row->field_required),
mysql_real_escape_string($row->field_tag),
mysql_real_escape_string($row->field_type)
)
) OR print mysql_error() . "\n";
}
// Link template files to filesystem for git repositories.
$arr = array();
$result = mysql_query('SELECT template_name,template_linked_file FROM mt_template WHERE template_blog_id='.MT_ORIG_BLOG.';');
while ($row = mysql_fetch_object($result)) {
$arr[$row->template_name] = $row->template_linked_file;
}
foreach ($arr as $k => $v) {
mysql_query("UPDATE mt_template SET template_linked_file='$v' WHERE template_blog_id=$blog_id AND template_name='$k';");
}
print "Cloning process complete.\n";