I'm getting ready to import a WordPress blog to SharePoint 2010. Anyone have an importer already built? If not, I'll have to build my own.

  • Given that your question is already fourth on the Google listings for "SharePoint Wordpress Import" I'd suggest that making your own may well be the best course of action. Sticking it on Codeplex and linking it here as an answer would greatly benefit people in a similar position in future (as well as being good for your karma, man).
    – Stu Pegg
    Apr 18, 2011 at 10:24
  • I made one but it's not ready for public release. It's based on the Camelot PHP Tools for SharePoint. bendsoft.com/downloads/sharepoint-php-tools Apr 27, 2011 at 6:44

2 Answers 2


Here is a tool to migrate your blog you might want to buy http://www.metalogix.com/Products/Migration-Manager-for-SharePoint/Blogs-and-Wikis-Edition.aspx?id=12

  • This is what endusersharepoint.com used to migrate to nothingbutsharepoint.com (Wordpress to Sharepoint 2010). Apr 18, 2011 at 12:23

I know this is old, but I was also frustrated, that nobody had done this before. I decided to write my migration script in powershell. If you ever need something like this again, give it a try: http://memyselfandbenchase.blogspot.de/2015/07/migrate-your-wordpress-blog-to.html

Hope it helps someone else.

Here is the script. Sorry that it is so long.

#requires -version 3  
  This script migrates a wordpress blog to a sharepoint blog.  
  This script migrates a wordpress blog to a sharepoint blog.  
  It is based on the xml export from wordpress. It then parses all the  
  posts, comments and categories. It changes all of the links and  
  uploads the files/images in the posts to the sharepoint library.  
  In order for this to work, the wordpress blog is expected to still be  
  reachable through the links in the export. The user names are preserved  
  as long as the users are also available in sharepoint. Otherwise, the  
  Post/comment is carried out as another defined user.  
  Saves uploads from wordpress in .\uploads  
  Version:    1.0  
  Author:     Benjamin Chase  
  Creation Date: 15 July 2015  
 if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null)   
   Add-PSSnapin "Microsoft.SharePoint.PowerShell"  
 $sourceURL = "https://my.wordpress.blog"  
 $destinationURL = "https://my.sharepoint.server"  
 #Name of sharepoint lists  
 $postListName = "Posts"  
 $mediaListName = "Pictures"  
 $categoryListName = "Categories"  
 $commentsListName = "Comments"  
 #local folder to save files from source server  
 $uploadsFromSourceServer = ($PSScriptRoot + "\uploads")  
 $xmlFilePath = Get-ChildItem ($PSScriptRoot + "\*.*") -Include "*.xml" | foreach-object {$_.Fullname}  
 #This user is used for posts and comments if the imported account does not exist in sharepoint  
 #$defaultUser = $Web.EnsureUser((Get-SPFarm).DefaultServiceAccount.Name)  
 $defaultUser = $Web.EnsureUser("guest")  
 $regex = [System.Text.RegularExpressions.Regex]::Escape($sourceURL) + '(.*?)\/uploads\/(.*?)"'  
 $Web = Get-SPWeb $destinationURL  
 $postList = $Web.Lists[$postListName]  
 $mediaList = $web.Lists[$mediaListName]  
 $categoryList = $web.Lists[$categoryListName]  
 $commentsList = $web.Lists[$commentsListName]  
 # load it into an XML object:  
 $xml = New-Object -TypeName XML  
 foreach($wpPost in $Xml.rss.channel.item )  
 $newPost = $postList.Items.Add()  
 $newPost["Title"] = $wpPost.title  
 #see if user exists in sharepoint, otherwise post as farm admin  
      $newPost["Author"] = $Web.EnsureUser($wpPost.creator.innertext)  
      $newPost["Author"] = $defaultUser  
 $newPost["Teaser"] = $wpPost.description  
 #Convert CDATA to string and replace newline with HTML Syntax  
 [string]$body = ($wpPost.Encoded | Foreach {"$($_.innertext)"}).replace("`n","<br/>")  
 #if upload folder does not exist, create it  
 if(!(Test-path $uploadsFromSourceServer)){  
      New-Item -Path $uploadsFromSourceServer -ItemType Directory | Out-Null  
 #Get all uploaded files and upload them to sharepoint library  
      $body | select-string -pattern $regex -AllMatches | Foreach {$_.Matches} | ForEach-Object {   
           $fileURL =($_.Value).trim('"')  
           $filename = ($fileURL.Substring($fileURL.LastIndexOf("/") + 1))  
                $webClient=new-object system.net.webclient  
                $webClient.downloadfile($fileURL, ($uploadsFromSourceServer +"\$($filename)"))  
                write-host "Downloading: " $filename  
                write-error "Error while processing: " $fileURL  
      write-error "Error while parsing content."  
 #Convert Urls to new server url for the pictures  
 $body = $body | % {$_ -replace ([System.Text.RegularExpressions.Regex]::Escape($sourceURL)+"(.*?)\/uploads\/\d{4}\/\d{2}\/"), "$($destinationURL)/Lists/$($mediaListName)/"}   
 $newPost["Body"] = $body  
 $pubDate = Get-Date -Date $wpPost.post_date  
 $newPost["PublishedDate"] = $pubDate  
 [Microsoft.SharePoint.SPFieldLookupValueCollection] $categoryValues = New-Object Microsoft.SharePoint.SPFieldLookupValueCollection  
 #If category exists and is a category and not a post tag then add it to post  
 foreach($wpCategory in $wpPost.category | Where-object{$_.domain -eq "category"}){  
      if($categoryList.items.name -notcontains $wpCategory.innertext){  
           write-host "Adding category: " $wpCategory.innertext -ForegroundColor green  
           $newCategory = $categoryList.Items.Add()  
           $newCategory["Title"] = $wpCategory.innertext  
           #Update list to get new items and select category from list  
      #get category  
      $category = $categoryList.items | Where-object {$_.Name -eq $wpCategory.innertext}  
 $newPost["PostCategory"] = $categoryValues  
 #Generate lookup value to reference the post  
 $postToComment = $postList.items | Where-object {$_.Title -eq $newPost["Title"]}  
 $postLookupValue = New-Object Microsoft.Sharepoint.SPFieldLookupValue($postToComment["ID"],$postToComment["Title"])  
 #Migrate existing comments  
      foreach($wpComment in $wpPost.comment){  
           $newComment     = $commentsList.Items.Add()  
           #Use comment as title, but cut it off so it fits in the field, this is the standard behaviour in SP  
           if($wpComment.comment_content.innertext.length -gt 26){  
                $newComment["Title"] = $wpComment.comment_content.innertext.Substring(0,26) + "..."  
                $newComment["Title"] = $wpComment.comment_content.innertext  
           #see if user exists in sharepoint, otherwise post as farm admin  
                $newComment["Author"] = $Web.EnsureUser($wpComment.comment_author_email)  
                $newComment["Editor"] = $Web.EnsureUser($wpComment.comment_author_email)  
                $newComment["Author"] = $defaultUser  
                $newComment["Editor"] = $defaultUser  
           $newComment["Body"] = $wpComment.comment_content.innertext  
           $createdDate = Get-Date -Date $wpComment.comment_date  
           $newComment["Created"] = $createdDate  
           $newComment["Modified"] = $createdDate  
           $newComment["PostTitle"] = $postLookupValue  
 #Upload Files from posts  
 $fileCollection = $mediaList.RootFolder.Files  
 $files = Get-ChildItem $uploadsFromSourceServer  
 foreach ($file in $files)  
   $stream = $file.OpenRead()  
   $uploaded = $fileCollection.Add($file.Name, $stream, $TRUE)  
   write-host "Uploaded: " $file.Name -ForegroundColor green  
   if ($stream) {$stream.Dispose()}  
 if ($web) {$web.Dispose()}  
  • Mind sharing the script here? Jul 16, 2015 at 8:46
  • Just updated the post with the script. Jul 16, 2015 at 10:20

Not the answer you're looking for? Browse other questions tagged or ask your own question.