Ruby on Rails 与 Wordpress 的集成
Posted
技术标签:
【中文标题】Ruby on Rails 与 Wordpress 的集成【英文标题】:Ruby on Rails Integration With Wordpress 【发布时间】:2012-03-05 20:36:56 【问题描述】:我有一个客户要求我为他们建立一个网站,该网站以非常用户友好的方式更新内容。他们表示熟悉 wordpress,并表示有兴趣使用 wordpress 前端来更新他们的内容。
我原本打算为他们构建一个简单的管理页面,他们可以在其中创建帖子或添加其他类型的内容。但似乎 wordpress 已经具备大部分功能。
主要问题是我是一名 RoR 开发人员。我更喜欢在我做的每一件事上使用 haml,并且可以 100% 完全控制网站的工作方式。
所以我希望有人能想到一种方法,我仍然可以使用 rails 和 haml 构建网站,但仍然允许我的客户使用 wordpress 进行更新。我想也许我可以访问 wordpress api,然后拉出内容并以我想要的方式显示它?或者我应该使用另一个 CMS .. 比如 Refinery?
老实说,我真的不想接触 php,最好使用 haml,而不是 html。 O_o
【问题讨论】:
请不要拼凑一些东西,试图将你喜欢的东西与你的客户想要的东西结合起来,一些可怜的未来维护者将会拥有解码... 使用 WordPress。重新发明***没有意义。空闲时间将允许您选择其他可以在您喜欢的环境中工作的项目。 你是锤子,这不是钉子。有时你必须告诉客户“我不是这份工作的合适人选”。当您帮助他们充实项目的需求时,您仍然可以参与该项目,并且您可以帮助他们找到一个称职的 PHP 人员。然而,将一些可怕的弗兰肯斯坦式 RoR/Wordpress 网站拼凑在一起的想法让我不寒而栗。 【参考方案1】:这似乎对我有用(我从 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
然后,我将类别封装在一个简单的 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
【讨论】:
哇,你有关于这方面的详细指南吗?谢谢。【参考方案2】:现代艺术博物馆有一个专门为此目的而构建的 WordPress JSON API 插件:https://github.com/dphiffer/wp-json-api
这使他们能够构建基于 RoR 的前端层,同时维护 WordPress 驱动的后端层。
【讨论】:
【参考方案3】:旧答案不再相关。 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 访问这些。因此,您的功能可能会略有限制。
【讨论】:
非常感谢您帮助更新此问题。 这种方法比直接访问 WP 数据库并为它们创建模型/控制器更好吗?或者这已经不可能了? 如果您直接访问 WP 数据库,如果这是您的应用程序正在做的唯一事情,您可能会有一个更干净的解决方案。在我的情况下,它被混合到一个不同的项目中,我想把事情分开。祝你好运。【参考方案4】:您可以安装 Wordpress,然后将 wordpress 数据库复制为 Model
s 并添加 wordpress 使用它们的关联。然后,您将能够使用在 wordpress 前端中输入的 rails 访问数据。我过去做过类似的事情,但不是作为永久解决方案,而是作为迁移到另一个解决方案的数据源。它可能,它不是很好,但它有效。
但是有一个问题:你为什么要使用 wordpress 来做一件不够强大的事情?!它是一个 CMS,而不是具有挑战性的任务的框架。如果它不符合客户的需求,那它根本就不适合使用。您宁愿使用 rails 构建一个类似的 GUI,然后摆弄 wordpress。
【讨论】:
您知道我在哪里可以找到有关此的更多信息吗?比如他们使用的实际模型以及它们之间的关系。 你必须逆向引擎!使用show tables
和show columns from table_name
使用mysql 控制台来区分它们的表和字段是什么。但就像我说的那样,它的风格很糟糕......【参考方案5】:
关于 HAML,您仍然可以在 haml 中编写您的视图,然后在命令行中使用 haml input.haml output.html
。有点无聊,不过不用写html。
【讨论】:
【参考方案6】:使用 MAMP 并安装 wordpress。 在本地主机中打开页面。 然后就可以使用firefox工具查看html代码了。
【讨论】:
以上是关于Ruby on Rails 与 Wordpress 的集成的主要内容,如果未能解决你的问题,请参考以下文章
Wordpress可以被像Django或Ruby on Rails这样的框架取代吗?
Angular.js 与 Ruby On Rails 表单的集成