Импорт записей из WordPress в приложение на ASP.NET MVC 4

07.11.2013 at 19:47

Модель данных

Создадим три сущности — пост, категория и тег. У каждого поста может быть одна категория и несколько тегов.

[Table("Category")]
public class Category
{
  [Key]
  [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
  public int CategoryId { get; set; }

  public string Name { get; set; }
}

[Table("Tag")]
public class Tag
{
  [Key]
  [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
  public int TagId { get; set; }

  public string Name { get; set; }

  public ICollection<Post> Posts { get; private set; }

  public Tag()
  {
    this.Posts = new List<Post>();
  }
}

[Table("Post")]
public class Post
{
  [Key]
  [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
  public int PostId { get; set; }

  public string Title { get; set; }

  [Column(TypeName = "ntext")]
  public string Body { get; set; }

  public Category PostCategory { get; set; }

  public ICollection<Tag> PostTags { get; set; }

  public Post()
  {
    this.PostTags = new List<Tag>();
  }
}

Для доступа к данным создаем контекст

public class PostContext : DbContext
{
  public PostContext() : base("DefaultConnection") { }

  public DbSet<Post> Posts { get; set; }
  public DbSet<Category> Categories { get; set; }
  public DbSet<Tag> Tags { get; set; }
}

Благодаря механизму Code First в Entity Framework, база создастся сама. Для определения названий таблиц и типов свойств используются атрибуты. Думаю, из кода все понятно.

Многие ко многим

У каждого поста может быть несколько тегов и каждый тег может относиться к нескольким постам. Нужна связь «многие ко многим», благо она в EntityFramework делается легко. Добавляем в контекст переопределенный метод

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  base.OnModelCreating(modelBuilder);
  modelBuilder.Entity<Post>().
    HasMany(p => p.PostTags).
    WithMany(t => t.Posts).
    Map(m =>
      {
        m.MapLeftKey("PostId");
        m.MapRightKey("TagId");
        m.ToTable("PostTagLinks");
      }
    );
}

Чтение данных из wordpress

Читать данные конечно будем по rss. Rss мы будем получать вот по таким ссылкам

http://lsreg.ru/feed/?paged=2

Для работы с рсс есть отличный класс SyndicationFeed. Используется он так

using (var reader = XmlReader.Create(this.GetRssFeedUrl(blog, page)))
  feed = SyndicationFeed.Load(reader);

Дальше проходим по свойству Items и для каждой записи в рсс создаем пост.
Есть несколько особенностей:
Тело поста приходится получать так:

  item.ElementExtensions.ReadElementExtensions<string>("encoded", "http://purl.org/rss/1.0/modules/content/").First();

Категории и теги хранятся вместе, в свойстве Categories. Сначала категории, потом теги.

Вот и все, этого достаточно, чтобы перетащить все записи из wordpress.