Dove mettere il mio codice: plugin o Functions.php?


87

Esiste uno schema di facile comprensione per decidere quale tipo di codice appartiene a un plugin o al tema functions.php?

Ci sono molti casi e molti dibattiti su questo argomento, principalmente perché ci sono alcune idee sbagliate sul funzionamento interno di WordPress. Chiedo una risposta basata su fatti, non su opinioni.

Dovrebbe spiegare come gestire questi punti (e probabilmente di più):

Ci sono spesso pro e contro per entrambe le parti. La nostra domanda più popolare La migliore raccolta di codice per il tuo file Functions.php ha ottenuto molti frammenti di codice come risposte che sono almeno discutibili.
Abbiamo bisogno di criteri che un principiante possa capire, forse una lista di controllo - con motivi.

Vedi anche la domanda correlata di Chip Bennett sul nostro meta sito: Domande che richiedono specificamente una soluzione "senza plug-in"

Correlati: dove inserisco i frammenti di codice che ho trovato qui o altrove sul Web?


Mi chiedo cosa costituirebbe un fatto ai fini di questa domanda. La persona A dice CPT andare nel plugin, la persona B dice CPT andare nel tema. Come possiamo procurarci un fatto per convalidare una delle opinioni? Questo potrebbe essere pericolosamente vicino a "non costruttivo".
Rarst

Risposte:


73

Vorrei iniziare con questa domanda: la funzionalità è correlata alla presentazione dei contenuti, o alla generazione / gestione dei contenuti, o del sito o dell'identità dell'utente?

Se la funzionalità non è correlata in modo specifico alla presentazione del contenuto , è direttamente all'interno del Territorio dei Plugin. Questo elenco è lungo:

  • Modifica dei principali filtri WP ( wp_headcontenuto, come collegamenti canonici, generatore e altri meta HTML, ecc
  • Sito Favicon
  • Codici brevi post-contenuto
  • Link per la condivisione di post
  • Script piè di pagina di Google Analytics (e simili)
  • Strumenti / controlli SEO
  • eccetera.

Se la funzionalità è correlata alla presentazione del contenuto , allora è un candidato per essere incluso nel tema. A questo punto, vorrei tornare al criterio di cambio tema @ Raf912 : ti mancherebbe la funzionalità quando cambi tema ? Se la risposta a questa domanda è no , allora la funzionalità appartiene al tema. Qualche esempio:

  • Rimozione / sostituzione del CSS della Galleria principale di WP
  • Filtraggio della lunghezza dell'estratto del messaggio, testo "leggi altro", ecc.
  • Qualsiasi cosa implementata tramite add_theme_support()(suppongo che questo dovrebbe essere ovvio)
  • CSS personalizzato

Normalmente, queste due domande forniranno una linea di differenziazione abbastanza chiara; tuttavia, ci sono eccezioni.

Tipi di post personalizzati

I tipi di post personalizzati, ad esempio, sono un po 'un ibrido univoco di generazione e presentazione del contenuto, dato il modo in cui la gerarchia dei modelli funziona per le pagine di indice di archivio a tipo di singolo post e le pagine di singoli post . L'aspetto generazionale dei contenuti dei CPT li collocherebbe normalmente nel Territorio dei Plugin; tuttavia, i plug-in non possono definire pagine modello che si adattano intrinsecamente al design / layout / stile per un determinato tema (specialmente se il CPT viene visualizzato al di fuori del solito titolo / contenuto / meta o ha tassonomie personalizzate associate).

A lungo termine, la soluzione a questa disparità, IMHO, è quella di avere una convenzione / consenso standard per la definizione di CPT per determinati tipi di contenuto (elenchi immobiliari, eventi di calendario, prodotti di e-commerce, voci di librerie / media, ecc. .). In questo modo, il contenuto generato dall'utente rimarrebbe portatile tra i Temi che implementano la definizione standard / convenzione di un determinato CPT, mentre gli sviluppatori di temi mantengono la flessibilità di definire il design / layout / stile di quel CPT nei file del modello del tema.

Link ai social media

Allo stesso modo, normalmente direi che i collegamenti al profilo dei social media, divenuti quasi onnipresenti nei temi attuali, sono Plugin Territory, perché non hanno nulla a che fare con la presentazione dei contenuti. La soluzione migliore sarebbe quella di definire questi profili da qualche parte nel core; tuttavia, al momento non esiste alcun mezzo standard / consenso per definire questi collegamenti. Sono meglio definiti a livello di impostazione del sito o per utente? Se per utente, quale meta dell'utente viene esposta nel modello? eccetera.

Di nuovo, a lungo termine, la soluzione a questa disparità è che entrambi i core definiscano dove sono definiti questi collegamenti, oppure che la comunità degli sviluppatori di temi sviluppi il proprio consenso. Nel frattempo, non c'è davvero altro che mantenerli definiti all'interno di ciascun tema.


add_theme_support( 'automatic-feed-links' );non è presentativo. Ma è richiesto dalle linee guida del tema . Perché è un rischio necessario perdere questa funzionalità dopo un cambio di tema?
fuxia

1
Tutto ciò che viene implementato tramite add_theme_support()può essere implementato solo tramite il tema. L'uso add_theme_support( 'automatic-feed-links' )all'interno del tema garantisce effettivamente un'esperienza coerente da tema a tema, poiché i collegamenti ai feed generati saranno gli stessi.
Chip Bennett,

4
Penso che sia sbagliato: i link ai feed non sono presentazionali. Se il tema successivo non chiama tale funzione, l'utente perderà i collegamenti ai feed. E puoi aggiungerlo per plugin senza alcun problema. Ecco perché ne sono confuso. :)
fuxia

1
Sai: questo è un buon punto. :)
Chip Bennett,

50

Un semplice test in cui il codice è nella posizione migliore:

  • scrivi il codice in Functions.php
  • cambia tema
  • ti manca la funzionalità, il blog non funziona correttamente o rimangono frammenti del vecchio tema (ad es. codici brevi)?

    • si: inseriscilo in un plugin

    • no: lascialo in Functions.php

Esempi: scrivere un shortcode. Dopo aver cambiato il tema, i semplici codici brevi vengono lasciati nei tuoi post. Quindi sarà meglio inserito in un plugin.

Scrivi una funzione per elencare gli ultimi commenti. Dopo aver cambiato il tema, tutto è ok perché forse l'altro tema ha una funzione equivalente.

Dipende molto dal codice e da cosa farà. Alcuni codici influenzano solo lo stile o il contenuto del tema, altri modificheranno i post del blog.


11
+1 Se il codice è specifico per il tema, mettilo functions.php. Se deve essere applicato a più di un tema, inseriscilo in un plugin.
s_ha_dum,

18

Non credo che ci sia una risposta semplice a questa domanda, ma scommetto che potremmo fare un diagramma di flusso per aiutare con la decisione. Ecco uno schema generale di tale diagramma di flusso, che può e deve essere ampliato. Commenta con suggerimenti!

  • Questo codice deve essere ospitato su un'installazione a sito singolo di WordPress?
    • Sì - Il tema del sito cambia solo con importanti riprogettazioni e cambiamenti di funzionalità?
      • Sì - Il codice in questione è specifico per questo progetto attuale ?
        • Sì: Functions.php
        • No: plug-in
      • No (cambia spesso o per capriccio) - Plugin
    • No (Multsisite): stai ospitando l'installazione su più siti OPPURE è una soluzione su più siti ospitata che consente i plug-in?
      • Sì: la funzionalità in questione è specifica di questo sito o può / dovrebbe essere utilizzata da altri siti della rete?
        • Specifico per questo sito: Functions.php
        • Condiviso tra più siti: vuoi forzarlo su ogni sito?
          • Sì: plug-in, memorizzato nella directory mu-plugins o attivato in rete
          • No: si tratta di una rete di siti non correlati ? (ad es. clienti diversi)
            • Sì: sarebbe male o poco professionale se il client A visualizzasse o attivasse il plug-in che hai scritto per i client B, C e D? (ad esempio, potrebbe interrompere il sito o causare funzionalità indesiderate)
              • Sì: Functions.php
              • No: plug-in
            • No: probabilmente plugin
      • No (ospitato da un servizio come VIP che non consente i plug-in): usa funzioni.php
Alcuni altri pensieri che non sapevo come inserire qui:

  • Temi principali: a volte con funzionalità condivisa sarebbe meglio creare un tema principale e inserire la funzionalità nel file Functions.php del tema principale.
  • Le directory dei plug-in di grandi installazioni multisito possono diventare rapidamente ribelli, quindi a volte le funzionalità condivise utilizzate da una bassa percentuale di siti (ad es. <1%) potrebbero essere duplicate nei file di function.php.

6

Da qui temi VS Plugin

Aggiungi il codice personalizzato a un tema figlio, quindi quando aggiorni il tema principale, il tuo codice personalizzato non viene perso.

Puoi anche creare un plug-in specifico per il sito che contenga anche tutto il tuo codice personalizzato.

Per quanto riguarda la scrittura di codice rispetto a plug-in, è possibile utilizzare plug-in e le funzioni tuttavia per la maggior parte di ciò che si desidera, la codifica manuale è la migliore in quanto è più facile da modificare, tranne in alcuni casi come meta-box in cui è possibile prendere in considerazione l'utilizzo di un plug-in a meno che sei uno sviluppatore di temi.

 function modify_contact_methods($profile_fields) {

// Add new fields
$profile_fields['twitter'] = 'Twitter Username';
$profile_fields['facebook'] = 'Facebook URL';
$profile_fields['gplus'] = 'Google+ URL';

return $profile_fields;
}
add_filter('user_contactmethods', 'modify_contact_methods');

http://codex.wordpress.org/Plugin_API/Filter_Reference/user_contactmethods

  1. Aggiungi nuovo tipo di post personalizzato - Codice
  2. Aggiungi nuovi campi agli Utenti - Codice sopra
  3. Aggiungi nuovi widget - Codice
  4. Aggiungi permalink personalizzati - Impostazioni permalink di WordPress

5

So che questo è un cavallo morto e che Chip l'ha praticamente coperto, ma voleva aggiungere qualche pensiero.

Se fai una programmazione vivente e ti ritrovi a lavorare su siti wordpress con scadenze, scoprirai che arriva davvero al momento giusto.

Molto spesso, specialmente per quelli che hanno appena iniziato, è molto più veloce e più semplice aggiungere tutto ciò di cui hai bisogno in un tema e chiamarlo fatto.

Detto questo, se lavori su wordpress su base semi regolare, dovresti seriamente considerare di fare quanto segue :


  1. Costruisci uno scheletro di plugin

Questo dovrebbe gestire tutto ciò che è comunemente necessario fare con un plugin, tra cui l'attivazione, la disattivazione, l'aggiornamento della versione, la creazione di pannelli di amministrazione e la disinstallazione.

Se ti prendi il tempo per farlo, troverai:

  • Non ci vuole più molto tempo extra per aggiungere funzionalità tramite plugin
  • Puoi iniziare a creare un solido elenco di plug-in da riutilizzare su altri progetti in base alle esigenze, risparmiando molto tempo nel lungo periodo.
  • Puoi renderli pubblicamente disponibili se desideri maggiore visibilità

Ora puoi costruire le cose correttamente e portare a termine i progetti futuri più rapidamente.


  1. Costruisci uno scheletro a tema

Questo dovrebbe gestire tutto ciò che è comunemente necessario in un tema:

  • Un foglio di stile principale contenente gli stili che usi comunemente (ripristini, ecc.)
  • Un file index.php corretto, che gestisce tutto il necessario per qualsiasi modello
  • Un file Functions.php: non lo userai quasi altrettanto, ma sarà comunque utile.

Una volta fatto ciò, costruisci uno scheletro a tema figlio che utilizza il tuo tema principale.

  • Aggiungi il foglio di stile, facendo riferimento al tema principale.
  • Aggiungi il file Functions.php

Una volta che hai fatto queste due cose, la creazione di nuovi siti per le persone diventa molto più veloce.


Se fai quanto sopra, puoi quindi lavorare su quanto segue:

  • Trascorri il tuo nuovo tempo libero trovato, acquisendo maggiore familiarità con PHP, WordPress, JavaScript, CSS e / o mySQL ... più ne impari e più velocemente farai le cose.
  • Aggiorna il tuo plugin, tema e scheletri di temi figlio quando trovi cose che dovresti migliorare. Non importa quanto tu sia bravo, se continui ad imparare troverai miglioramenti da apportare.

E, se fai tutto quanto sopra , scoprirai che la risposta di Chip non sarà solo l'ideale, ma diventerà ottimale.


3

La semplice risposta è questa ...

Il codice dipende da una qualsiasi delle funzionalità integrate in un tema specifico? Se sì, inserisci un tema.

Vuoi che questo codice sia trasferibile tra i siti e tra i temi? Se sì, inserisci un plugin.

Se la risposta è no a entrambe le precedenti, allora immagina il sito 5 anni in futuro, quando è il momento di riprogettare. La funzione del codice che stai scrivendo è qualcosa che sopravviverà al prossimo aggiornamento del design? Se sì, inserisci un plugin.

Inoltre, se non stai utilizzando temi figlio e prevedi di aggiornare il tema, ti suggerirei anche di utilizzare un plug-in.

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.