Udvid Wordpress plugins

Den tid, hvor WordPress kun blev brugt som et bloggingværktøj, er for længst ovre. Nu er det populære CMS base for mange forskellige typer af hjemmesider, og i kølvandet på dette er behovet for at udvide eksisterende plugins øget markant. Men hvordan gør man?

Af Jens Just Iversen

15. OKT 2016

Der findes efterhånden uoverskueligt mange plugins til WordPress. Nogle er små og kan kun en lille ting, og andre er kæmpestore - som f.eks. WooCommerce og BuddyPress. Hvad enten det er stort eller småt, kan der nemt opstå et behov for at udvide funktionaliteten i pluginnet. Men at rette direkte i pluginnets kildekode er no-go, da du ved efterfølgende opdateringer vil miste dine rettelser.

Men hvad gør man så? Afhængig af situationen og rettelsernes beskaffenhed kan man gøre brug af en af følgende alternativer.

Gå i dialog med udvikleren

Hvis det er en fejl i pluginnet, som du vil rette, kan du oftest skrive til den udvikler, der har lavet pluginnet, og få vedkommende til at rette det. Du kan også selv rette det og lave en pull-request på projektets eventuelle Github-konto.

Hvis du skriver pæn kode og rettelsen eller tilføjelsen kan komme alle til gavn, vil en udvikler være tilbøjelig til at acceptere dit pull-request.

Brug hooks

WordPress er i meget stort omfang bygget op om filters og actions - også kendt som “hooks”. Det er disse, der gør det nemt at interagere med WordPress-kernen, temaer, plugins og så videre. Der er ikke nogen regel om, hvor hooks må placeres, så de kan findes overalt og giver dig derfor mulighed for at ændre og tilpasse din WordPress installation.

Hooks er derfor også velimplementerede i de fleste større plugins. Desværre halter det tit i mindre plugins, hvor udvikleren ikke har taget den nødvendige tid til at gøre sit plugin klar til udvidelser og interaktioner. Hvis det plugin, du gerne vil udvide, gør brug af hooks, så benyt denne mulighed. Lav dit eget plugin, og hook dig ind de steder, du gerne vil ændre eller tilføje noget funktionalitet.

Du har også mulighed for at fjerne funktionalitet i det oprindelige plugin, ved at fjerne de funktioner de hooker op. Dette gør du med funktionerne remove_filter og remove_action.

Erstat funktionalitet

Selvom det plugin du gerne vil udvide ikke tilbyder hooks du kan bruge, kan du stadig ændre deres funktionalitet. Oftest vil du opleve, at det oprindelige plugin hooker deres funktioner op på andre hooks. Eksempelvis i WordPress-kernen.

I pluginnet bbPress findes for eksempel denne linje:

add_action( 'wp_footer', 'bbp_footer', 10 );

bbPress vil altså gerne kalde deres egen funktion bbp_footer i action-hooket “wp_footer”. Det er du dog ikke helt enig i, og vil gerne have din egen funktionalitet i stedet. Så fjerner du deres add_action og tilføjer din egen.

remove_action( 'wp_footer', 'bbp_footer', 10 );
add_action( 'wp_footer', 'bbp_footer_custom', 10 );

Din egen funktion bbp_footer_custom kan nu mere eller mindre ligne den oprindelige bbp_footer, men med dine egne ændringer. Selvom pluginnet bbPress altså ikke tilbød dig et hook til at ændre deres funktionalitet, har du nu mulighed for det alligevel - uden at ændre i deres plugin!

Byg ovenpå

Hvis du ikke er ude efter at ændre funktionalitet, men blot tilføje til nuværende funktionalitet, kan du lave dit eget plugin, der extender klasser fra det oprindelige plugin eller blot kalder funktioner og bygger egen funktionalitet ovenpå.

Lad os antage, at du har installeret et plugin der hedder “show_date”. Pluginnet kan vise datoen, men du vil have at det også kan vise klokkeslættet.

Du kan nu oprette dit eget plugin, der enten extender klasser og overskriver funktioner fra det oprindelige plugin eller måske endnu nemmere, blot kalder en funktion og tilføjer lidt data til outputtet.

function show_date_and_time() {

include __DIR__ . '/../show_date/show_date.php';
$show_date = new show_date();
return $show_date->get_date() . ' ' . date('H:i:s');

}

Nu har du udvidet en funktion fra det oprindelige plugin uden at ændre i deres kildekode.

Nogle plugins vil også tilbyde en API i form af en klasse med en række public funktioner. Disse vil næppe ændre sig markant gennem pluginversioner og kan derfor benyttes uden at man skal bekymre sig over opdateringer. Der er selvfølgelig ingen garanti for dette.

Tilføj dine egne hooks

Har udvikleren af det plugin du gerne vil udvide ikke været så betænksom at lave hooks du kan benytte, og virker ingen af ovenstående muligheder for dig, har du mulighed for at tilføje dine egne hooks i deres plugin og bruge dem efterfølgende.

Dette er dog ikke anbefalelsesværdigt på grund af den efterfølgende vedligehold, du får med at tilføje dine hooks igen ved hver opdatering af det oprindelige plugin. Ikke desto mindre er det nemmere at tilføje hooks igen ved opdateringer, end det er at tilføje hele kodesnippets ved hver opdatering. Du bliver heller ikke så nem forfalden til den farlige spaghettikode, da du bliver tvunget ud i at fragmentere din kode.

Vælger du at tilføje hooks til det oprindelige plugin, så gør dig selv og andre den tjeneste at sende dine rettelser til udvikleren af pluginnet. Gør det som pull-request, hvis det ligger på Github eller send vedkommende det i en e-mail. Hooks er ikke skadelige for pluginnet og de gør ikke koden sværere at læse, hvorfor det kan være svært at finde argumenter mod at acceptere sådan et forslag.

Brug et child-theme

Dette forslag er ikke så meget et alternativ til de øvrige punkter, som det er et ekstra værktøj.

Har du brug for at ændre markup’en for et plugin (eller tema), kan du lave et såkaldt child-theme til det aktuelle tema. Heri kan du overskrive template-filer med dine egne og derigennem lave ændringer og tilføjelser til markup’en.

Mange plugins giver mulighed for at overskrive deres template-filer. Du skal blot tilføje en mappe i dit child-tema med pluginnets navn, og i denne mappe lægge din nye template-fil.

DOM manipulation med JavaScript

Har du blot behov for få visuelle ændringer til et plugin, kan det i visse tilfælde være smart at lave disse visuelle ændringer ved hjælp af DOM manipulation med JavaScript. Det kan være tilføjelse af en <div>, et link eller lignende.

Dette forslag skærer lidt i øjenene. Ikke fordi det ikke fungerer. Du vil heller ikke opleve de store problemer, når det oprindelige plugin opdateres. Kompatibiliteten er også høj. Problemet er, at markup sjældent findes i dine JavaScript-filer. Det hører ikke hjemme der, og debug og overblik over koden bliver derfor sværere. Ligeledes så hentes JavaScript-filerne som oftest først ind i slutningen af en sidevisning. Det indhold du ændrer eller tilføjer vil derfor i et splitsekund vises i dets oprindelige form, hvorefter det ændres.

Vær forsigtig med denne mulighed!

Her til slut

.. vil jeg gerne opfordre dig til, når du udvikler eller får udviklet et plugin, at du selv husker at tilføje actions og filters. Det er muligt at det er closed source og skal bruges privat, men dine kollegaer, samarbejdspartnere og dig selv vil i fremtiden få stor gavn af, at pluginnet er fremtidssikret en smule. Laver du plugins til offentlig køb og fri download er hooks et must.

Har du flere tips til, hvordan man udvider WordPress plugins, eller input til ovenstående, så hører jeg rigtig gerne fra dig.