Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: BananaNeilОтветов: 6

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

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

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

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

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

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

ruby-on-railswordpressphpcontent-management-systemruby-on-rails-3

Ответы

Ответ 1 · рейтинг 5 · Michael Schmitz

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

Ответ 2 · рейтинг 22 · Ari Gesher

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

Ответ 3 · рейтинг 10 · Kevin C.

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

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

Ответ 4 · рейтинг 2 · davidb

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

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

Ответ 5 · рейтинг 1 · ksol

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

Ответ 6 · рейтинг -1 · nana

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы