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的前端圖層。