WordPress SQL: ta bort år/månad-struktur för uppladdade filer

Varning för tekniskt nörderi!

Av skäl som jag inte går in på här behövde jag omorganisera en WordPress-installation så att hanteringen av uppladdade filer till inläggen inte längre organiserades enligt år/månad i katalogstrukturen på servern, utan i stället hämtades från så att säga uppladdningskatalogens root (vanligen /wp-content/uploads). Det visade sig vara inte helt enkelt.

I wordpress databas finns information om filuppladdningar dels i tabellen wp_posts – där räcker det att byta ut t ex 2010/07/bild.jpg till endast bild.jpg i fälten post_content och guid exempelvis enligt denna princip:
UPDATE wp_posts SET post_content = REPLACE(post_content,'2010/07/','')

Men filerna hanteras även i wp_postmeta.meta_value och där blir det genast knepigare. I ett och samma fält finns nämligen förutom bildadressen en siffra som indikerar hur lång strängen är som håller värdet för bildens plats och namn på servern. För att allt ska bli riktigt måste man uppdatera även den siffran med strängens nya längd.

NedanstÃ¥ende SQL uppdaterar samtliga tre ovan nämnda fält. Det här gÃ¥r säkert att göra pÃ¥ ett smidigare sätt, men det funkade för mig. Scriptet mÃ¥ste köras en gÃ¥ng för varje Ã¥r/mÃ¥nad-kombination som berörs – jag hade inte behov av att skriva en loop för att hantera alla kataloger. Ange Ã¥r/mÃ¥nad i variabeln pÃ¥ första raden och kör sedan scriptet – pÃ¥ egen risk – i sin helhet i t ex phpMyAdmin.

/*SQL för WordPressdatabas. Tar bort år-månad-uppdelad uppladdningskatalog i wordpress databas på befintliga inlägg. WordPress kommer istället att leta i standarduppladdningskatalogen efter samma mediafiler.
Henrik Almén http://www.aldamus.se
*/
set @stringToReplace='2010/06/'; /* <-- Ange år och månad (på formen 'YYYY/MM/') för bildkatalog som ska inaktiveras i databasen*/
 
update wp_postmeta set meta_value=replace(meta_value,concat(right(substring(left(meta_value,locate(@stringToReplace,meta_value)-1) ,-10),length(substring(left(meta_value,locate(@stringToReplace,meta_value)-1) ,-10))-locate(';s:',substring(left(meta_value,locate(@stringToReplace,meta_value)-1) ,-10))),@stringToReplace),concat(concat('s:', replace(right(substring(left(meta_value,locate(@stringToReplace,meta_value)-3) ,-10),length(substring(left(meta_value,locate(@stringToReplace,meta_value)-3) ,-10))-locate(';s:',substring(left(meta_value,locate(@stringToReplace,meta_value)-3) ,-10))),'s:','')-length(@stringToReplace)),':"')) where meta_value like concat(concat('%:"',@stringToReplace),'%');
update wp_postmeta set meta_value=replace(meta_value,@stringToReplace,'');update wp_posts set post_content = replace(post_content,@stringToReplace,'');update wp_posts set guid = replace(guid,@stringToReplace,'');

Använder du denna sql gör du det på helt egen risk! Och ta backup först!

Glöm inte att flytta filerna rent fysiskt på servern också. Om du faktiskt har någon nytta av denna kod, skriv gärna en kommentar nedan.

Kommentera

Obligatoriska fält är markerade med *. Din e-postadress kommer inte att synas.