Интеграция Ruby on Rails с Wordpress - программирование
Подтвердить что ты не робот

Интеграция Ruby on Rails с Wordpress

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

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

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

Итак, я надеялся, что кто-то там будет иметь представление о том, как я смогу построить сайт, используя рельсы и haml, но все же разрешу моему клиенту обновлять с помощью Wordpress. Я думал, может быть, я могу получить доступ к wordpress api, и просто вытащить контент и отобразить его так, как я хочу? или, может быть, я должен пойти с другим CMS.. вроде Refinery?

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Кажется, это работает для меня (я загружаю из 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(убедитесь, что ваш пользователь 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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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