Skip to content
🛠 2 Tapaa saada WordPressin juuripolku

🛠 2 Tapaa saada WordPressin juuripolku

Sisällytät tiedoston functions.php-tiedostoon, eikä WordPress löydä sitä. Kuulostaako tutulta? Syy on melkein aina virheellinen polku juurikansioon.

Käsin kovakoodattu /var/www/html/ hajoaa, kun siirrät sivuston eri palvelimelle. Ja jäykästi leivottu ../../wp-content/plugins/ lakkaa toimimasta, kun hakemistorakenne muuttuu. Onneksi WordPress tarjoaa kaksi standarditapaa saada absoluuttinen polku sivuston juureen ilman arvailua. Molemmat sisältävät loppukauttaviivan suoraan laatikosta, joten alipolkujen yhdistäminen ei vaadi ylimääräistä /-merkkiä.

Tämän postauksen loppuun mennessä tiedät tarkalleen, milloin käyttää get_home_path()-funktiota ja milloin ABSPATH-vakiota, ja miksi ne täsmäävät joissakin projekteissa mutta palauttavat eri hakemistoja toisissa. Bonuksena käsittelemme yleisen tuplakauttaviivavirheen ja skenaarion ulkoisille cron-skripteille.

💡 Pikaopas:

  • Avaa teemasi functions.php ja sisällytä wp-admin/includes/file.php, kutsu sitten get_home_path() saadaksesi absoluuttisen polun loppukauttaviivalla
  • Käytä ABSPATH-vakiota tiedostosta wp-config.php; se on käytettävissä globaalisti, ei vaadi manuaalista sisällyttämistä ja toimii jopa julkisella puolella
  • Epästandardin hakemistorakenteen (Bedrock, siirretty ydin) kanssa vertaa molempien metodien tulostetta testipalvelimella; ne saattavat osoittaa eri kansioihin
  • WordPress.org-hakemiston kautta jaeltaville lisäosille ja teemoille käytä ABSPATH-vakiota; se on standardi, joka toimii luotettavasti millä tahansa hotellilla

Ominaisuus

get_home_path()

ABSPATH

Missä määritelty

wp-admin/includes/file.php

wp-config.php

Saatavuus

Vain ylläpito / require_once-kutsun jälkeen

Globaali

Loppukauttaviiva

Aina mukana /

Aina mukana /

Täsmäävätkö ne

Vakioasennuksessa kyllä

Vakioasennuksessa kyllä

Milloin eroavat

Ydin on siirretty pois dokumenttijuuresta

Bedrock, mukautettu rakenne

1. Get_home_path(): polku ylläpidon API:n kautta

get_home_path()-funktio on dokumentoitu virallisessa WordPress-dokumentaatiossa ja palauttaa absoluuttisen tiedostojärjestelmäpolun asennuksen juureen, hakemistoon, joka sisältää wp-admin-, wp-includes- ja wp-content-kansiot. Toisin kuin manuaalinen kovakoodaus, se ei riipu hotelliympäristöstä eikä hajoa migraation yhteydessä.

Tärkein etu: sinun ei tarvitse arvailla, onko sivusto julkaistu verkkotunnuksen juuressa vai alihakemistossa. Funktio selvittää sen ja palauttaa esimerkiksi /var/www/html/ vakioasennukselle tai /home/user/site.com/wordpress/ alikansiossa olevalle sivustolle. Ei ../../-polkuja eikä manuaalisia konfiguraatiomuokkauksia.

Funktion sisältävä tiedosto sijaitsee polussa wp-admin/includes/file.php, joten get_home_path() ei ole suoraan käytettävissä teemassa tai julkisella puolella. Käyttääksesi sitä ylläpitoalueen ulkopuolella, sisällytä tiedosto ensin manuaalisesti. Lisää koodi lapsiteemasi functions.php-tiedostoon tai lisäosan, kuten Code Snippetsin, kautta:

1// Include the file with the function — without it get_home_path() will cause a fatal error
2require_once ABSPATH . 'wp-admin/includes/file.php';
3
4// Get the absolute path to the WordPress root
5$root = get_home_path();
6
7// Example: include the update.php file from wp-admin
8require_once $root . 'wp-admin/update.php';

Tässä require_once yhdessä ABSPATH-polusta rakennetun polun kanssa lataa ylläpitotiedoston vain kerran; toinen sisällytys ei aiheuta ristiriitaa. Tämän jälkeen get_home_path() on käytettävissä missä tahansa teemassa.

Huomio: loppukauttaviiva on jo mukana palautetussa merkkijonossa. Yhdistä alipolut ilman ylimääräistä aloittavaa /-merkkiä: $root . 'wp-admin/update.php', ei $root . '/wp-admin/update.php'. PHP nielee tuplakauttaviivan hiljaisesti useimmissa tiedostojärjestelmissä, mutta jotkin tiukat file_exists()-tarkistukset saattavat kompastua.

2. ABSPATH: vakio suoraan tiedostosta wp-config.php

ABSPATH on vakio, jonka WordPress määrittelee wp-config.php-tiedostossa käynnistyksen aikana. Vakiotiedostossa se näyttää tältä:

1if (!defined('ABSPATH')) {
2 define('ABSPATH', __DIR__ . '/');
3}

__DIR__ palauttaa hakemiston, jossa wp-config.php itse sijaitsee, ja se on WordPress-juuri. Vakio on käytettävissä globaalisti: teemoissa, lisäosissa, julkisella puolella, ylläpidossa, WP-CLI:ssä. Sen lataamiseen ei tarvita require_once-kutsua; se on jo muistissa siitä hetkestä lähtien, kun ydin käynnistyy.

Käyttö on triviaalia: käytä ABSPATH-vakiota missä tahansa absoluuttista polkua tarvitaan:

1// Save the path to a variable for readability
2$rootPath = ABSPATH;
3
4// Include the file from wp-admin
5require_once ABSPATH . 'wp-admin/update.php';
6
7// Or load a custom file from the root
8include_once ABSPATH . 'custom-cron.php';

Loppukauttaviiva on tässäkin mukana, käyttäytyminen identtinen get_home_path()-funktion kanssa. Kaava require_once ABSPATH . 'wp-admin/update.php' toimii millä tahansa hotellilla, missä tahansa hakemistorakenteessa, ilman polkusäätöjä. Juuri siksi useimmat WordPress.org-hakemiston lisäosat käyttävät ABSPATH-vakiota get_home_path()-funktion sijaan: vakio ei vaadi manuaalista tiedoston sisällyttämistä eikä riipu kutsukontekstista.

Milloin get_home_path() ja ABSPATH palauttavat eri hakemistot

Tavallisessa WordPress-asennuksessa molemmat konstruktiot palauttavat saman merkkijonon. Mutta on kaksi skenaariota, joissa ne eroavat, ja jos et ole niistä tietoinen, bugi voi elää koodissasi kuukausia.

Ydin on siirretty pois dokumenttijuuresta. Jotkut hotellipalveluntarjoajat (Kinsta, WP Engine) ja mukautetut asetukset sijoittavat ydintiedostot erilliseen hakemistoon, ja wp-config.php on yhtä tasoa ylempänä. Tässä tapauksessa ABSPATH osoittaa wp-config.php-tiedoston sisältävään kansioon, kun taas get_home_path() osoittaa ytimen sisältävään alihakemistoon. WordPress StackExchangessa kehittäjät jakavat todellisen esimerkin: ABSPATH = /www/site/, kun taas get_home_path() = /www/site/wp/. Yhden hakemiston ero, ja require_once epäonnistuu fataalilla virheellä.

Bedrock ja muut epästandardit rakenteet. Roots-yrityksen Bedrockissa sivuston juuri (web/wp/) on erillään projektin juuresta, joka sisältää config/-, vendor/- ja web/-kansiot. ABSPATH Bedrockissa osoittaa polkuun web/wp/, kun taas get_home_path() suuntautuu monisivustoasetusten ja kotiosoitteen perusteella. Käytännössä get_home_path() Bedrockissa saattaa palauttaa polun web/wp/, joka täsmää ABSPATH-vakion kanssa, mutta älä luota siihen; varmista omassa projektissasi.

Käytännön johtopäätös: jos kirjoitat lisäosaa WordPress.org-hakemistoon, käytä ABSPATH-vakiota; se on saatavilla kaikkialla ilman ylimääräisiä sisällytyksiä. Jos kirjoitat koodia tietylle sivustolle, jolla on epästandardi rakenne, tarkista molemmat vakiot testiympäristössä ja valitse se, joka osoittaa sinne, minne todella tarvitset. Viiden minuutin vertailu testipalvelimella säästää tunteja debuggausta tuotannossa.

Teemoihin liittyy vielä yksi vivahde: jos teemasi jaellaan ThemeForestissa tai WordPress.org-hakemistossa, käytä aina ABSPATH-vakiota; se on taatusti määritelty minkä tahansa asiakkaan hotellilla. get_home_path() ei välttämättä toimi, jos teema kutsuu sitä ennen ylläpitoalueen latautumista.

Yllä oleva lyhyt video havainnollistaa visuaalisesti, kuinka ABSPATH suojaa lisäosia suoralta suoritukselta ja miksi defined('ABSPATH') or die -kaava on tietoturvastandardi jokaiselle PHP-tiedostolle WordPress-ekosysteemissä.

⁉️🤔 Usein kysytyt kysymykset

Kumpi on nopeampi: get_home_path() vai ABSPATH?

ABSPATH on vakio: sen arvo määritellään kerran WordPressin latautuessa ja tallennetaan muistiin. get_home_path() on funktio, joka ensimmäisellä kutsullaan jäsentää kotiosoitteen ja laskee polun suhteessa tiedostojärjestelmään. Nopeusero on häviävän pieni (mikrosekunteja per kutsu), mutta jos polkua kysytään kymmeniä kertoja yhden HTTP-pyynnön aikana, tallenna ABSPATH muuttujaan skriptisi alussa ja käytä sitä.

Tarvitseeko ABSPATH sisällyttää manuaalisesti omiin tiedostoihini?

Jos koodisi suoritetaan WordPress-kontekstissa (teema, lisäosa, AJAX-käsittelijä), ABSPATH on jo määritelty; sinun ei tarvitse sisällyttää mitään. Tarkistus if (!defined('ABSPATH')) { exit; } itsenäisen PHP-tiedoston alussa sivuston juuressa on hyvä tietoturvakäytäntö: se estää skriptin suoran suorituksen WordPressin ohi ja suojaa tietovuodoilta, jotka johtuvat suorasta HTTP-pyynnöstä tiedostoon.

Voinko käyttää ABSPATHia ulkoisessa cron-skriptissä?

Voit, mutta varoen. Jos skripti sijaitsee WordPress-asennuksen ulkopuolella, lataa wp-load.php: require_once '/path/to/wp-load.php';. Tämän jälkeen ABSPATH tulee saataville. Pidä mielessä: wp-load.php-tiedoston kutsuminen suoraan lataa koko ytimen ja kaikki aktiiviset lisäosat, mikä on ylimitoitettua tiheille cron-ajoille. Vilkkaille projekteille on parempi siirtää logiikka WP-CLI-komentoon.

Palauttaako get_home_path() polun, jossa on tuplakauttaviiva?

Ei. Funktio palauttaa taatusti yhden loppukauttaviivan. Tuplakauttaviiva voi ilmestyä vain, jos lisäät itse /-merkin alipolun alkuun: get_home_path() . '/wp-admin/'. Oikea tapa on ilman aloittavaa kauttaviivaa: get_home_path() . 'wp-admin/'. Useimmissa Linux-järjestelmissä tuplakauttaviiva vastaa yksittäistä, mutta älä luota siihen; file_exists()-tarkistukset joissakin konfiguraatioissa saattavat palauttaa false.

Miten juuripolku eroaa kotiosoitteesta?

Juuripolku (/var/www/html/) on palvelimen tiedostojärjestelmä. Kotiosoite (https://site.com) on osoite, jonka selain näkee. Saadaksesi URL-osoitteen, käytä home_url()-funktiota; tiedostojärjestelmäpolulle käytä get_home_path()- tai ABSPATH-funktiota. Älä sekoita niitä: require_once odottaa tiedostojärjestelmäpolkua, wp_remote_get() odottaa URL-osoitetta. Jos sekoitat ne, saat joko false-arvon file_exists()-funktiosta tai rikkinäisen HTTP-pyynnön paikalliseen polkuun.

Mitä käyttää projektissasi: lopputulos

Valtaosaan tehtävistä ABSPATH riittää. Vakio on käytettävissä heti WordPressin latauduttua, ei vaadi manuaalista tiedoston sisällyttämistä ja toimii identtisesti millä tahansa hotellilla. Jos kirjoitat lisäosaa tai teemaa jaeltavaksi, vain ABSPATH, ei vaihtoehtoja.

Jos hallinnoit sivustoa, jolla on epästandardi hakemistorakenne (siirretty ydin, Bedrock, monisivusto eri kotiosoitteilla), käytä viisi minuuttia ja vertaa get_home_path()- ja ABSPATH-funktioiden tulostetta testiympäristössä. Yhden hakemiston poikkeama voi maksaa tunteja debuggausta tuotannossa.

Kumpaa metodia sinä käytät, get_home_path() vai ABSPATH? Kerro meille kommenteissa: luemme jokaisen.