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

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

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

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

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

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


person BananaNeil    schedule 14.02.2012    source источник
comment
Пожалуйста, не собирайте что-то, пытаясь объединить то, что вам нравится, с тем, что хочет ваш клиент, что какому-нибудь бедному будущему сопровождающему придется расшифровывать...   -  person Michael Berkowski    schedule 14.02.2012
comment
Используйте Вордпресс. Нет смысла изобретать велосипед. Свободное время позволит вам заняться другими проектами, над которыми вы МОЖЕТЕ работать в предпочитаемой вами среде.   -  person MunkiPhD    schedule 14.02.2012
comment
Ты молоток, а это не гвоздь. Бывают моменты, когда приходится говорить клиентам, что я не подхожу для этой работы. Вы по-прежнему можете участвовать в проекте, помогая им конкретизировать требования к проекту, и вы можете помочь им найти компетентного специалиста по PHP. Однако мысль собрать воедино какой-нибудь ужасный франкенштейновский сайт RoR/Wordpress заставляет меня содрогнуться.   -  person Marc Talbot    schedule 14.02.2012


Ответы (6)


Старые ответы больше не актуальны. WordPress теперь предоставляет Rest 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. Таким образом, у вас может быть немного ограниченная функциональность.

person Michael Schmitz    schedule 03.06.2017
comment
Большое спасибо за то, что помогаете поддерживать этот вопрос в актуальном состоянии. - person BananaNeil; 06.06.2017
comment
Является ли этот подход лучше, чем прямой доступ к базе данных WP и создание для них моделей/контроллеров? Или это уже невозможно? - person Fahmiin; 15.09.2020
comment
У вас, вероятно, будет более чистое решение, если вы получите прямой доступ к базе данных WP, если это единственное, что делает ваше приложение. В моем случае это было смешано с другим проектом, и я хотел, чтобы все было по отдельности. Удачи. - person Michael Schmitz; 16.09.2020

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

Затем я заключаю категорию в простой рубиновый объект, упрощающий доступ к данным:

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, чтобы избежать каких-либо сбоев 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
person Ari Gesher    schedule 01.08.2012
comment
Вау, у вас есть где-нибудь подробное руководство по этому поводу. Спасибо. - person mysticalghoul; 02.08.2018

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

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

person Kevin C.    schedule 03.07.2013

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

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

person davidb    schedule 14.02.2012
comment
Вы знаете, где я мог бы найти больше информации об этом? Например, какие модели они используют и каковы их отношения. - person BananaNeil; 16.02.2012
comment
Вы должны перевернуть двигатель! Используйте консоль mysql, используя show tablesи show columns from table_name, чтобы разделить их таблицы и поля. Но, как я уже сказал, это плохой стиль... - person davidb; 16.02.2012

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

person ksol    schedule 14.02.2012

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

person nana    schedule 27.09.2018