Skip to content

Kaikki WordPressistä, web-kehityksestä — ja paljon muuta

🔄 WordPress alihakemistossa: kuinka siirtää asennus juuresta ja takaisin

🔄 WordPress alihakemistossa: kuinka siirtää asennus juuresta ja takaisin

Tuttu tilanne: pystytit kehityssivuston, rakensit teeman, liitit sisällön WP Migrate DB Prolla ja pushauksen jälkeen löysit rikkinäiset tyylit, puuttuvat kuvat ja toimimattoman wp-adminin. Syy on melkein aina sama: tuotanto on juuressa, kun taas dev on alihakemistossa (tai päinvastoin), eikä suoraviivainen URL-osoitteiden haku ja korvaus tietokannassa korjaa tätä eroa.

Ongelma on syvempi kuin miltä näyttää: juuriasennuksessa WordPress käyttää samaa verkkotunnusta kaikkiin linkkeihin (sekä sivuille että mediatiedostoihin). Alihakemistoasennuksessa sisältölinkit tulevat sivusto-osoitteesta, kun taas resurssilinkit (css, js, kuvat) tulevat WordPress-osoitteesta. Tavallinen haku ja korvaus tietokannassa korvaa kaiken yhdenmukaisesti ja rikkoo puolet poluista.

Tästä oppaasta löydät kaksi testattua migraatioreittiä (sinne ja takaisin) tarkkoine haku- ja korvausasetuksineen, wp-config.php-valmisteluineen ja oikeine tiedostonsiirtojärjestyksineen. Lukemisen jälkeen joko yhdenmukaistat devin ja tuotannon asennustavan tai teet tietoisesti migraation eri asennustyyppien välillä ilman rikkinäistä julkisivua.

💡 Pikakatsaus:

  • Selvitä asennustyyppisi: täsmäävätkö "WordPress-osoite" ja "Sivusto-osoite" kohdassa Asetukset → Yleinen
  • Siirrettäessä alihakemistosta juureen: kovakoodaa WP_SITEURL wp-configiin, tee /subdir/-korvaus tietokannassa, siirrä tiedostot yhtä tasoa ylemmäs, päivitä juuren index.php
  • Siirrettäessä juuresta alihakemistoon: korvaa tietokannassa vain polut kohteeseen /wp-content, päivitä WordPress-osoite asetuksissa, luo alihakemisto, kopioi index.php ja .htaccess takaisin juureen
  • Minkä tahansa migraation jälkeen mene kohtaan Asetukset → Osoiterakenne ja klikkaa "Tallenna": tämä rakentaa URL-rakenteen uudelleen ja tyhjentää välimuistin

Miten selvittää, mihin WordPress on asennettu

Jos asensit WordPressin käsin, muistat todennäköisesti, oliko se verkkotunnuksen juuressa vai alihakemistossa kuten /wp tai /blog. Mutta jos sivusto on peritty edelliseltä kehittäjältä, hotellipalvelun yhdellä klikkauksella käyttöön ottama tai siitä on useita vuosia, yksityiskohdat haalistuvat.

Nopein tapa: mene WordPressin hallintaan, avaa Asetukset → Yleinen ja katso "WordPress-osoite (URL)"- ja "Sivusto-osoite (URL)" -kenttiä. Jos arvot täsmäävät, sinulla on juuriasennus:

WordPress-osoite ja sivusto-osoite täsmäävät

Jos kentät eroavat toisistaan, WordPress on asennettu alihakemistoon (alla olevassa esimerkissä tämä on /subdir):

WordPress-osoite poikkeaa sivusto-osoitteesta

Lisämerkki alihakemistoasennuksesta: kun kirjaudut hallintaan, URL sisältää alihakemiston, esimerkiksi example.com/wp/wp-admin/ eikä example.com/wp-admin/.

Miksi et voi vain siirtää suoraan

Ongelman ydin on kaksiosaisessa URL-järjestelmässä, jota WordPress käyttää alihakemistoasennuksissa. Puretaan tämä konkreettisilla esimerkeillä.

Oletetaan, että sinulla on juuriasennus osoitteessa example.com. Aivan kaikki linkit tietokannassa, sekä artikkeliin /2025/about-page että kuvaan /wp-content/uploads/photo.jpg, alkavat //example.com. Tavallinen haku ja korvaus //example.local//example.com toimii täydellisesti.

Otetaan nyt asennus /wp-alihakemistossa. Linkki samaan artikkeliin näyttää tältä //example.com/about-page (sivusto-osoitteen kautta), kun taas linkki samaan kuvaan on //example.com/wp/wp-content/uploads/photo.jpg (WordPress-osoitteen kautta alihakemistoineen). Yksinkertainen korvaus //example.local//example.com rikkoo mediatiedostot: järjestelmä etsii niitä ilman /wp-osaa polussa ja saa 404-virheen.

Alla oleva taulukko näyttää, mitkä URL-ryhmät tarvitsevat päivitystä kummassakin migraatiosuunnassa:

Suunta

Sivu- ja julkaisu-URL:t

Media- ja resurssi-URL:t

Tiedostopolut tietokannassa

Alihakemisto → juuri

Korvaa /subdir → `` (poista alihakemisto)

Korvaa /subdir/wp-content/wp-content

Korvaa /app/public/subdir/app/public

Juuri → alihakemisto

Jätä ennalleen

Korvaa /wp-content/subdir/wp-content

Korvaa /app/public/app/public/subdir

Tietokannan lisäksi sinun täytyy fyysisesti siirtää tiedostot ja päivittää juuressa oleva index.php, muuten WordPress ei löydä wp-blog-header.php-tiedostoa. Seuraavaksi käymme molemmat reitit läpi vaihe vaiheelta.

Tapa 1: WordPressin siirtäminen alihakemistosta juureen

Tämä on yksinkertaisempi suunta: poistat alihakemiston poluista, ja kaikista URL-osoitteista tulee "litteitä", kuten vakioasennuksessa.

Vaihe 0: vianmääritys ennakkoon

Ennen kuin teet mitään, on hyvä nähdä ongelman laajuus omin silmin. Alla oleva kuvakaappaus näyttää migraatioasetukset siirrettäessä osoitteesta wp-in-a-subdirectory.local (WordPress hakemistossa /subdir) osoitteeseen wp-standard-install.local (juuriasennus). WP Migrate DB Pron asetukset ovat vakiot, ja lisäksi on korvattu sivuston nimi havainnollistamisen vuoksi:

WP Migrate DB Pron siirtoasetukset alihakemistosta

Lopputulos on arvattavan surkea: sivut avautuvat, mutta ilman tyylejä ja rikkinäisin kuvin:

Siirtotulos ilman tyylejä ja rikkinäisin kuvin

HTML-koodissa näkyy resurssilinkkejä, joissa on kuollut /subdir-polku, jota ei enää ole kohdepalvelimella. Yrittäessäsi käyttää wp-adminia sinut ohjataan osoitteeseen wp-standard-install.local/subdir/wp-login.php, mutta kyseistä tiedostoa ei ole olemassa. Nyt korjataan tämä.

Vaihe 1: valmistelu

Suojaa ensin ylläpitäjän pääsy migraation ajaksi. Lisää wp-config.php-tiedostoon vakioita, jotka ohittavat tietokannan asetukset, jotta WordPress päästää sinut edelleen ylläpitoon vanhan polun kautta alihakemistoineen, vaikka olisimme jo siivonneet tietokannan:

1define( 'WP_SITEURL', 'http://wp-in-a-subdirectory.local/subdir' );
2define( 'WP_HOME', 'http://wp-in-a-subdirectory.local' );

Laita sitten sivusto huoltotilaan: muokkaa julkisessa juuressa olevaa index.php-tiedostoa, kommentoi rivi require( dirname( __FILE__ )... ja lisää sulkevan ?>-tagin jälkeen html-paikkamerkki, jossa on lyhyt katkoviesti. Vierailijat näkevät tämän:

Huoltosivu, jossa tekninen työviesti

Sillä välin sinä pääset edelleen ylläpitoon osoitteessa http://wp-in-a-subdirectory.local/subdir/wp-admin/, koska WP_SITEURL-vakio toimii.

Vaihe 2: haku ja korvaus tietokannassa

Nyt siivotaan tietokanta. Suorita haku ja korvaus näillä pareilla (esitetty WP Migrate DB Pron käyttöliittymässä, mutta sama periaate toimii WP-CLI:n search-replace-komennolla tai SQL-kyselyillä phpMyAdminin kautta):

  • //wp-in-a-subdirectory.local/subdir//wp-in-a-subdirectory.local
  • /app/public/subdir/app/public (tiedostopolku palvelimella)
WP Migrate DB Pron haku- ja korjausikkuna alihakemiston poistamiseksi

Heti siirron jälkeen ulkoasu ei muutu (ylläpitosivu on edelleen päällä, hallintapaneeli toimii kovakoodatun vakion kautta). Mutta jos katsot artikkelien sisältöä, kuvat eivät vielä lataudu ja sisäisistä linkeistä on "hävinnyt" alihakemisto, mikä on juuri se mitä tässä vaiheessa halusimmekin:

Artikkelin sisältö tietokannan alihakemistosiivouksen jälkeen

Vaihe 3: tiedostojen fyysinen siirto

Poista (tai kommentoi pois) rivit, joilla on WP_SITEURL ja WP_HOME, tiedostosta wp-config.php. Hallintapaneeli hajoaa nyt, joten siirrä tiedostot välittömästi alihakemistosta yhden tason ylöspäin.

SSH:n tai palvelimen komentorivin kautta tämä tehdään kolmella komennolla:

1rm index.php && mv subdir/* . && rm -rf subdir

FTP:n tai palveluntarjoajan tiedostonhallinnan kautta vedä kaikki alihakemiston sisältö julkiseen juureen ja korvaa index.php:

WordPress-tiedostojen siirto juurikansioon FTP:llä

Valmista. Sivusto avautuu juuri-URL-osoitteessa; kuvat ja tyylit ovat paikoillaan:

Sivusto toimii onnistuneesti juureen siirron jälkeen

Viimeinen silaus: mene hallintapaneeliin (nyt osoitteessa http://wp-in-a-subdirectory.local/wp-admin ilman alihakemistoa), avaa Asetukset → Osoiterakenne ja klikkaa "Tallenna muutokset", vaikka et olisi muuttanut mitään. WordPress rakentaa URL-rakenteen uudelleen ja tyhjentää välimuistin.

Tapa 2: WordPressin siirtäminen juuresta alihakemistoon

Monet kehittäjät pitävät WordPressin asentamista alihakemistoon hyvänä käytäntönä: ydintiedostot eivät täytä juurta, hallinta Gitin/Composerin kautta helpottuu ja itse domainia voi käyttää muihin sovelluksiin. Olemassa olevan sivuston siirtäminen alihakemistoon on kuitenkin objektiivisesti monimutkaisempaa kuin päinvastainen toimenpide, koska nyt joidenkin linkkien TÄYTYY säilyttää alihakemisto, kun taas toisten ei.

Vaihe 0: diagnostiikka

Sama lähtökohta: kokeilemme vakiosiirtoa juuriasennuksesta wp-standard-install.local alihakemistoasennukseen wp-in-a-subdirectory.local (WordPress hakemistossa /subdir):

WP Migrate DB Pron siirtoasetukset juuresta alihakemistoon

Tulos on täysin odotettu: sivut avautuvat, mutta tyylit ja kuvat rikkoutuvat, koska /subdir-polkua ei ole lisätty niiden osoitteisiin:

Rikkinäiset tyylit ja kuvat alihakemistoon siirron jälkeen

Toisin kuin ensimmäisessä skenaariossa, linkit artikkeleihin ja sivuihin toimivat oikein (niiden ei kuulu sisältää alihakemistoa). Rikkoutuvia ovat nimenomaan resurssit (css, js, media), joiden polkujen täytyy nyt sisältää /subdir.

Vaihe 1: valmistelu

Tässä vaiheessa emme ASETA WP_SITEURL- ja WP_HOME-vakioita, koska haku ja korvaus ei koske näitä arvoja, ja päivitämme WordPress-osoitteen manuaalisesti hieman myöhemmin.

Aseta ylläpitosivu samalla tavalla: kommentoi require(...) pois index.php-tiedostosta ja lisää html-paikanvaraaja. Vierailijat näkevät ylläpitoviestin, kun sinä jatkat ylläpitopaneelin käyttöä osoitteessa http://wp-standard-install.local/wp-admin/.

Vaihe 2: valikoiva haku ja korvaus tietokannassa

Keskeinen ero ensimmäiseen tapaan: korvaamme VAIN tiedosto- ja resurssipolut, emmekä koske sivuosoitteisiin. Tee tämä kohdistamalla korvaus /wp-content-kaavan avulla:

  • //wp-standard-install.local/wp-content//wp-standard-install.local/subdir/wp-content
  • /app/public/app/public/subdir (polku palvelimella)
Valikoivan korvauksen määrittäminen alihakemiston lisäämiseksi

Tarkista siirron jälkeen artikkelien sisältö: linkit muille sivuston sivuille EIVÄT sisällä alihakemistoa (oikein), kun taas upotetut kuvat sisältävät sen (myös oikein):

Artikkeli valikoivan korvauksen jälkeen: kuvat alihakemistolla

Vaihe 3: WordPress-osoitteen päivitys ja tiedostojen siirto

Siirry nyt kohtaan Asetukset → Yleiset ja lisää alihakemisto "WordPress-osoite (URL)" -kentän loppuun, esimerkiksi http://wp-standard-install.local/subdir. Heti tallennuksen jälkeen ylläpitopaneeli hajoaa, koska WordPress yrittää etsiä tiedostoja uudesta polusta, mutta ne eivät ole vielä siellä:

WordPress-osoitteen päivitys alihakemisto lisättynä

Luo subdir-alihakemisto julkiseen juureen ja siirrä KAIKKI WordPress-tiedostot sinne. Kopioi sitten index.php ja .htaccess TAKAISIN juureen, jotta ylläpitosivu pysyy näkyvissä, kun viimeistelemme työn:

WordPress-tiedostot siirretty alihakemistoon

Palauta index.php alihakemiston SISÄLLÄ tehdasasetuksiinsa: poista html-paikanvaraaja ja poista require-rivin kommentointi:

1<?php
2define( 'WP_USE_THEMES', true );
3require( dirname( __FILE__ ) . '/wp-blog-header.php' );

Nyt ylläpitopaneeli on taas käytettävissä osoitteessa http://wp-standard-install.local/subdir/wp-admin/:

WordPress-hallintapaneeli toimii alihakemistoon siirron jälkeen

Tarkista sisältö: kuvat ovat paikoillaan, tyylit latautuvat:

Artikkelin sisältö varmistettu: kaikki kuvat paikoillaan

Viimeinen silaus: juuren index.php

Jäljellä on enää index.php-tiedoston päivitys julkisessa juuressa. Poista huoltosivu ja määritä oikea polku wp-blog-header.php-tiedostoon ottaen alihakemisto huomioon:

1<?php
2define( 'WP_USE_THEMES', true );
3require( dirname( __FILE__ ) . '/subdir/wp-blog-header.php' );

Sivusto avautuu juuri-URL-osoitteessa ja kaikki resurssit latautuvat alihakemistosta:

Sivusto toimii onnistuneesti alihakemistoon siirron jälkeen

Siirry uudelleen kohtaan Asetukset → Permalinkit ja tallenna ilman muutoksia, jotta WordPress päivittää URL-rakenteen.

Vaihtoehtoiset työkalut ja virallinen menetelmä

Yllä kuvattu lähestymistapa WP Migrate DB Prolla on kätevä, mutta ei ainoa vaihtoehto. Tässä muita työkaluja, joita voit käyttää:

  • *WP-CLI search-replace.* Komento wp search-replace '//oldsite.local/subdir' '//newsite.com' --dry-run-lipulla näyttää ensin, kuinka monta esiintymää korvataan. Valikoivaa korvausta varten (juuri → alihakemisto) rajaa kaava: wp search-replace '//newsite.com/wp-content' '//newsite.com/subdir/wp-content'.

  • Virallinen WordPress-menetelmä. Dokumentaatio osoitteessa developer.wordpress.org kuvaa "Giving WordPress Its Own Directory" -menettelyn, jossa on yksityiskohtaiset konfiguraatiot Apachea (.htaccess), nginxiä (server block) ja IIS:ää (web.config) varten. Menetelmä ei vaadi lisäosia ja toimii millä tahansa hostingilla.

  • Manuaalinen SQL. Jos muokkausten määrä on pieni, voit suorittaa UPDATE wp_posts SET post_content = REPLACE(post_content, '/subdir/', '/') suoraan phpMyAdminissa, mutta aina varmuuskopion kanssa, sillä tällainen korvaus tuhoaa serialisoidun datan wp_options- ja wp_postmeta-taulukoissa.

Minkä työkalun valitsetkin, sääntö on sama: kun siirrät JUURI → ALIHAKEMISTO, korvaa vain /wp-content ja tiedostopolut; kun siirrät ALIHAKEMISTO → JUURI, korvaa kaikki, mikä viittaa alihakemistoon.

⁉️🤔 Usein kysytyt kysymykset

Tarvitaanko WP Migrate DB Prota tämäntyyppiseen migraatioon?

Ei. WP Migrate DB Pro tarjoaa vain kätevän käyttöliittymän search-replace-toiminnolle, joka ymmärtää PHP:n serialisoitua dataa. Teknisesti voit tehdä samat korvaukset WP-CLI:n kautta (wp search-replace -komento käsittelee myös serialisoidut merkkijonot oikein) tai käyttää virallista WordPress-menetelmää manuaalisella tiedostonsiirrolla ja index.php:n muokkauksella. Lisäosa säästää aikaa suurissa ja keskikokoisissa projekteissa, joissa on paljon esiintymiä.

Mitä teen, jos osa kuvista ei vieläkään lataudu migraation jälkeen?

Yleisin syy: tietokantaan on jäänyt kovakoodattuja URL-osoitteita absoluuttisilla poluilla vanhalta palvelimelta, eivätkä ne täsmänneet korvauskaavaan. Tarkista artikkelien sisältö phpMyAdminin kautta: SELECT ID, post_content FROM wp_posts WHERE post_content LIKE '%/subdir/%' (tai vanha domain). Toinen ehdokas on selaimen ja CDN:n välimuisti: tyhjennä molemmat ja tarkista incognito-tilassa.

Täytyykö.htaccess päivittää siirron jälkeen?

Jos käytät selkeitä permalinkkejä, kyllä, mutta WordPress tekee tämän automaattisesti, kun napsautat "Tallenna" Asetukset → Permalinkit -sivulla. Jos palvelimella ei ole kirjoitusoikeuksia, WordPress näyttää valmiin.htaccess-sisällön kopioitavaksi manuaalisesti. Kun siirrät alihakemistoon, varmista, ettei juuren.htaccess (ei alihakemiston sisällä oleva) sisällä sääntöjä, jotka ovat ristiriidassa uuden rakenteen kanssa.

Onko mahdollista suorittaa migraatio ilman käyttökatkoa?

Teknisesti kyllä, jos käytät menetelmää.htaccess-uudelleenohjauksilla (virallisen WordPress-dokumentaation menetelmä I, "Without changing URLs"). Tässä lähestymistavassa tiedostot siirretään alihakemistoon, kun juuren.htaccess ohjaa kaikki pyynnöt saumattomasti uuteen sijaintiin. Vierailijat eivät huomaa siirtoa. Haittapuoli: pysyt samassa domainissa, eikä sivuston URL muodollisesti muutu (alihakemisto ei näy osoiterivillä).

Miksi WP Migrate DB Pro ei tue migraatiota eri asennustyyppien välillä suoraan paketista?

Delicious Brainsin kehittäjät keskustelivat tästä GitHubissa lähes kolme vuotta. Ongelman ydin: lisäosa soveltaa YHTÄ search-replace-paria KOKO tietokantaan, mutta migraatio juuren ja alihakemiston välillä vaatii ERI korvauksia eri URL-ryhmille (sivut vs. resurssit). Sen automaattinen määrittäminen, mikä URL kuuluu mihinkin ryhmään, vaatisi sisällön rakenteen jäsentämistä, mikä menee yksinkertaista search-replacea pidemmälle. Siksi nykyinen suositus on: tuo sivustot yhtenäiseen asennusmalliin ENNEN migraatiota.

Siirtotukikeskustelu GitHubissa Delicious Brainsilla

Lopputulos: juureen vai alihakemistoon?

Valinta juuriasennuksen ja alihakemistoon tehtävän WordPress-asennuksen välillä kiteytyy yhteen kompromissiin. Juuriasennus on yksinkertaisempi: vähemmän liikkuvia osia, suora yhteensopivuus kehitys- ja tuotantoympäristön välillä, ei yllätyksiä kaksien URL-osoitteiden kanssa. Alihakemistoasennus on arkkitehtonisesti siistimpi: ydintiedostot on eristetty, juuressa on vain index.php, WordPressin päivittäminen Gitin/Composerin kautta on helpompaa ja usean sovelluksen isännöinti yhdellä verkkotunnuksella on turvallisempaa.

Jos sinulla on yksi tuotantosivusto ja yksi kehityssivusto, yhdenmukaista molemmat samaan malliin (kumpaan tahansa) ja unohda koko ongelma. Jos työskentelet tiimissä, jossa jotkin projektit ovat historiallisista syistä juuressa ja toiset alihakemistoissa, tiedät nyt tarkat haku- ja korvausmallit kumpaankin suuntaan.

Pääsääntö, joka kannattaa laittaa muistiin: kun siirrät JUURI → ALIHAKEMISTO, koske vain /wp-content-kansioon ja tiedostopolkuihin; kun siirrät ALIHAKEMISTO → JUURI, korvaa kaikki, mikä sisältää alihakemiston. Ja aina, aina klikkaa "Tallenna" Osoiterakenteet-sivulla siirron jälkeen.