 Ciao a tutti, bellissimo vedere tantissimi vecchi amici e anche spero nuovi. Partiamo un attimo con il nostro talk. Cosa parliamo oggi? I plug-in. Perché un plug-in deve essere estendibile? La nostra filosofia comunque di software libro, noi basiamo basati con questo la GPL su una licenza che ci permette un certo tipo di libertà. Quindi un plug-in che è estendibile, diciamo, rispecchia anche praticamente questa filosofia. Questo come si fa tramite due concetti che sono quello dell'action e del filter. E poi vedremo anche comunque molta, molta, molta pratica. Io sono Matteo, come ha già detto Stefano, sono uno sviluppatore principalmente back-end. Da circa un annetto sto cercando di trasferire plug-in che ho fatto in giro per clienti, per i progetti e spostali sul rep ufficiale. Mi considero un open-source evangelist. C'è nel senso che mi piace rompere le scattole a colleghi superiori eccetera, ma perché non adottiamo questa soluzione rispetto a un'altra? Perché filoticamente è più incline alla condivisione, alla comunità eccetera. Quindi partiamo dall'inizio della nostra storia. È arrivato da me un ragazzo che aveva bisogno di aggiungere una nuova funzionalità nel suo plug-in, cioè nel suo sito internet. Il sito internet era progetto in produzione, aveva già un plug-in che li piaceva tantissimo, era perfetto, però li mancava questo piccolo dettaglio. L'azienda quasi riluppato questo plug-in non era interessata a creare questa funzionalità. Quindi, come ho proceduto? Prima di tutto ho contato la vecchia azienda, perché a volte capita che un cliente ci fa una richiesta. Non è considerata, non c'è nel corde di questo plug-in, però l'azienda mi disponde. Ah, guarda, se la cinquantesima persona che ce la chiede, mi sa che la mettiamo nella prossima release. Purtroppo questa funzionalità non c'era. Non c'era, non era neanche prevista nell'arco di due o tre anni. Quindi ho detto che cosa posso fare? Lavoriamo in GPL, quindi il codice sorgente del plug-in, noi possiamo leggercelo, studiarcelo e decidere un po' cosa fare. Quindi abbiamo studiato, ho visto che il plug-in era fatto molto molto bene, e quindi rimbocchiamoci le mani, studiamo cosa fare e poi scriviamo il nostro codice. Io sono stato fortunato perché questo plug-in era stato fatto a regola d'arte, con i vari hook, con i vari action e i filter, quello che ci permette a noi di poter estendere e poter evolvere il nostro plug-in. Io sono stato fortunato, non tutti i plug-in lo permettono, ma questo talk ci fa vedere un attimo come permettere, cioè dopo che avevamo pubblicato un plug-in, come permettere a tutti gli altri di aggiungere a ci loro necessità. Prima di tutto perché un plug-in deve essere estendibile. Cosa succede? Cosa sarebbe successo se il nostro plug-in non nascia per essere estendibile? Il programmatore che viene dopo può dire che faccio un fork del tuo progetto, quindi far creare un progetto parallelo e creare concorrenza che magari non serve, perché comunque se abbiamo una cosa in comune noi due, eh, c'è bisogno di un'altra funzionalità perché dividerci. Ti do la possibilità di create un tuo plug-in che magari aggiunge con la funzionalità, un esempio magari il più semplice, immaginatevi HuCommerce. HuCommerce non fa tutto, però se noi cerchiamo sul rappo di WordPress for HuCommerce, troviamo tanti piccoli plug-in che aggiungono quelle singole funzionalità che possono servire perché HuCommerce è stato sviluppato con queste metodologie. E poi, come dico sempre, siamo lavorando in open source. Quindi questa slide cerco di infilarcelo ovunque, cioè l'elenco delle quattro libertà principali del software libero, che sono anche sbagliate perché di solito non iniziano con 1, 2, 3, 4, ma con 0, 1, 2, 3 come i nostri array. Quindi un software per definirsi libero deve rispettare queste quattro leggi. Quindi possibilità di utilizzarlo per lo scopo che vogliamo, l'esempio più più comodo è magari HuCommerce, che quante persone lo utilizzano non per vendere prodotti, ma l'hanno modificato aggiormente e diventano un bel catalogo. È l'esempio più semplice. Possibilità di studiarlo. Lavoriamo in PHP, quindi, a meno che qualcuno non ho fuschi il suo codice, noi possiamo prendere, leggerlo riga per riga, capire riga per riga cosa sta succedendo e ci portiamo a casa. Oltre alla conoscenza anche una bella esperienza, capiamo, vediamo la mente di un altro programmatore che ha esperienza, capiamo un attimo cosa ha fatto e magari tra qualche anno quell'idea possiamo sultarla per un altro progetto. La possibilità di modificarlo e di ricondividerlo con le nostre modifiche. Ovviamente, se noi lo modifichiamo e lo condividiamo, c'è il vincolo della GPL che dobbiamo ricondividere con la stessa licenza, o con una licenza, diciamo, della sua famiglia. Ma se noi facciamo un plugin che non è fatto per essere estendibile, diciamo sì, ok, con la GPL però non stiamo invogliando, non stiamo aiutando chi c'è dopo a fare quel lavoro. Noi, ok, la persona che arriva dopo trova il nostro plugin, però si ritroverà scomodo, si ritroverà svantaggiato, quindi dobbiamo cercare di rendere la cosa più accessibile, più pulita, più comoda per tutti. Ok, per entrare un po' più nell'etaglio, ho buttato su GitHub un piccolo esempio chiamato, per esempio, per Workup Verona 2023. Quindi è un piccolo plugin che è molto, molto classico. Con plugin, come sapete tutti, creiamo la cartella, dentro la cartella plugin creiamo una cartella chiamata Workup Verona 23, il nome del nostro plugin, e poi ci inseriamo nel nostro file PHP la classica inentazione, cioè il nome, la descrizione e vari dati. Io ho fatto un esempio abbastanza semplice. Nell'ultima parte del leader uscire un messaggio di testo, in cui viene presentato un talk dei Workup Verona. Quindi due funzioni semplici, un GetTalk, un GetSpeaker, e poi una funzione che prende un talk e ci prepara la stringa per essere mostrata. Questo diciamo, quindi ho detto che nel lead del nostro tema chiama questa funzione e li faccio stampare il mio content, quindi la scritta non perderti poi quel testo che abbiamo fatto prima. Quindi preparati, non perderti il nome di un talk a caso e poi che ti viene stampato comodamente nel nostro leader. Un plugin funziona semplice e comodissimo, ma una persona, li piace il mio plugin, però ha detto, se cos'è, io però nel mio sito vorrei che oltre a avere il titolo del nome dello speaker o il nome del suo talk, io vorrei anche che le persone che visitano il sito sappiano anche dell'esistenza della third party, perché secondo me è il metodo di GetTalk in più bello che piace. Quindi noi dobbiamo modificare in questo caso il nostro testo. Cosa possiamo fare? Se vedete un'atima differenza tra questo talk e questa slide, con questo codice e l'altra, io aggiunto qua la playfilters. Questo significa che in questo punto esatto del mio codice, il mio, la variabile in cui c'è il testo bello esploso, in cui c'è scritto, viene presentato il talk, può subire modifiche. Quindi in questo caso, se nottate bene, qua c'è il nome del mio hook, del mio filtro, il mio filtro viene chiamato qua, e noi stiamo dicendo che quando invochiamo questo adfilter con questa label, chiama questa funzione. Qua semplicemente sto prendendo il testo che ho detto prima, è conscritto senza dimenticare lafterparti, quindi il normale funzionamento del nostro plugin va avanti e ci inserisce Honda e in più questo pezzo. Questo pezzettino, noi possiamo creare un plugin secondario, possiamo prenderlo e metterlo nel funcione del nostro tema per esempio. Sì, principalmente sono questi dei punti in cui sarebbe l'ideale metterlo. Quindi mi ho appena visto un filtro, un filtro che lavora quindi su una variabile. La nostra variabile che può essere modificata, restampata e ripercorrere il suo ciclo di vita. Esattamente, quindi riassumendo quello che mi ho fatto è semplicemente aggiungere questo. Il content apposso di funzionare lo stesso modo invoca l'apply fitters. Poi cosa ne pensiamo se posso dibuttare subito il nome del talk, non perdere eccetera, mettiamo un testo prima e un testo dopo. Per esempio, ho dimenticato già come funziona il telecomando, lo sto usando adesso per ora, per poter inserire una funzione prima e dopo, noi possiamo utilizzare i two actions. Come avete visto, per esempio, i two actions l'ho messo poco prima del leccio, quindi dalla stampa sul schermo, del mio testo. Cosa succede? Il two action funziona in questo modo. Il two action è un'azione che succede, noi possiamo farci qualsiasi cosa con il two action. Quindi un certo momento del nostro codice c'è il two action, se c'è qualcosa associato a questa label, puci vero una before action e after action, succede qualcosa. Noi che esiluziamo il tempo originale non ce ne deve neanche interessare. Noi diamo libertà agli altri persone in quel punto di fare quello che servono. Di solito si, si cerca di metterlo a fianco a una stampa sul schermo, a un'associazione di variabili, eccetera. Però le regole sono... non regole, le best practices dovrebbero essere queste. Quindi, per esempio, ho deciso che, nel before action, quindi poco prima del mio messaggio, voglio che venga scritto benvenuti a questo work-up. E quindi lo possiamo fare tranquillamente, come ho detto prima, mettendolo in un altro plugin, mettendolo nel nostro function. Questa scritta, prima del leccio che mi ho visto prima, ci stamperà benvenuti a questo work-up. Però noi possiamo metterci lì dentro anche tantissima logica. Io, per esempio, lì ho passato una variabile. Qua semplicemente, io dico dicendo. Se sei prima di mezzogiorno, questo torque di mattina, quindi, tieni sotto controllo loggio. Se dopo il pomeriggio hai ancora qualche... qualche ora di... di tempo per... per godertelo. Quindi... quindi noi, dentro le nostre vari... due action, possiamo giocarsela un po' come vogliamo, possiamo estenderli come vogliamo, all'ennesima potenza. E se fosse il contrario, ci fosse un altro plugin. Cioè, pensiamo fin da che noi arriviamo per terzi. Quindi, una persona ha già creato il suo plugin con quel action. Una seconda persona, in un plugin bellissimo che ci piace un delle funzionalità, ma una proprio non ci serve, non ci interessa, e ci ha messo un action che noi vogliamo proprio rimuovere. In quel caso, non ci è piaciuto l'after che ci metteva troppanza, perché parlava di... di... possiamo fare direttamente un rimuovaction. Questo va, arriva e... elimina dal nostro... dal funzionamento di... del plugin quell'indicazione. Quindi non avremmo più il... il pezzettino che ci controlla l'orario. Facciamo un piccolo riassunto. Noi abbiamo utilizzato i filters. I filters si utilizzano per manipolare una variabile, il dato che noi abbiamo in determinato punto. Di solito lo si utilizza prima di una segnazione, prima di una stampa o simili. Quindi chiamiamo... aggiungiamo il filtro, gli diamo il parametro e poi chi arriverà dopo potrà agire interamente in quel punto e fare le sue dovute... le sue dovute modifiche. Action, invece, è il contrario. L'action tutti stai infilando in un punto. Non c'è bisogno di passaggio di parametri o altro. Tu sei dicendo ci deve essere un'azione in questo momento. Quindi una persona può prendere delle azioni e metterle in quel punto. Che possono essere di svariate... di svariate intità. La stessa cosa vale anche per remove. C'è un'azione che non ci piace, che non vogliamo avere. Con Remove Action possiamo removerla. Esempi ne volete? Qua ogni tanto cito la mia regione che ogni tanto manca. Prendiamo un po' di esempi di tutti i giorni che utilizzano questo. Ecco, io parlo spesso di HuCommerce, perché HuCommerce è un catalogo infinito di casistiche di filtri o di action. Puoi modificare sia il funzionamento generale dell'ordine, ma puoi modificarti semplicemente con un semplice action persino il contenuto di un menu con due righe di codice. Quindi comodissimo. Qua ho preso un po' di esempi di plugin che secondo me sono tutti quanti conosciamo e ho preso un esempio a caso. Per esempio, per HuCommerce ho messo il Beforker Cart Table quando c'è il stampemascermo, il rassunto del nostro carrello, noi possiamo agire subito prima e far le dovute modifiche. Contact Form 7 fa succedere qualcosa poco prima di mandare la mail del cliente, la mail del contatto. Faccio un esempio dopo la GDPR c'è sempre stata la necessità di aver tracciate tutte le mail che arrivano, per esempio. Si sono agganciati tramite Contact Form per avere un log di tutte le mail che sono uscite. Ho Yoast SEO in cui prima di stampare il nostro ad la parte d'intestazione far fare qualcosa altro. Sesa cosa possiamo vederla anche per i filtri. Per esempio, quando viene stampata la valuta. Quando viene stampata la valuta noi possiamo aggiungerci, possiamo manipolarcelo come vogliamo, se vogliamo il simbolo dell'euro, se vogliamo essere scritto euro, se vogliamo l'AE per altri problemi. Se a posto dell'AE vogliamo metterci dentro uno spam per metterci qualche dato o qualche valore magari più accessibile. Yoast SEO invece fa questa cosa. C'è il filtro dentro la metà description noi possiamo manipolarcelo come vogliamo. Il contact form set poco prima della stampa, noi abbiamo un bel array con tutti i campi che deve stamparsi e noi possiamo manipolarla in questo in questo punto. Quando una persona si mette a scrivere delle slide è anche un momento di retrospettiva. Leggi bene tutto quello che hai fatto leggi bene però poi divinamente a cavolo. Sono stato incorrente, non l'ho messo nel mio plugin. Quindi è anche una scusa per fare una retrospettiva per dire un attimo dove ho sbagliato e quindi anche una scusa per pubblicare e migliorare il proprio lavoro. Io uno degli ultimi plugin che ho fatto era un plugin che semplicemente aggiungiava il basic authentication nella pagina di admin e c'era questa funzione in cui io per esempio validavo le credenzielle che avevo messo e poi se erano sbagliate lanciavo l'errore di 401. Bello funziona però secondo la mia logica potrebbe esserci qualcosa di un po' più un po' più interessante. Uno di questi è metterci un action quest action una persona per esempio che non li piace il mio plugin però non ha abbastanza, potrebbe dire sì ok, una persona svolge l'autenticazione però io voglio che me la loghi oppure voglio che mi arrivi un email di avviso vorrei che venisse salvato in un determinato modo quindi ho ritenuto interessante che la persona potesse magari nel suo codice estendere questo e farsi avvisare come voleva un altro punto per esempio in cui ci ho rifletto un po' io avevo un bel file di log in cui e poi salvavo questi dati nel database nelle option del database io ho detto ok però magari il dato che io sto salvando ha bisogno di modifiche quindi proviamo a metterci un apply filters se il logs è un array no un oggetto, una persona va si manipola l'oggetto come vuole e così ce l'ha salvato nel modo in cui lui preferisce quindi il talk è finito ma vorrei di aver grazie ma non è questa la slide non è lo stesso tono di voce di Aragorn dato che si parla di open source ci sono persone che hanno fatto dei talk prima di me che hanno dato diversi spunti diversi dettagli uno di questi è Francesco che nel 2021 ha fatto un talk in cui si parla proprio cosa sono i child plugin quindi il dettaglio prendere le regole degli action, dei filter e sfruttarli per creare dei plugin ulteriori quindi grazie a tutti voi se ci sono domande ci sarà Simone qui si sono e alcuni dei miei contatti grazie mille domanda qual'è il modo migliore per trovare i vari ganchi possibile messe a disposizione perché per esempio io banalmente quando ho bisogno di agganciarmi a qualche funzionalità vado a vedere la funzionalità che viene utilizzata vado a leggermi la sua dichiarazione e nella dichiarazione trovo i vari c'è un altro modo? più semplice, più bello, più facile non saprei io uso sempre il metodo più grezzo vado sul visual studio guardo un attimo sul metodo dichiarazione quindi non ho per ora non utilizzo alcuna scorciatoia tipo qualche estensione che automaticamente mi legge sarebbe stato interessante Quarimonitor, sì è vero però quarimonitor non ti permette secondo me di leggere del plugin o sì? ah ok, basa la pagina però a volte però non hai la pagina che va a lanciare quella la funzionalità la come sempre dedo ci salva la vita ciao, grazie mille e volevo chiederti e tu gli action e i filter di cui hai parlato io li posso aggiungere ovunque in un tema anche o in un plugin e ma nel caso specifico come dicevi prima che voglio creare un plugin per estendere solo una funzionalità proprio di uno specifico plugin e penso che a contact for 7 voglio aggiungere una funzionalità faccio un plugin specifico ho delle intestazioni nei commenti come nei temi per correlare due plugin o non mi interessa e magari faccio solo una condizione if function exist allora faccio cose o altrimenti il plugin non fa nulla è il secondo metodo perché non utilizza lo stesso modo dei temi, sono proprio due story man separate quindi sì contro l'estesis è la funzione se il plugin è attivato un bel leaf che ci fa di questi controlli e poi scrive il nostro testo se però vogliamo pubblicarlo nel repository ufficiale di warpress lì c'è una condizione che è una questione di di brand noi non possiamo utilizzare contact for 7 mi hai detto bisogna utilizzare un determinato nomenclatura che vogliamo citare nel titolo e nell url quel nome che è già prenotato se non sbaglio c'è soltanto un modo in cui c'è scritto alla fine del titolo di mettere for contact form 7 siccome si ti hanno obbligato a scrivere for il nome del plugin altri modi mi pare che non c'è nessuno domande ancora? no posso farne una io? ma non a te al pubblico in realtà quanti di voi si considerano junior developer sulle mani? senza paura e tanto non vi mangio il promesso ok quanti mid developer ok senior developer ok quanti hanno trovato questo talk utile indipendentemente da loro livello ok perfetto questa era la dimostrazione che un talk ben fatto e che ci voleva io se avessi seguito questo talk 3 o 4 anni fa avrei risparmiato anche io bene se non ci sono altre domande perché abbiamo ancora due minuti domanda quando aggiungiamo degli ucc né nostri plugin quel è il modo migliore per documentarli per risolvere il problema che diceva prima lui giustamente fare in modo che l'utente li possa trovare ok c'è una best practice sinceramente il suo momento non mi viene un po' per l'attenzione però comunque il commento deve aver una sintassia precisa per dirlo come? con il piacapidò ma tu lo metti anche nell'intestazione della funzione si lo metto subito prima quindi comunque lo riporti anche prima a memoria mi sembra che debba essere comunque documentata anche nel prima di ogni filtro di ogni ucc debba essere messo comunque un commento sulla mano chi era ok ciao grazie io una domanda esiste un modo per intercettare un action magari di un plugin che va a destendere un altro plugin e spostarlo in un'altra posizione magari questo plugin va a piazzare questo escio all'interno magari venimente un gateway bancario che va a piazzare la propria scritta all'interno del carto di vcommerce ma io non lo voglio lì, lo voglio piazzare un'altra parte c'è un modo per intercettarlo e spostarlo lo rimuovere si lo rimuovere, lo rimuovere rimuoverlo e ricrearlo per caso è l'unica