The default WordPress importer can’t transfer more images than the
PHPexecution time allows it to, which makes it almost impossible to migrate a large WordPress.com site with lots of media assets and attachments.
I wrote a simple
PHP script that extracts all attachment URLs from a WordPress export file and stores them in a text file with one URL per line:
$a = array(); $x = simplexml_load_file('export.xml'); foreach ( $x->channel->item as $item ) if ( $wp = $item->children('http://wordpress.org/export/1.2/') ) if ( $wp->post_type == 'attachment' ) $a = $wp->attachment_url; file_put_contents( 'export_media.txt', implode( "\n", $a ) );
We can then use the
export_media.txt file together with
xargs to download all attachements, like this:
$ xargs -n 1 wget -p -nc < urls.txt
$ xargs -n 1 curl -O < export_media.txt
Note that the
wget script will keep the correct folder structure.