我的第一个建议是,如果可能的话,从phpNuke输出一个WXR格式的文件。我对它不熟悉,但我很肯定它在任何具有数据库访问的平台上都是可能的。如果您不熟悉WXR,请安装一个沙盒WP环境,创建一些帖子,对它们进行分类,创建并分配父页面,上载图像附件,然后在“工具”->“导出”下创建导出。此文件将为您提供使用标准Wordpress导入器插件所需的所有语法。
如果这不是一个选项,我将使用您创建的方法导入所有帖子,然后构建一个函数来分别迁移图像。依我拙见,这将有助于更清洁的操作。
对于清理脚本,我只需基于media\\u sideload\\u image构建自己的函数,因为它不会返回所需的附件ID。
function foo_import_image($url, $post_id, $desc, $set_as_featured = true){
$tmp = download_url($url);
preg_match(\'/[^\\?]+\\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/\', $url, $matches);
$file_array[\'name\'] = basename($matches[0]);
$file_array[\'tmp_name\'] = $tmp;
if ( is_wp_error( $tmp ) ) {
@unlink($file_array[\'tmp_name\']);
$file_array[\'tmp_name\'] = \'\';
}
$id = media_handle_sideload( $file_array, $post_id, $desc );
if($set_as_featured)
update_post_meta($post_id, \'_post_thumbnail\', $id);
return $id;
}
下面是我将如何实现前面的函数:
//do a query to get the post_content fields
//use_preg_match all to identify if the content contains an image
$old_url = \'http://foo.com/images/bar.jpg\'; //this would be matched content
$description = \'Foo Bar Image\';
$id = foo_import_image($old_url, $post_id, $description, false);
$new_url = wp_get_attachment_url($id)
global $wpdb;
$wpdb->query("UPDATE $wpdb->posts SET post_content = replace(post_content, \'$old_url\', \'$new_url\') WHERE ID = \'$post_id\' LIMIT 1");
我的最后一个建议是创建一个单独的开发环境来测试这一点,以免弄乱一个好的导入批处理。每当我执行这种类型的操作时,在开始将大量图像导入DB之前,我都会进行一次完整的DB转储。