[英]Tricky integration of a legacy PHP app and a new Ruby on Rails app
[英]Ruby on Rails Integration With Wordpress
我有一個客戶要求我建立一個網站,用一種非常用戶友好的方式來更新內容。 他們表達了對wordpress的熟悉,並表示有興趣能夠使用wordpress前端更新其內容。
我原本打算建立一個簡單的管理頁面,他們可以創建帖子,或添加其他類型的內容..但似乎wordpress已經有大部分功能。
主要問題是我是一名RoR開發人員。 我喜歡在我做的每件事情上使用haml,並且100%完全控制網站的工作方式。
所以我希望那里有人會想到我仍然可以使用rails和haml構建網站,但仍允許我的客戶端使用wordpress進行更新。 我想也許我可以訪問wordpress api,只是拉出內容並按照我想要的方式顯示它? 或者我應該去另一個CMS ..像Refinery ?
老實說,我真的不想觸摸PHP,最好使用haml而不是html。 O_O
這似乎對我有用(我從Wordpress加載為輔助數據庫,因此table_name
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
然后我在一個簡單的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(確保您的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
現代藝術博物館有一個WordPress JSON API插件,專為此目的而構建: https : //github.com/dphiffer/wp-json-api
這使他們能夠構建基於RoR的前端層,同時保持WordPress驅動的后端層。
較舊的答案不再相關。 WordPress現在提供了一個Rest API,可以在這里訪問: https : //developer.wordpress.org/rest-api/
1)您可能希望在rails應用程序中集成所有路由(通過從文章中獲取“slug”)來正確地提供文章並為它們提供一個漂亮的“show”視圖。
2)如果你想在rails系統中存儲數據(例如用於路由和提高速度),你可以創建一個名為wp_articles的數據庫表,只需閱讀完整的文章列表或更新相關文章,然后將它們呈現為與普通代碼類似。
我已經看過非維護的MOMA gem(不再需要,不需要維護),通過直接數據庫訪問(巨大的努力,更慢,過時)檢查上面的答案,並在這里閱讀一個簡單的復雜的直接基於JavaScript的解決方案( http: @marydickson.com/how-to-use-the-wordpress-rest-api-in-rails/ ),但我認為只需將相關信息復制到您的系統中然后使用正常的MVC流程呈現它們就是最簡單的辦法。
缺點:一些額外的WP插件提供了更多的數據庫字段和其他信息,並且不清楚是否可以通過API訪問這些字段。 所以你的功能可能略有限制。
您可以安裝Wordpress然后將wordpress數據庫重新生成為Model
s並添加像wordpress這樣的關聯使用它們。 然后,您將能夠使用在wordpress前端輸入的rails來訪問數據。 我過去做過類似的事情,但不是永久解決方案,而是作為遷移到另一個解決方案的數據源。 它可能,它不好但它的工作原理。
但有一個問題:為什么你使用wordpress來做一件不夠強大的東西?! 它不是一個用於挑戰任務的框架。 如果它不符合客戶的需求,那么它根本就不適合使用。 您可以使用rails構建類似的GUI,然后擺弄wordpress。
關於HAML,您仍然可以用haml input.haml output.html
編寫視圖,然后在命令行中使用haml input.haml output.html
。 有點無聊,但你不必寫html。
使用MAMP並安裝wordpress。 在本地主機中打開頁面。 然后你可以使用firefox工具來查看html代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.