Ruby on Rails 与 Wordpress 的集成

我有一个客户要求我用一种非常用户友好的方式为他们建立一个网站来更新内容。他们已经表示熟悉wordpress,并表示有兴趣能够使用wordpress前端来更新他们的内容。

我最初打算为他们建立一个简单的管理页面,他们可以在其中创建帖子或添加其他类型的内容。但似乎wordpress已经具备了大部分功能。

主要问题是我是RoR开发人员。我更喜欢在我所做的每一件事上使用haml,并且100%完全控制网站的工作方式。

所以我希望有人能想到一种方法,我仍然可以使用rails和haml构建网站,但仍然允许我的客户使用wordpress进行更新。我想也许我可以访问wordpress api,然后拉动内容并以我想要的方式显示它?或者也许我应该去另一个CMS..喜欢炼油厂

老实说,我真的不想接触PHP,最好使用haml,而不是html。O_o


答案 1

这似乎对我有用(我从Wordpress加载作为辅助数据库,因此调用和覆盖.这应该大部分方式在那里,让你访问Wordpress数据作为ActiveRecord对象。我还没有编写帖子()的包装器,以使它们从API的角度来看更加用户友好,但这应该适用于基于Rails的Wordpress数据显示。establish_connection()table_nameWPPost

class Term < ActiveRecord::Base
   establish_connection "wordpress-#{Rails.env}"
   self.table_name = "wp_terms"

   has_one :term_taxonomy
end


class TermTaxonomy < ActiveRecord::Base
   establish_connection "wordpress-#{Rails.env}"
   self.table_name = "wp_term_taxonomy"

   belongs_to :term
   has_many :term_relationship
end

class TermRelationship < ActiveRecord::Base
   establish_connection "wordpress-#{Rails.env}"
   self.table_name = "wp_term_relationships"

   belongs_to :post, :foreign_key => "object_id"
   belongs_to :term_taxonomy
   has_one :term, :through => :term_taxonomy
end

class Post < ActiveRecord::Base
   establish_connection "wordpress-#{Rails.env}"
   self.table_name = "wp_posts"

   has_many :term, :through => :term_relationship
   has_many :term_relationship, :foreign_key => "object_id"
   has_one  :postmeta

   # we only care about published posts for notifications
   default_scope where("post_type = 'post' and post_status = 'publish'")
end

class Postmeta < ActiveRecord::Base
   establish_connection "wordpress-#{Rails.env}"
   self.table_name = "wp_postmeta"

   belongs_to :post
end

然后,我将类别包装在一个简单的 ruby 对象中,这样可以轻松访问数据:

class WPCategory
   attr_accessor :id
   attr_accessor :name
   attr_accessor :description
   attr_accessor :term

   def self.categories()
      categories = Term.all()
      categories = categories.select{|term| term.term_taxonomy.taxonomy == "category"}
      return categories.map{|term| WPCategory.new(term)}
   end

   def self.category(id=nil)
      if id
         term = Term.find(id)
         if term.term_taxonomy.taxonomy == "category"
            return WPCategory.new(term)
         end
      end
      return nil
   end

   def initialize(term)
      @id = term.term_id
      @name = term.name
      @description = term.term_taxonomy.description
      @term = term
   end

   def to_s
      return "Wordpress Category: '#{@name}' (id=#{@id})"
   end

end

这是我的 database.yml(确保您的数据库用户对 wordpress 数据库具有只读访问权限,以避免任何 ActiveRecord 事故):

test:
        adapter: mysql2
        encoding: utf8
        database: test-rails
        pool: 5
        username: test
        password: XXXXXX
        socket: /var/lib/mysql/mysql.sock

wordpress-test:
        adapter: mysql2
        encoding: utf8
        database: test-wordpress
        pool: 5
        username: test
        password: XXXXXXX
        socket: /var/lib/mysql/mysql.sock

wordpress-development:
        adapter: mysql2
        encoding: utf8
        database: wordpress
        pool: 5
        username: dev
        password: XXXXXX
        socket: /var/lib/mysql/mysql.sock

development:
        adapter: mysql2
        encoding: utf8
        database: dev
        pool: 5
        username: dev
        password: XXXXXX
        socket: /var/lib/mysql/mysql.sock

答案 2

现代艺术博物馆有一个WordPress JSON API插件,正是为此目的而构建的:https://github.com/dphiffer/wp-json-api

这使他们能够构建基于RoR的前端层,同时保持WordPress驱动的后端层。


推荐