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 数据库复制为 Models 并添加 wordpress 使用它们的关联。然后,您将能够使用在 wordpress 前端中输入的 rails 访问数据。我过去做过类似的事情,但不是作为永久解决方案,而是作为迁移到另一个解决方案的数据源。它可能,它不是很好,但它有效。

但是有一个问题:你为什么要使用 wordpress 来做一件不够强大的事情?!它是一个 CMS,而不是具有挑战性的任务的框架。如果它不符合客户的需求,那它根本就不适合使用。您宁愿使用 rails 构建一个类似的 GUI,然后摆弄 wordpress。

【讨论】:

您知道我在哪里可以找到有关此的更多信息吗?比如他们使用的实际模型以及它们之间的关系。 你必须逆向引擎!使用show tablesshow 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这样的框架取代吗?

在 Ruby on Rails 中为帖子添加标签

Ruby on Rails 的社交媒体共享按钮 Gem

Angular.js 与 Ruby On Rails 表单的集成

paypal 与 ruby​​ on rails 集成的“zoid 破坏了所有错误”

$redis 全局变量与 ruby​​ on rails