Dovrei usare tipi di post personalizzati o tabelle di database personalizzate per lo sviluppo di plugin?


38

Sono abbastanza nuovo a scrivere plugin per wordpress, ma ho già fatto un salto nel profondo e voglio assicurarmi di farlo "bene" sul mio grande progetto in arrivo.

Estenderò pesantemente WordPress in un'app Web piuttosto grande e voglio mantenere le mie strutture di dati il ​​più native possibile per fare affidamento sul framework Wordpress, ma non so se sia meglio creare le mie tabelle di database personalizzate o prova a utilizzare tipi di post personalizzati.

Non conosco ancora tutti i miei dati, ma ci saranno un certo numero di tabelle (o cpt) collegate relazionalmente. Ricevo la "vibrazione" dalla mia ricerca che avrei dovuto evitare tabelle di database personalizzate, ma non sono sicuro di come determinare la soluzione migliore.

In particolare sono preoccupato per tre aree:

  • il numero di meta-campi post che mi serviranno per i miei campi extra per cpt se seguo quella strada e se ciò renderà le cose "difficili"
  • quanto riesco a recuperare le query utilizzando filtri relazionali semi complessi per i report
  • come gestire al meglio le relazioni, soprattutto se ho molte o molte relazioni

C'è un modo "giusto"? Grazie per il tuo contributo.

Risposte:


59

Dovresti essere scettico nei confronti di chiunque affermi che esiste un solo modo "giusto". Il modo giusto dipende dalla situazione. L'uso dell'infrastruttura CPT ha una serie di notevoli vantaggi:

  • Ottieni l'interfaccia utente Dashboard gratuitamente
  • Sfrutta automaticamente la memorizzazione nella cache di WP, inclusi eventuali plug-in di cache persistenti che l'installazione potrebbe utilizzare
  • Ottieni automaticamente chicche come le revisioni post
  • Ottieni l'accesso alla WP_Queryclasse, il che significa che, in teoria, non devi scrivere alcun SQL (o almeno non molto) probabile che sia buggy-e-vulnerabile-e-inefficiente
  • Se stai pensando di distribuire il plug-in o aprirlo per lo sviluppo open source, potresti scoprire che gli sviluppatori sono più a loro agio nell'utilizzare i tipi di post personalizzati e le funzioni API associate rispetto ai tuoi contenuti personalizzati

I problemi con l'API CPT derivano principalmente dal fatto che è fortemente sposato con la metafora dei "post" e con tutti gli aspetti di quel tipo di dati che accompagnano la metafora. Dalla riga di comando di MySQL, esegui DESCRIBE wp_posts. WP presume che il tuo contenuto abbia un titolo, che abbia un (singolo) autore, che devi solo tenere traccia della data di creazione e della data dell'ultima modifica, che avrai bisogno di spazio per un non indicizzato post_content, ecc. Funziona bene per alcuni tipi di contenuti, ma non necessariamente per altri. Hai già indicato la direzione di alcuni potenziali problemi:

il numero di meta-campi post che mi serviranno per i miei campi extra per cpt se seguo quella strada e se ciò renderà le cose "difficili"

Esistono due modi per aumentare lo wp_postsschema tramite l'API CPT: postmeta e tassonomie. Postmeta è coppie chiave-valore non indicizzate, il che è ottimo per archiviare un sacco di dati vari, ma per nulla ottimizzato per fare ricerche complesse. Le tassonomie sono in qualche modo più flessibili in questo senso, ma dovrai comunque affrontare molte sottoquery potenzialmente costose se hai ricerche molto complesse. (I meta_querye le tax_queryargomentazioni e le loro classi costruttore di query sono molto bello e pratico, però.)

Se, come suggerisci, hai solo bisogno di fare questo tipo di "filtri relazionali semi complessi" nel caso di report occasionali, allora questa architettura è probabilmente OK per te. È quando inizi a esporre i filtri agli utenti, in modo da dover eseguire molte JOINs e sottoquery complesse per tutto il tempo, che le cose sfuggono di mano rapidamente.

come gestire al meglio le relazioni, soprattutto se ho molte o molte relazioni

Le relazioni molti-a-molti sono un punto critico di lunga data nella comunità degli sviluppatori WP (vedi https://core.trac.wordpress.org/ticket/14513 ). Puoi simularlo senza usare le tabelle personalizzate mappando gli elementi della tassonomia su post_ids (in modo che, ad esempio, puoi dire che 'P3 ha la relazione da Y a P5' dicendo che P3 ha il tag 'Y-P3') ma questo diventa confuso (e inefficiente) molto rapidamente. Puoi anche prendere in considerazione la possibilità di creare la tua tabella delle relazioni che collega insieme i CPT: otterrai comunque il vantaggio dei CPT e creerai solo una singola tabella DB. Per una versione ben eseguita di questo metodo, consultare il plugin Posts 2 Posts: https://wordpress.org/extend/plugins/posts-to-posts/

Quindi, alla fine, dovresti decidere in base a:

  • Il tipo (i) di dati che memorizzerai - come "post" sono
  • Il tipo di query che saranno richieste - quanto saranno complesse
  • Scala: quanto è complesso lo schema desiderato, quanti oggetti totali avrai e quanti utenti prevedi

Se le risposte sono: molto posty, non troppo complesse e non devono essere ridimensionate in modo enorme, vai con i CPT. Altrimenti considera i tuoi tavoli.


3
Riepilogo eccellente.
JCL1178,

1
raddoppiare quello. ben risposto +1
kaiser

Caspita, ottima risposta Boone, grazie! Molto ben informato e ben spiegato, con una lista di controllo riassuntiva molto pratica. Penso che questo mi dia la direzione di cui ho bisogno. Forse posso personalizzare alcuni dei miei oggetti e altri. Stavo considerando anche la tabella delle relazioni in stile post 2 post per ottenere il meglio da entrambi i mondi. E anche il tuo suggerimento meta_querysull'arg è fantastico!
Jeff,

2
Questa serie di Pippin Williamson merita sicuramente una lettura se stai considerando tavoli personalizzati: pippinsplugins.com/series/building-a-database-abstraction-layer
Travis Northcutt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.