At arve en WordPress-installation
8 år, 34 plugins og et tema, ingen tør røre. Opgaven begynder ikke med at rette noget – den begynder med at finde ud af, hvad der bliver brugt.
Opgaven lyder sjældent som et projekt. Den lyder som: “vores site er blevet langsomt”, eller “vi kan ikke opdatere, uden at noget går i stykker”. Bagved ligger en WordPress-installation, der har kørt i otte år, og som ingen har haft det fulde overblik over siden den udvikler, der byggede den, holdt op.
Det er en af de mere almindelige opgaver i WordPress-verdenen. Den bliver bare sjældent beskrevet, fordi den ikke er et nyt site med et før-og-efter-billede.
Det første skridt er ikke at rette noget
Fristelsen er at gå i gang: deaktivere plugins, opdatere kernen, rydde op i temaet. Det er også den hurtigste vej til at slukke for noget, der viste sig at være vigtigt.
Første skridt er at finde ud af, hvad der faktisk bliver brugt. Hvilke plugins gør noget, siden faktisk viser. Hvilke sidetyper findes der, og hvem redigerer dem. Hvad sker der ved en bestilling, en tilmelding, en formular – hele vejen fra klik til mail eller database. Det tager typisk en dag eller to, og det er den bedst brugte tid i hele opgaven.
Reglen, jeg arbejder efter, er enkel: rør ikke noget, før du ved, hvorfor det er der. Kode, der ser overflødig ud, er ofte nogens løsning på et problem, der ikke er dokumenteret nogen steder.
Hvad man typisk finder
Der er nogle mønstre, der går igen.
Plugins, der overlapper. To cache-plugins installeret af hver sin udvikler. En galleriløsning, der bruges på én side, som ingen har besøgt i to år.
Plugins, der udsender konkurrerende metadata. Den værste variant af overlappet, fordi den ikke gør noget synligt. To SEO-plugins skriver hver sin title, sin canonical og sine Open Graph-tags i samme sidehoved, og temaet lægger måske et tredje sæt oven i. Siden ser rigtig ud i browseren – men Google får modstridende signaler om, hvad siden hedder, og hvilken URL der er den rigtige. Det er ikke et plugin, der er i stykker. Det er to, der begge virker.
Ændringer i temaet frem for i et child theme. Det betyder, at temaet ikke kan opdateres, uden at ændringerne forsvinder – og derfor er det ikke blevet opdateret. Derfra breder det sig: når temaet står stille, tør man heller ikke opdatere WordPress eller PHP, og til sidst er hele installationen låst fast af noget, ingen kan huske.
Sporing, der kører uden om samtykket. Google Tag Manager installeret gennem et plugin, mens samtykket håndteres af et andet. Hver for sig virker de: banneret vises og gemmer valget, og GTM indlæser sine tags. De ved bare ikke nødvendigvis af hinanden, så brugerens valg i banneret bliver ikke omsat til den adfærd, man tror. Det er den slags, der ikke opdages ved almindelig brug af sitet, men først når man ser på, hvad browseren faktisk sender.
Kode, ingen tør røre. En functions.php på 1.000 linjer, hvor det meste er tilføjet af forskellige mennesker over flere år. Ingen kommentarer, ingen historik, fordi det aldrig har ligget i Git.
Hvad jeg gør ved det
Rækkefølgen betyder mere end værktøjerne.
- En kopi og versionsstyring. Installationen skal ligge et sted, hvor man kan prøve noget af uden at ramme det, kunden bruger. Og koden skal i Git – ikke for at være moderne, men fordi det er forskellen på “vi ændrede noget, og nu virker det ikke” og “vi kan se præcis, hvad der skete”.
- Det, der gør ondt nu. Er sitet langsomt, måler jeg hvorfor, før jeg optimerer. Er der en sikkerhedsopdatering, der er blevet udskudt i to år, er den vigtigere end oprydning. Kunden skal mærke en forskel, før man går i gang med det, der ikke kan ses.
- Én ting ad gangen. Ét plugin fjernet, sitet testet, videre. Det tager længere tid end at rydde op i én omgang, men når noget går i stykker, ved man, hvad det var.
- Det, der gør næste gang lettere. Et child theme, så temaet kan opdateres. Ændringer flyttet fra functions.php til et sted, de kan læses. En kort note om, hvad der er hvor.
Hvornår det ikke kan betale sig
Nogle gange er svaret at bygge nyt. Det er det, når temaet er så gennemhullet, at oprydningen bliver dyrere end en ny frontend, eller når indholdsstrukturen ikke passer til det, sitet skal kunne i dag.
Men det er sjældnere, end man tror – og det er værd at være opmærksom på, at den, der skal bygge det nye, sjældent er den mest objektive til at vurdere det. Et site med otte års indhold, indeksering og indgående links har en værdi, der ikke står i kodebasen.
Det, det egentlig handler om
En arvet installation er sjældent kun et teknisk problem. Det er også et spørgsmål om, at nogen skal kunne svare på, hvad der sker, og hvorfor.
Det er dét, arbejdet går ud på: at gøre et system, ingen forstår, til et system, nogen kan drive. Koden bliver bedre undervejs, men det er ikke pointen. Pointen er, at næste gang der skal ændres noget, er det en opgave og ikke en risiko.
Det jeg oftest møder
En arvet installation har sjældent dem alle, og de færreste er alvorlige hver for sig. Det er kombinationen, der gør en opgave svær at estimere.
01_Plugin-gæld: 30-60 plugins, hvor flere løser næsten samme problem, nogle er forladte, og ingen ved længere, hvilke der er nødvendige.
02_Plugin-konflikter: To plugins hooker ind samme sted, loader hver sin version af et bibliotek eller ændrer den samme funktionalitet.
03_Opdateringsangst: WordPress, PHP, tema eller plugins kan ikke opdateres, fordi ingen ved, hvad der knækker.
04_Købte temaer og page builders: Elementor, Divi, WPBakery og lignende kan efter nogle år efterlade en løsning, der er svær at ændre uden at arbejde imod systemet.
05_Performance: Plugins og temaer loader CSS og JavaScript på alle sider, også hvor det ikke bruges. Dertil tunge billeder, dyre queries og manglende caching.
06_Database-oprydning: wp_options, autoloadede options, revisions, transients og tabeller fra plugins, der for længst er slettet.
07_WP-Cron: Praktisk indtil jobs bliver tunge, fejler stille eller skal køre pålideligt på et bestemt tidspunkt.
08_Sikkerhed: Gamle plugins og temaer, for brede rettigheder, XML-RPC, filuploads, ubeskyttede endpoints og administratorer nok til at stille et fodboldhold.
09_Egen kode de forkerte steder: Ændringer direkte i parent theme eller i et plugin, snippets i functions.php - og den klassiske lille rettelse i core.
10_Manglende versionsstyring: Ændringer lagt direkte på produktion via wp-admin eller FTP, og ingen sikker måde at se, hvad der er ændret siden sidst.
11_Staging og produktion: Databaseindhold skal den ene vej, kode den anden, mens uploads og redaktionelle ændringer helst ikke må overskrives.
12_URLs i databasen: Serialiserede data og absolutte URLs gør en almindelig search/replace mere spændende, end den burde være.
13_Mail: wp_mail() kan godt returnere succes, uden at mailen ender i modtagerens indbakke. Pludselig bliver SMTP eller en mailtjeneste, SPF, DKIM og DMARC en del af WordPress-opgaven.
14_REST API og integrationer: Autentificering, rate limits, webhooks, retries og eksterne systemer, der ikke opfører sig, som dokumentationen lovede.
15_WooCommerce: En kategori for sig: checkout, hooks, ordrestatusser, betalingsgateways, moms, fragt, mails og plugins oven på plugins.
16_Flersprogethed: WPML eller Polylang, hreflang, oversatte slugs, canonicals og indhold, der ikke findes på alle sprog.
17_Teknisk SEO: Redirects, canonicals, sitemap, robots, strukturerede data - og flere SEO-plugins, der alle vil bestemme indholdet af <head>.
18_Tracking og samtykke: Tag Manager, GA4, Google Ads, Consent Mode og cookie consent. Typisk her man opdager, at tre plugins og temaet alle indsætter tracking.
19_Gutenberg og blokke: Fint, når det er tænkt igennem. Mindre fint, når redaktøren får 80 blokke og mulighed for at bryde designsystemet.
20_Roller og rettigheder: Editor skal kunne rette dette, men ikke dét - hurtigt mere kompliceret end standardrollerne i WordPress rækker til.
21_Mediebiblioteket: 12.000 billeder, 14 genererede størrelser af hvert og 40 GB thumbnails, hvor ingen ved, hvilke temaet bruger.
Listen er ikke en anklage mod WordPress. Det er, hvad der sker med systemer, mange mennesker har rørt ved gennem otte år.