16

Tôi có một khách hàng đã yêu cầu tôi xây dựng cho họ một trang web với cách rất thân thiện để cập nhật nội dung. Họ đã thể hiện sự quen thuộc với wordpress, và bày tỏ sự quan tâm đến việc có thể sử dụng wordpress front-end để cập nhật nội dung của họ. Tôi đã có ý định xây dựng cho họ một trang quản trị đơn giản, nơi họ có thể tạo bài đăng hoặc thêm các loại nội dung khác .. nhưng có vẻ như wordpress có hầu hết các chức năng đã có sẵn.Tích hợp Ruby on Rails Với Wordpress

Vấn đề chính là tôi là nhà phát triển RoR. Tôi thích sử dụng haml cho mọi thứ tôi làm và có toàn quyền kiểm soát 100% cách trang web hoạt động.

Vì vậy, tôi đã hy vọng một người nào đó sẽ có ý tưởng về cách tôi vẫn có thể xây dựng trang web bằng cách sử dụng đường ray và haml, nhưng vẫn cho phép khách hàng của tôi cập nhật bằng cách sử dụng wordpress. Tôi nghĩ có lẽ tôi có thể truy cập api wordpress, và chỉ cần kéo nội dung và hiển thị nó theo cách tôi muốn? hoặc có lẽ tôi nên đi với một CMS khác .. như Refinery?

Thành thật mà nói, tôi thực sự không muốn phải chạm vào PHP, và tốt nhất là sử dụng haml, thay vì html. O_o

+7

Xin vui lòng không gắn kết với nhau một cái gì đó cố gắng để kết hợp những gì bạn _like_ với những gì khách hàng của bạn _wants_, rằng một số người duy trì tương lai nghèo sẽ phải giải mã ... –

+3

Sử dụng WordPress. Không có ý nghĩa trong việc phát minh lại bánh xe. Thời gian miễn phí sẽ cho phép bạn nhận các dự án khác mà bạn CÓ THỂ làm việc trong môi trường ưa thích của mình. – MunkiPhD

+6

Bạn là một cái búa, và đây không phải là một cái đinh. Có những lúc bạn phải nói với khách hàng "Tôi không phải là người thích hợp cho công việc này". Bạn vẫn có thể tham gia vào dự án khi bạn giúp họ xác định các yêu cầu cho dự án và bạn có thể giúp họ tìm được một người có thẩm quyền PHP. Tuy nhiên, ý tưởng trộn lẫn với nhau một số trang web RoR/Wordpress Frankenstinian khủng khiếp khiến tôi rùng mình. –

Trả lời

3

Câu trả lời cũ hơn không còn liên quan nữa.WordPress giờ đây cung cấp một API Rest có thể được truy cập tại đây: https://developer.wordpress.org/rest-api/

1) Bạn có thể muốn tích hợp tất cả định tuyến (bằng cách lấy "slug" từ bài viết) trong ứng dụng đường ray của bạn để phân phối các bài viết một cách chính xác và hiện tại chúng với chế độ xem "hiển thị" đẹp mắt.

2) Nếu bạn muốn lưu trữ dữ liệu trong hệ thống đường ray (ví dụ để định tuyến và tăng tốc độ), bạn có thể tạo bảng cơ sở dữ liệu có tên wp_articles, chỉ cần đọc toàn bộ danh sách bài viết hoặc cập nhật các bài báo có liên quan. mã bình thường của bạn.

Tôi đã xem xét đá quý MOMA không duy trì (không cần nữa, không được duy trì), kiểm tra câu trả lời ở trên với truy cập cơ sở dữ liệu trực tiếp (nỗ lực lớn, chậm, lỗi thời) và đọc về giải pháp dựa trên javascript trực tiếp phức tạp slighlty ở đây (http://marydickson.com/how-to-use-the-wordpress-rest-api-in-rails/), nhưng tôi nghĩ rằng chỉ cần sao chép các thông tin có liên quan vào hệ thống của bạn và sau đó trình bày chúng với quá trình MVC bình thường là cách dễ nhất.

Nhược điểm: Một số bổ sung WP-Plugins cung cấp thêm các trường cơ sở dữ liệu và thông tin khác và không rõ liệu bạn luôn có thể truy cập chúng thông qua API. Vì vậy, bạn có thể có chức năng giới hạn một chút.

+0

Cảm ơn bạn rất nhiều vì đã giúp giữ cho câu hỏi này được cập nhật. – BananaNeil

2

Bạn có thể cài đặt Wordpress sau đó sao chép cơ sở dữ liệu wordpress dưới dạng Model và thêm các liên kết như wordpress sử dụng chúng. Sau đó, bạn sẽ có thể truy cập dữ liệu bằng cách sử dụng đường ray đã được nhập vào lối vào wordpress. Tôi đã làm một cái gì đó như thế này trong quá khứ nhưng không phải là một giải pháp lâu dài mà là một nguồn dữ liệu để di chuyển sang một giải pháp khác. Có thể, nó không đẹp nhưng nó hoạt động.

Nhưng một câu hỏi: Tại sao bạn sử dụng wordpress cho một điều nó không đủ mạnh?! CMS của nó không phải là một khuôn khổ cho các nhiệm vụ đầy thử thách. Nếu nó không phù hợp với nhu cầu của costumer của nó chỉ đơn giản là không phải là điều đúng để sử dụng. Bạn có thể thay vì xây dựng một GUI tương tự bằng cách sử dụng đường ray sau đó fiddling với wordpress.

+0

Bạn có biết nơi tôi có thể tìm thêm thông tin về điều này không? Giống như mô hình thực tế họ sử dụng và quan hệ của họ là gì. – BananaNeil

+0

Bạn phải đảo ngược động cơ đó! Sử dụng bảng điều khiển mysql bằng cách sử dụng 'show tables' và' hiển thị các cột từ table_name' để khử các bảng và trường của chúng. Nhưng như tôi đã nói kiểu xấu của nó ... – davidb

1

Liên quan đến HAML, bạn vẫn có thể viết chế độ xem của mình trong haml, sau đó sử dụng haml input.haml output.html trên dòng lệnh. Một chút nhàm chán, nhưng bạn không cần phải viết html.

18

Điều này dường như đang hoạt động đối với tôi (tôi đang tải từ Wordpress làm cơ sở dữ liệu thứ cấp, do đó các cuộc gọi establish_connection() và ghi đè table_name. Điều này sẽ nhận được hầu hết mọi cách, cho phép bạn truy cập vào dữ liệu Wordpress dưới dạng đối tượng ActiveRecord. tôi vẫn chưa viết các wrapper xung quanh bài viết (WPPost) để làm cho họ thân thiện với người sử dụng hơn một chút từ một góc độ API, nhưng điều này nên làm việc tốt cho Rails dựa trên hiển thị dữ liệu Wordpress.

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 

sau đó tôi quấn lên danh mục trong một đối tượng ruby ​​đơn giản giúp truy cập dữ liệu dễ dàng:

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 

Dưới đây là database.yml của tôi (chắc chắn rằng người dùng db của bạn đã truy cập chỉ đọc vào db wordpress để tránh bất kỳ rủi ro 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 
9

Bảo tàng Nghệ thuật Hiện đại đã có một API WordPress JSON plugin được xây dựng cho mục đích chính xác này: https://github.com/dphiffer/wp-json-api

Điều này cho phép họ tạo lớp front-end dựa trên RoR trong khi vẫn duy trì lớp back-end của WordPress.