Интеграция Ruby on Rails с Wordpress
У меня есть клиент, который попросил меня создать им сайт с очень удобным для пользователя способом обновления контента. Они выразили знакомство с wordpress и выразили заинтересованность в возможности использования wordpress front-end для обновления своего контента.
Я изначально собирался создать им простую страницу администратора, где они могут создавать сообщения или добавлять другие типы контента.. но похоже, что Wordpress имеет большую часть уже существующих функций.
Основная проблема заключается в том, что я разработчик RoR. Я предпочитаю использовать haml для каждой вещи, которую я делаю, и на 100% полный контроль над тем, как работает сайт.
Итак, я надеялся, что кто-то там будет иметь представление о том, как я смогу построить сайт, используя рельсы и haml, но все же разрешу моему клиенту обновлять с помощью Wordpress. Я думал, может быть, я могу получить доступ к wordpress api, и просто вытащить контент и отобразить его так, как я хочу? или, может быть, я должен пойти с другим CMS.. вроде Refinery?
Честно говоря, я просто действительно не хочу прикоснуться к PHP, и желательно использовать haml, а не html. O_o
Ответы
Ответ 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.