16

我有一个客户谁已经要求我建立一个用户友好的方式来更新内容的网站。他们表达了对wordpress的熟悉,并表示有兴趣能够使用wordpress前端更新其内容。Ruby on Rails与Wordpress的集成

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

主要问题是我是RoR开发者。我喜欢为我所做的每件事情使用haml,并且完全控制网站的工作方式。

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

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

+7

请不要凑齐一些试图结合你的客户_wants_的东西,一些可怜的未来维护者将不得不解码... – 2012-02-14 13:27:43

+3

使用WordPress。没有意义重新发明轮子。空闲时间将允许您选择其他可以在您的首选环境中工作的项目。 – MunkiPhD 2012-02-14 13:52:52

+6

你是一个锤子,这不是钉子。有时候你必须告诉客户“我不是这份工作的合适人选”。当你帮助他们充实项目的需求时,你仍然可以参与项目,并且你可以帮助他们找到一个有能力的PHP人员。然而,将一些可怕的Frankenstinian RoR/Wordpress网站拼凑在一起的想法让我不寒而栗。 – 2012-02-14 13:58:43

回答

3

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

1)你可能会想采取从文章的“弹头”)在导轨上的所有路由(集成应用正确的和现在的服务条款他们有一个很好的“表演”的观点。你可以创建一个名为wp_articles的数据库表,只需阅读完整的文章列表或更新相关文章,然后将它们呈现为类似于你的正常代码。

我已经看过了非维护的MOMA宝石(不再需要,没有维护),通过直接数据库访问(巨大的努力,更慢,过时)检查了上述答案,并阅读了有关slighlty复杂的直接基于JavaScript的解决方案这里(http://marydickson.com/how-to-use-the-wordpress-rest-api-in-rails/),但我认为简单地将相关信息复制到您的系统中,然后向他们展示正常的MVC过程是最简单的方法。

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

+0

非常感谢你帮助我们更新这个问题。 – BananaNeil 2017-06-06 00:11:49

2

您可以安装Wordpress,然后重新生成wordpress数据库为Model s并添加像wordpress使用它们的关联。然后,您将能够使用在wordpress前端输入的导轨访问数据。过去我做了这样的事情,但不是一个永久的解决方案,而是作为迁移到另一个解决方案的数据源。它可能,它不是很好,但它的作品。

但有一个问题:为什么你使用wordpress的东西它不够强大?!它的CMS不是具有挑战性任务的框架。如果它不符合消费者的需求,那么它就不适合使用。你可以使用rails构建一个类似的GUI,然后用wordpress来摆弄。

+0

你知道我在哪里可以找到关于这方面的更多信息吗?就像他们使用的实际模型以及他们的关系是什么一样。 – BananaNeil 2012-02-16 00:08:55

+0

你必须扭转引擎!使用'show tables'的mysql控制台和'show table_name'来显示他们的表和字段是什么。但就像我说的那种不好的风格...... – davidb 2012-02-16 12:23:02

1

关于HAML,您仍然可以使用haml编写您的视图,然后在命令行上使用haml input.haml output.html。有点无聊,但你不必写HTML。

18

这似乎是为我工作(我从Wordpress作为辅助数据库加载,因此establish_connection()调用和覆盖table_name。这应该得到大部分的方式,让您访问Wordpress数据作为ActiveRecord对象。 WordPress的数据我还没有写帖子左右(WPPost)的包装,使他们更多的用户从API的角度友好,但是这应该很好地工作的Rails为基础的显示。

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 

然后我用在一个简单的红宝石对象中使类别变得容易:

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 
9

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

这使得他们可以在维护WordPress驱动的后端图层的同时构建基于RoR的前端图层。