Ruby on Rails与Wordpress集成

Ban*_*eil 17 php wordpress ruby-on-rails content-management-system ruby-on-rails-3

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

我原本打算建立一个简单的管理页面,在那里他们可以创建帖子,或添加其他类型的内容..但似乎wordpress已经有大部分功能.

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

所以我希望那里有人会想到我仍然可以使用rails和haml构建网站,但仍允许我的客户端使用wordpress进行更新.我想也许我可以访问wordpress api,只是拉出内容并按照我想要的方式显示它?或者我应该去另一个CMS ..像Refinery

老实说,我真的不想触摸PHP,最好使用haml而不是html.O_O

Ari*_*her 21

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

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
Run Code Online (Sandbox Code Playgroud)

然后我在一个简单的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
Run Code Online (Sandbox Code Playgroud)

这是我的database.yml(确保您的db用户具有对wordpress db的只读访问权限,以避免任何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
Run Code Online (Sandbox Code Playgroud)


Kev*_* C. 10

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

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


Mic*_*itz 5

较旧的答案不再相关。WordPress 现在提供了一个 Rest API,可以在这里访问:https : //developer.wordpress.org/rest-api/

1) 您可能希望在 Rails 应用程序中集成所有路由(通过从文章中获取“slug”)以正确提供文章并以漂亮的“显示”视图呈现它们。

2) 如果你想在 Rails 系统中存储数据(例如用于路由和提高速度),你可以创建一个名为 wp_articles 的数据库表,只需阅读完整的文章列表或更新相关文章,然后以类似于你的正常代码的方式呈现它们。

我查看了非维护的 MOMA gem(不再需要,不再维护),通过直接数据库访问(巨大的努力,速度较慢,过时)检查了上述答案,并在此处阅读了一个基于 javascript 的简单复杂的直接解决方案(http: //marydickson.com/how-to-use-the-wordpress-rest-api-in-rails/ ),但我认为简单地将相关信息复制到您的系统中,然后用正常的 MVC 流程呈现它们是最简单的道路。

缺点:一些额外的 WP-Plugins 提供了更多的数据库字段和其他信息,并不清楚您是否总是可以通过 API 访问这些信息。因此,您的功能可能略有限制。