Интеграция Ruby on Rails с Wordpress - PullRequest
17 голосов
/ 14 февраля 2012

У меня есть клиент, который попросил меня создать для них веб-сайт с очень удобным для пользователя способом обновления контента.Они хорошо знакомы с WordPress и выразили заинтересованность в возможности использовать интерфейс WordPress для обновления своего контента.

Первоначально я намеревался создать для них простую страницу администратора, где они могли бы создавать посты или добавлять другие типы контента ... но похоже, что WordPress уже имеет большую часть функциональности.

Основная проблема в том, что я разработчик RoR.Я предпочитаю использовать haml для каждого, что я делаю, и на 100% полностью контролирую работу сайта.

Так что я надеялся, что у кого-нибудь появится идея, как я мог бы построить сайт, используя rails и haml, но все же разрешить моему клиенту обновляться с использованием WordPress.Я подумал, может быть, я смогу получить доступ к API WordPress, и просто вытащить контент и отобразить его так, как я хочу?или, может быть, я должен пойти с другой CMS .. как Нефтеперерабатывающий завод ?

Честно говоря, я действительно не хочу касаться PHP, и желательно использовать haml, а не html.O_o

Ответы [ 6 ]

21 голосов
/ 01 августа 2012

Это, кажется, работает для меня (я загружаю из Wordpress в качестве вторичной базы данных, следовательно, establish_connection() вызывает и переопределяет table_name. Это должно пройти большую часть пути, предоставляя вам доступ к данным Wordpress какОбъекты ActiveRecord. Я еще не написал оболочку для Posts (WPPost), чтобы сделать их немного более удобными для пользователя с точки зрения API, но это должно хорошо работать для отображения Wordpress на основе 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

Затем я оборачиваю категорию в простой объект 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 (убедитесь, что ваш пользователь БД имеет доступ только для чтения к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
10 голосов
/ 03 июля 2013

В Музее современного искусства был создан плагин WordPress JSON API, созданный именно для этой цели: https://github.com/dphiffer/wp-json-api

Это позволило им создать интерфейсный слой на основе RoR, одновременно поддерживая управляемый WordPress back-Конечный слой.

4 голосов
/ 03 июня 2017

Старые ответы больше не актуальны.WordPress теперь предоставляет API отдыха, доступ к которому можно получить здесь: https://developer.wordpress.org/rest-api/

1) Возможно, вы захотите интегрировать всю маршрутизацию (взяв «слаг» из статей) в своем приложении rails для обслуживания статейправильно и подарите им красивый вид "шоу".

2) Если вы хотите хранить данные в системе rails (например, для маршрутизации и увеличения скорости), вы можете создать таблицу базы данных с именем wp_articles, просто прочитать полный список статей или обновить соответствующие статьи, а затем представить иханалогично вашему обычному коду.

Я посмотрел на необработанный гем MOMA (больше не требуется, не поддерживается), проверил приведенный выше ответ с прямым доступом к базе данных (огромные усилия, медленнее, устаревшие) и прочитало небольшом сложном решении на основе прямого javascript здесь (http://marydickson.com/how-to-use-the-wordpress-rest-api-in-rails/),, но я думаю, что просто скопировать соответствующую информацию в вашу систему и затем представить ее с нормальным процессом MVC - самый простой способ.

Недостатки:Некоторые дополнительные WP-плагины предоставляют больше полей базы данных и другую информацию, и неясно, всегда ли вы можете получить к ним доступ через API. Поэтому у вас может быть слегка ограниченная функциональность.

2 голосов
/ 14 февраля 2012

Вы можете установить Wordpress, затем воспроизвести базу данных wordpress как Model s и добавить ассоциации, как Wordpress использует их. Тогда вы сможете получить доступ к данным, используя рельсы, которые были введены в интерфейсе WordPress. Я делал что-то подобное в прошлом, но не как постоянное решение, а как источник данных для перехода на другое решение. Это возможно, это не приятно, но это работает.

Но один вопрос: почему вы используете WordPress для чего-то недостаточно мощного ?! Это CMS, а не основа для сложных задач. Если он не соответствует потребностям клиента, его просто не стоит использовать. Вы могли бы скорее создать подобный графический интерфейс, используя рельсы, а затем возиться с WordPress.

1 голос
/ 14 февраля 2012

Что касается HAML, вы все равно можете написать свои представления в haml, а затем использовать haml input.haml output.html в командной строке. Немного скучно, но вам не нужно писать html.

0 голосов
/ 27 сентября 2018

используйте MAMP и установите WordPress. откройте страницу в вашем localhost. Затем вы можете использовать инструмент Firefox, чтобы увидеть HTML-код.

...