WordPressin kehittyminen blogging-alustasta täysimittaiseen CMS-järjestelmään tekee sen samanaikaisesti kiinteäksi kehykseksi, jonka avulla kehittäjät voivat rakentaa erinomaisia ​​projekteja ja sovelluksia.

WordPress-ydin, ei ainoastaan ​​käyttäjien julkaisukone, vaan myös kehittäjille, joilla on vahva joukko luokkia, sovellusliittymiä ja apulaisia, jotka on suunniteltu vastaamaan monenlaisiin tarpeisiin.

Yksi WordPressin piilotetuista helmiä, jonka avulla kehittäjät voivat tehdä paikallisen tiedostojärjestelmän toimintaa turvallisella ja tukevalla tavalla, on WordPress-tiedostojärjestelmä-sovellusliittymä. Se tiivistää tiedoston manipulointi toiminnallisuuden joukkoon yleisesti pyydettyjä menetelmiä, jotta niitä voidaan käyttää turvallisesti eri hosting-ympäristöissä.

Ongelma

Paikallisten tiedostojen kirjoittamiseen koodilla voi olla useita syitä:

  • Tapahtumien kirjaaminen tai suoritetut toimet
  • Tiedonvaihto ei-WordPress-järjestelmien kanssa
  • Varmuuskopioida

Riippumatta motiiveista, paikallisten tiedostojen kirjoittaminen PHP-koodista voi olla riskialtis toiminta. Ainakin kaksi erittäin tärkeätä haastetta on otettava huomioon toteutettaessa tätä varten WordPress-teema, laajennus tai mukautettu asennus:

  1. Turvallisuus. On olemassa väärä tiedostojen omistajuus, kun kirjoitetaan paikallisia tiedostoja koodilla (web-palvelimella). Tämä ongelma ilmenee huonosti määritetyissä jaetun hosting -ympäristöissä ja saattaa johtaa tiedostojen hallintaan.
  2. Yhteensopivuus. Koska hostingyritysten monipuolisuus on olemassa, tietyn käyttäjän palvelinasetukset ovat yleensä tuntemattomia kehittäjälle. Näin ollen kehittäjä ei voi olla varma siitä, että kirjoitusoperaation edellyttämät käyttöoikeudet ovat pluginin tai teeman käyttäjän käytettävissä.

Jos WordPress-plugin tai teema, joka tarvitsee paikallisten tiedostojen kirjoittamista, on tarkoitettu julkiseen julkaisuun, kehittäjän on jatkuvasti kiinnitettävä huomiota näihin asioihin. Hyvä uutinen on, että WordPressillä on jo työkalu näiden ongelmien ratkaisemiseen: Filesystem API.

Johdatus WordPress Filesystem API: iin

Tiedostosovellusliittymä lisättiin WordPressiin versiossa 2.6, jotta WordPressin oma päivitysominaisuus voitaisiin ottaa käyttöön. Se tiivistää toiminnot, joita tarvitaan luku- ja kirjoitusoperaatioiden turvalliseen käsittelyyn ja erilaisiin isäntätyyppeihin. Se koostuu joukosta luokkia, ja voit valita automaattisesti oikean tavan muodostaa yhteys paikalliseen tiedostojärjestelmään yksittäisten isäntäasetusten mukaan.

API: n takana oleva logiikka on melko yksinkertainen; se yrittää kirjoittaa paikallisia tiedostoja suoraan ja virheellisen tiedoston omistajan tapauksessa vaihtaa toiseen FTP-pohjaiseen menetelmään. Käytettävissä olevista PHP-kirjastoista riippuen se löytää sopivan tavan konfiguroida FTP-yhteys (laajennuspistokkeiden kautta tai yli-SSH: n avulla). Yleensä paikallisia tiedostoja varten tarvitaan seuraavia vaiheita:

Vaihe 1. Tunnista, mikä yhteysmenetelmä on käytettävissä

WordPress käyttää get_filesystem_method havaitakseen seuraavien menetelmien saatavuuden (korkeimmasta prioriteetista alimpaan) Suorat, SSH2, FTP-PHP-laajennus, FTP-liitännät.

Vaihe 2. Hanki tunnistetulle menetelmälle tarvittavat tunnistetiedot

Jos havaittu liikenne tarvitsee käyttäjätietoja, WordPress käyttää request_filesystem_credentials -toimintoa saadakseen esiin pyynnön. Funktiolla on useita parametreja, joiden avulla se voi säilyttää tietoja lomakkeiden välityksellä, pyytää valtuustietoja useita kertoja, jos yhteys epäonnistuu ja kohdistaa tiettyyn hakemistoon WordPress-asennuksessa:

request_filesystem_credentials($form_post, $type, $error, $context, $extra_fields);

Toimittamalla tyhjä $ type -parametri funktioon voisimme pakottaa sen havaitsemaan käytettävissä olevat yhteysmenetelmät, joten se kutsuisi get_filesystem_method meille. Samalla voimme pakottaa funktion käyttämään mitä tahansa tietyn yhteystyypin määrittämällä se käyttäen $ tyyppistä argumenttia.

Kun valittua menetelmää varten vaadittavat yhteysdataa ei ole, toiminto tulostaa lomakkeen pyytääkseen sitä:

Conneciton information

Ensimmäisen pyynnön jälkeen WordPress tallentaa FTP-palvelimen nimen ja käyttäjänimen tietokantaan myöhempää käyttöä varten, mutta se ei tallenna salasanaa. Vaihtoehtoisesti FTP-tunnistetiedot voitaisiin määrittää wp-config.php -tiedostossa seuraavien vakiojen avulla:

  • FTP_HOST - palvelimen isäntäkone, johon yhteys muodostetaan
  • FTP_USER - käyttäjätunnus, johon haluat liittyä
  • FTP_PASS - salasanan, jolla voit muodostaa yhteyden
  • FTP_PUBKEY - julkisen avaimen polku SSH2-yhteyden käyttöön
  • FTP_PRIKEY - yksityisen avaimen polku SSH2-yhteyden käyttöön

Kun nämä tiedot tallennetaan wp-config.php-tiedostoon, tunnistetietopyyntölomake ei tule näkyviin, mutta turvallisuusongelmat ovat merkittäviä ja turvallisuusmenettelyjä on tarkistettava kolminkertaisesti ja mahdollisimman suurta huomiota kiinnitettävä tämän tiedoston suojaukseen.

Vaihe 3. Aloita WordPress-tiedostojärjestelmän luokka ja liitä tiedostojärjestelmä

WordPress-tiedostojärjestelmän API on WP_Filesystem-funktio. Se lataa ja alustaa asianmukaisen kuljetusluokan, tallentaa saadun esiintymän globaalissa $ wp_filesystem -objektissa myöhempää käyttöä varten ja yrittää muodostaa yhteyden tiedostojärjestelmään toimitettujen tunnistetietojen avulla:

WP_Filesystem($args, $context);

Vaihe 4. Käytä WordPress Filesystem -menetelmiä lukemis- / kirjoitustoimintojen suorittamiseen

Oikein alustettu $ wp_filesystem -objektissa on joukko menetelmiä kommunikoida paikallisen tiedostojärjestelmän kanssa, jota voitaisiin käyttää ilman mitään muita ahdistuneisuutta yhteystyypistä. Erityisesti noudatetaan yleisesti käytettyjä menetelmiä:

  • get_contents - lukee tiedoston merkkijonoksi
  • put_contents - kirjoittaa merkkijonon tiedostolle
  • mkdir - luo hakemiston
  • mdir - poistaa hakemiston
  • wp_content_dir - palauttaa polun paikallisessa tiedostojärjestelmässä wp-content-kansioon
  • wp_plugins_dir - palauttaa polun paikalliseen tiedostojärjestelmään plugins-kansioon
  • wp_themes_dir - palauttaa paikallisen tiedostojärjestelmän polun teemakansioon

Kun kokoat yhteen, esittelemme esimerkin, joka suorittaa edellä mainitut vaiheet yksinkertaisessa tilanteessa - kirjoitamme tekstialueelle lähetetyn tekstin tavalliseen .txt-tiedostoon.

Huomaa, että tämä esimerkki on tarkoitettu demonstrointitarkoituksiin, kun reaalimaailmassa ei tallennettaisi yksinkertaista tekstidataa .txt-tiedostossa, se olisi paljon vankempi ratkaisu tallentaa sen tietokantaan sen sijaan.

WordPress-tiedostojärjestelmä API toimii

Kääritään koodimme erillisessä pluginissa, jolla on oma tiedostojärjestelmä-demokansio. Tämä antaa meille kohdekansioon tallennettavan .txt-tiedoston ja tarkistamme kirjoitusoikeudet.

Ensinnäkin luomme demosivun, joka näyttää lomakkeen Työkalut-valikossa:

/*** Create Demo page (under Tools menu)***/add_action('admin_menu', 'filesystem_demo_page');function filesystem_demo_page() {add_submenu_page( 'tools.php', 'Filesystem API Demo page', 'Filesystem Demo', 'upload_files', 'filesystem_demo', 'filesystem_demo_screen' );}function filesystem_demo_screen() {$form_url = "tools.php?page=filesystem_demo";$output = $error = '';/*** write submitted text into file (if any)* or read the text from file - if there is no submission**/if(isset($_POST['demotext'])){//new submissionif(false === ($output = filesystem_demo_text_write($form_url))){return; //we are displaying credentials form - no need for further processing}  elseif (is_wp_error ($ output)) {$error = $output->get_error_message();$output = '';}  } else {// lukea tiedostosta (false === ($ output = filesystem_demo_text_read ($ form_url))) {palaa;  // näytämme valtuuskunnat ilman lisäkäsittelyä} elseif (is_wp_error ($ output)) {$error = $output->get_error_message();$output = '';}  } $ output = esc_textarea ($ output);  // pakenee tulostukseen?> 

Filesystem API Demo -sivu

Kun tarkastelemme sivuamme (filesystem_demo_screen), tarkistamme tekstin lähettämisen saatavuudesta. Jos se on olemassa, yritämme kirjoittaa sen test.txt-tiedostoon, muuten yritämme löytää tällaisen tiedoston plugin-kansioon ja lukea sen sisältö sisällytettäväksi textarea. Lopuksi tulostamme perusmuotoon tekstin syöttämiseksi. Luettavuuden vuoksi nämä kirjoitus- ja käsittelytoimet erotettiin omiin tehtäviinsä.

Filesystem API demo

Jotta vältetään päällekkäiset samat alustusvaiheet, jaettu apulainen on luotu. Se pyytää request_filesystem_credentials ensin havaitsemaan käytettävissä olevan yhteysmenetelmän ja hankkimaan tunnistetietoja. Jos tämä onnistui, se kutsuu sitten WP_Filesystem aloittamaan $ wp_filesystem kanssa annetuista tiedoista.

/*** Initialize Filesystem object** @param str $form_url - URL of the page to display request form* @param str $method - connection method* @param str $context - destination folder* @param array $fields - fileds of $_POST array that should be preserved between screens* @return bool/str - false on failure, stored text on success**/function filesystem_init($form_url, $method, $context, $fields = null) {global $wp_filesystem;/* first attempt to get credentials */if (false === ($creds = request_filesystem_credentials($form_url, $method, false, $context, $fields))) {/*** if we comes here - we don't have credentials* so the request for them is displaying* no need for further processing**/return false;}/* now we got some credentials - try to use them*/if (!WP_Filesystem($creds)) {/* incorrect connection data - ask for credentials again, now with error message */request_filesystem_credentials($form_url, $method, true, $context);return false;}return true; //filesystem object successfully initiated}

Kirjoittaminen tiedostolle näyttää tältä:

/*** Perform writing into file** @param str $form_url - URL of the page to display request form* @return bool/str - false on failure, stored text on success**/function filesystem_demo_text_write($form_url){global $wp_filesystem;check_admin_referer('filesystem_demo_screen');$demotext = sanitize_text_field($_POST['demotext']); //sanitize the input$form_fields = array('demotext'); //fields that should be preserved across screens$method = ''; //leave this empty to perform test for 'direct' writing$context = WP_PLUGIN_DIR . '/filesystem-demo'; //target folder$form_url = wp_nonce_url($form_url, 'filesystem_demo_screen'); //page url with nonce valueif(!filesystem_init($form_url, $method, $context, $form_fields))return false; //stop further processign when request form is displaying/** now $wp_filesystem could be used* get correct target file first**/$target_dir = $wp_filesystem->find_folder($context);$target_file = trailingslashit($target_dir).'test.txt';/* write into file */if(!$wp_filesystem->put_contents($target_file, $demotext, FS_CHMOD_FILE))return new WP_Error('writing_error', 'Error when writing file'); //return error objectreturn $demotext;}

Tässä osassa määritimme joitain välttämättömiä parametreja:

  • $ demotext - lähetetty teksti kirjoitettavaksi
  • $ form_fields - kohde $ _POST-matriisissa, joka tallentaa tekstimme ja joka pitäisi säilyttää
  • $ menetelmä - kuljetusmenetelmä, jätämme sen tyhjäksi havaitsemaan automaattisesti
  • $ context - kohdekansio (pluginin yksi)

Tämän jälkeen aloitimme maailmanlaajuisen $ wp_filesystem -objektin käyttäen aiemmin kuvattua auttamistoimintoa. Jos onnistumme, havaitsemme oikean polun kohdekansioon ja kirjoitamme sille lähetetyn tekstin käyttämällä $ wp_filesystem -objektin put_contents-menetelmää.

Tiedoston käsittelyssä oleva koodi näyttää tältä:

/*** Read text from file** @param str $form_url - URL of the page where request form will be displayed* @return bool/str - false on failure, stored text on success**/function filesystem_demo_text_read($form_url){global $wp_filesystem;$demotext = '';$form_url = wp_nonce_url($form_url, 'filesystem_demo_screen');$method = ''; //leave this empty to perform test for 'direct' writing$context = WP_PLUGIN_DIR . '/filesystem-demo'; //target folderif(!filesystem_init($form_url, $method, $context))return false; //stop further processing when request forms displaying/** now $wp_filesystem could be used* get correct target file first**/$target_dir = $wp_filesystem->find_folder($context);$target_file = trailingslashit($target_dir).'test.txt';/* read the file */if($wp_filesystem->exists($target_file)){ //check for existence$demotext = $wp_filesystem->get_contents($target_file);if(!$demotext)return new WP_Error('reading_error', 'Error when reading file'); //return error object}return $demotext;}

Tämä toiminto toimii samalla tavalla kuin aiemmin kuvattu, mutta se käyttää get_contents -ohjelmaa lukea kohdetiedostosta.

johtopäätös

Kun työskentelet paikallisten tiedostojen kanssa, WordPress-aiheet tai plugins-kehittäjät tulevat kosketuksiin turvallisuuden ja yhteensopivuusongelmien kanssa, asettaen jyrkästi stressiä tiimiin ja lisäävät pitkiä aikoja projektin elinkaareen. Tiedostojärjestelmä-sovellusliittymä perustuu näihin ongelmiin, jotka voidaan sivuuttaa tehokkaasti. Joten seuraavalla kerralla, kun kirjoitat fwrite-koodia plugin-koodiin, harkitse tätä vaihtoehtoa terveellisempää vaihtoehtoa.

Sinä pystyt Lataa demo tästä koodista täältä , ja mukauttaa sen tarpeisiisi.