16

Ho un cliente che mi ha chiesto di costruirgli un sito Web con un modo molto semplice per aggiornare i contenuti. Hanno espresso familiarità con wordpress e hanno espresso interesse a poter utilizzare il frontpress di wordpress per aggiornare il loro contenuto.Integrazione di Ruby on Rails con Wordpress

Inizialmente avevo intenzione di crearli una semplice pagina di amministrazione, in cui possono creare post o aggiungere altri tipi di contenuto .. ma sembra che wordpress abbia già la maggior parte delle funzionalità già in atto.

Il problema principale è che sono uno sviluppatore RoR. Preferisco usare haml per ogni cosa che faccio e avere il 100% di controllo totale su come funziona il sito.

Quindi speravo che qualcuno là fuori avesse un'idea di un modo in cui potevo ancora costruire il sito usando i binari e l'haml, ma permetto comunque al mio cliente di aggiornare usando wordpress. Ho pensato che forse potevo accedere all'API wordpress, e solo tirare il contenuto e visualizzarlo nel modo in cui voglio? o forse dovrei andare con un altro CMS .. come Refinery?

Onestamente, non desidero davvero dover toccare PHP, e preferibilmente usare haml, piuttosto che html. O_o

+7

Si prega di non accoppiare insieme qualcosa che tenta di combinare ciò che si _like_ con ciò che il cliente _ desidera_, che un povero futuro manutentore dovrà decodificare ... –

+3

Utilizzare WordPress. Non ha senso reinventare la ruota. Il tempo libero ti consentirà di raccogliere altri progetti in cui puoi lavorare nel tuo ambiente preferito. – MunkiPhD

+6

Sei un martello e questo non è un chiodo. Ci sono volte in cui devi dire ai clienti "Non sono il tipo giusto per questo lavoro". Potresti comunque essere coinvolto nel progetto mentre aiuti a concretizzare i requisiti per il progetto e potresti aiutarli a trovare un ragazzo PHP competente. Tuttavia, l'idea di mettere insieme un orribile sito RoR/Wordpress di Frankenstinian mi fa rabbrividire. –

risposta

3

Le risposte precedenti non sono più pertinenti.WordPress offre ora un'API REST che può essere letta qui: https://developer.wordpress.org/rest-api/

1) probabilmente si vuole integrare tutti instradamento (prendendo la "lumaca" dagli articoli) nelle rotaie app per servire correttamente e presentare gli articoli li con una bella vista "spettacolo".

2) Se si desidera memorizzare i dati nel sistema di rotaie (ad esempio per il routing e aumentare la velocità) è possibile creare una tabella di database chiamata wp_articles, leggere semplicemente l'elenco completo dell'articolo o aggiornare gli articoli pertinenti, quindi presentarli come il tuo codice normale

Ho esaminato la gemma MOMA non gestita (non più richiesta, non gestita), ho controllato la risposta di cui sopra con accesso diretto al database (enorme sforzo, più lento, obsoleto) e ho letto su una semplice soluzione diretta basata su javascript qui (http://marydickson.com/how-to-use-the-wordpress-rest-api-in-rails/), ma penso che copiare semplicemente le informazioni rilevanti nel sistema e presentarle con il normale processo MVC sia il modo più semplice.

Svantaggi: alcuni WP-Plugin aggiuntivi forniscono più campi di database e altre informazioni e non è chiaro se sia sempre possibile accedervi tramite l'API. Quindi potresti avere una funzionalità leggermente limitata.

+0

Grazie mille per aver contribuito a mantenere questa domanda aggiornata. – BananaNeil

2

È possibile installare Wordpress, quindi riprodurre il database wordpress come Model s e aggiungere le associazioni come wordpress li utilizza. Quindi sarete in grado di accedere ai dati usando i binari che sono stati inseriti nel frontend di wordpress. Ho fatto qualcosa di simile in passato ma non come soluzione permanente ma come fonte di dati per la migrazione a un'altra soluzione. È possibile, non è bello ma funziona.

Ma una domanda: perché stai usando wordpress per una cosa non abbastanza potente ?! È un CMS non una struttura per compiti impegnativi. Se non si adatta alle esigenze del cliente, semplicemente non è la cosa giusta da usare. Potresti piuttosto costruire una GUI simile usando le rotaie e poi giocherellare con wordpress.

+0

Sai dove potrei trovare più informazioni a riguardo? Come quello che usano i modelli reali e quali sono le loro relazioni. – BananaNeil

+0

Devi invertire il motore! Usa la console mysql usando 'mostra le tabelle'e' mostra le colonne da table_name' a demitatore quali sono le loro tabelle e i loro campi. Ma come ho detto il suo cattivo stile ... – davidb

1

Per quanto riguarda HAML, è ancora possibile scrivere le viste in haml, quindi utilizzare haml input.haml output.html nella riga di comando. Un po 'noioso, ma non devi scrivere html.

18

Questo sembra funzionare per me (sto caricando da Wordpress come database secondario, quindi le establish_connection() chiamate e prioritario table_name. Questo dovrebbe ottenere la maggior parte del tragitto, che vi dà accesso ai dati Wordpress come oggetti ActiveRecord. Display non ho ancora scritto il wrapper Post (WPPost) per renderli un po 'più facile da usare dal punto di vista API, ma questo dovrebbe funzionare bene per Rails-based dei dati di 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 

ho poi avvolgere la categoria in un oggetto rubino semplice che facilita l'accesso ai dati:

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 

Ecco la mia database.yml (assicurarsi che l'utente db ha accesso in sola lettura al db wordpress per evitare eventuali contrattempi 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

Il Museum of Modern Art ha avuto un API JSON WordPress plug-in costruito per questo scopo: https://github.com/dphiffer/wp-json-api

Ciò ha permesso loro di creare un front-end layer basato su RoR mantenendo uno strato back-end basato su WordPress.