Come sovrascrivere la funzione innestabile nel tema?


10

Tutta la documentazione che ho incontrato parla della sostituzione delle funzioni collegabili tramite il tuo plugin.

E se invece stai facendo lo sviluppo del tema?

My funziona.php richiede un altro file che sovrascrive la get_user_by()funzione, definita in pluggable.php.

Se ometto la if( function_exists() )chiamata viene visualizzato l'errore "Impossibile ripetere ...".

Se includo la if( function exists() )chiamata, non ricevo alcun errore, ma ovviamente la mia funzione viene quindi ignorata, poiché esiste la versione collegabile.

Sulla base del fantastico post di Dominic sull'ordine di avvio di WordPress , è chiaro che pluggable.phpviene caricato prima del tema functions.phpe così via, quindi ciò spiega l'errore.

Quindi la domanda è: come puoi trarre vantaggio da quella bella architettura collegabile all'interno di un tema, senza ricorrere alla scrittura di plugin che devono quindi essere raggruppati o installati con il tema?

Ulteriori note : Quindi sembra che l'argomento sia che i temi non dovrebbero cercare di fare ciò che fanno i plugin. Ma quell'argomento ha più di quattro anni (secondo il numero di trac di 4 cifre). Mi piacerebbe molto sapere da alcuni esperti che questa filosofia si applica ancora, vista la complessa topologia del panorama di sviluppo dei temi di oggi. Mi piacerebbe credere che ci siamo evoluti da allora.

Contesto : sto sviluppando una soluzione CMS unica per un cliente, con molti metadati personalizzati, personalizzazione del back-end di amministrazione, il processo di accesso / autenticazione, i lavori. E, naturalmente, c'è la componente di design -. Che è dove la parte tema viene fornito è infatti, questi sono semplicemente non componenti riutilizzabili - non potranno mai applicarsi a un altro cliente, non potranno mai essere messi sotto licenza GPL e open source, e sono la maggior parte certamente non essere distribuito / installato su altre distribuzioni WordPress. Nel migliore dei casi ci sono alcune buone pratiche che farò leva su progetti futuri, ma che sarà strettamente un lavoro di riferimento / copia-incolla.

Per me questo non sembra un caso d'uso per i plugin. Il tema è installato, forse un tema figlio di Twenty Eleven, forse uno standalone, le sue funzioni.php chiama in un carico di inclusioni, ognuna delle quali gestisce un aspetto diverso del CMS in questione. Quindi i file del modello del tema utilizzano "tag modello" personalizzati definiti nelle inclusioni. Non voglio avere file di temi con dipendenze da alcuni plugin o altri attivati, ecc. Non ha senso costruire complessità nel sistema. Certo, posso metterlo nella cartella dei plug-in indispensabili, ma sembra ancora un hack - in questo momento, tutto ciò che ha a che fare con le personalizzazioni fatte per questo progetto è contenuto wp-content/themes/my-theme/. Non voglio nemmeno prendere in considerazione la ricerca di cose anche in alcune cartelle di plugin.

Non fraintendetemi. Adoro i plugin e li uso e li scrivo. E io uso i plugin insieme a questo tipo di sviluppo di temi altamente personalizzati quando il plugin è di terze parti e rappresenta le migliori pratiche ben oltre ciò che potrei eventualmente implementare in un lasso di tempo ragionevole. Ma quando ho bisogno di modificare le funzionalità di base per uno scenario unico, mi rivolgo a hook di azione, hook di filtro e mi piacerebbe poter fare affidamento su funzioni collegabili per l'utente e anche dal lato dell'autenticazione.


Per Pentecoste, ho riaperto core.trac.wordpress.org/ticket/2479
Tom Auger,

Per Pentecoste, il biglietto fu chiuso di nuovo, con una buona spiegazione del perché.
Tom Auger,

Risposte:


10

Se lo stai costruendo per un singolo client, dovresti assolutamente trarne vantaggio mu-plugins.

Ci sono molte cose in WordPress che non puoi fare functions.php. Le funzioni innestabili sono una di queste, ma più ovvia, un certo numero di hook (sia azioni che filtri) sparano prima functions.php. In alcuni casi, questi hook si mu-pluginsattivano anche prima dei normali plug-in, che quindi richiedono l'uso o un plug-in attivato dalla rete. In altri casi, anche un mu-plugin è troppo tardi. Forse hai bisogno di qualcosa dentro sunrise.php. O anche qualcosa (una costante o altro) in wp-config.php.

Preferirei aggiungere alcuni hook alle funzioni collegabili, piuttosto che rendere più semplice la loro sostituzione. Probabilmente non avremo mai più un'altra funzione innestabile: pre-datano gli hook e non ho quasi mai visto una situazione in cui vi siano vantaggi rispetto a un buon hook vecchio stile (nuovo stile?).

Sono ancora d'accordo, sei anni dopo, con Andy Skelton - "Ci sono molte differenze tra il file delle funzioni di un tema e un plugin. Continuiamo così".

A parte questo, un cambiamento come questo non potrebbe mai accadere. Romperebbe molte cose. Innumerevoli temi che richiamano funzioni nel corpo di functions.phpquesto comporterebbero un errore fatale se pluggable.phpnon fossero già stati caricati, ad esempio current_user_can()o wp_create_nonce(). Tutti fallirebbero. E romperebbe anche i plugin, che normalmente potrebbero iniziare a richiamare queste funzioni plugins_loaded. (Basta spostarsi pluggable.phppiù in basso wp-settings.phpe scommetto che metà del core si spezzerebbe - o per lo meno, il personalizzatore lo farebbe.)

Infine, c'è l'inevitabile idea che un tema possa includere un file separato come pluggable.phpquello che potremmo caricare non appena cariciamo i plugin, e quindi potrebbe ignorare le funzioni collegabili. A parte questo essere una cattiva idea (vedi i primi quattro paragrafi di questo commento), non sarebbe ancora compatibile, perché fino al setup_themegancio, si potrebbe ignorare quale tema deve essere caricato filtrando i valori del foglio di stile e del modello.

Sfortunatamente, questo non è sostenibile dato come WordPress è progettato. La cosa buona è che ci sono innumerevoli (migliori) modi per farlo.

(Originariamente pubblicato qui: http://core.trac.wordpress.org/ticket/2479#comment:5 )


Ti ringrazio per aver dedicato del tempo a postare qui la tua risposta. Ora che l'hai spiegato, vedo le cose a modo tuo. Ha senso. Grazie!
Tom Auger,

5

Nel contesto di un progetto unico, è assolutamente opportuno inserire il codice da utilizzare mu-plugins. Se "avere tutto in una volta" è un problema, basta creare un collegamento simbolico nella mu-pluginsdirectory del tema al menu a discesa, in modo che venga visualizzato durante la ricerca nella directory dei temi.


Mark, grazie per il suggerimento sul link simbolico. Sebbene non aiuti con la migrazione, può essere molto conveniente durante lo sviluppo.
Tom Auger,

0

Non riesco a pensare a un modo per farlo, troppo presto nella sequenza di caricamento.

La soluzione più vicina alla normalità sarebbe l'aggiunta di inclusioni personalizzate a wp-config.php(tramite codice o chiedendo all'utente di), ma il confronto con quel plugin di raggruppamento avrebbe probabilmente più senso.


Si, parlamene.
Tom Auger,
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.