✅ WEB- ja WordPress -uutiset, -teemat, -laajennukset. Täällä jaamme vinkkejä ja parhaita verkkosivustoratkaisuja.

Tiedostojen lataaminen WordPress Revisitedissä, osa 2 – Palvelinpuoli

11

Ennen kuin hyppään suoraan tämän koodiin, halusin mainita kaksi asiaa:

  1. Kyllä, olen käsitellyt tätä vähän aikaa sitten,
  2. Ja tämä on kaksiosaisen sarjan toinen osa.

Jos et ole lukenut ensimmäistä osaa, tee se ensin. Ajatuksena on, että koodi toimii yhdessä sen kanssa, mitä aion käsitellä tässä viestissä varmistaakseen, että sekä asiakas- että palvelinpuoli on katettu.

Loppujen lopuksi syy sen purkamiseen ei ole vain varmistaa, että asiat tehdään oikein, vaan myös varmistaa, että käyttäjällä on mahdollisimman positiivinen kokemus.

Näin voit ladata tiedostoja WordPressiin palvelinpuolella.

Tiedostojen lataaminen WordPressiin palvelinpuolella

Huomaa, että vaikka on olemassa joitain turvatarkastuksia, jotka voidaan – ja pitäisi – tehdä, en ole vielä löytänyt tapaa, joka olisi täysin idioottivarma sen havaitsemiseksi, että ladattava tiedosto on oikean tyyppistä.

Tämä tarkoittaa, että on edelleen mahdollista, että virheellinen tiedostotyyppi voidaan ladata. Se, onko tämä haitallinen vai ei, on tietysti loppukäyttäjän päätettävissä. Kerron vain tämän tehdäkseni selväksi, että näytettävä koodi on niin hyvä kuin voin tarjota, mutta että sinun tulee silti käyttää harkintavaltaa.

Ehkä kannattaa jopa etsiä kolmannen osapuolen kirjastoa binääritietojen validoimiseksi, kun ne on vastaanotettu. Mutta poikkean.

1 Tarkista käyttäjien käyttöoikeudet

Muista, että aina kun olemme luoneet käyttöliittymän, WordPressin on luotava nonce, jotta voimme varmistaa tämän avulla, että käyttäjällä on lupa ladata tiedosto.

Noncen tarkistamisen lisäksi haluan tarkistaa useita muita asioita, jotka kaikki on kääritty menetelmään nimeltä userCanSave.

Muista ensin käyttöliittymä:

<form method="post"
      enctype="multipart/form-data"
      action="<?php echo esc_html(admin_url('admin-post.php')); ?>"">
    <!-- Snip For Brevity --->
    <?php
    wp_nonce_field(
        'acme-item-upload',
        'acme-item-importer'
    );
    ?>
</form>

Katso sitten, kuinka käytän sitä koodissa. Ensin määritän userCanSave- funktion :

<?php

/**
 * Determines if the current user has permission to upload a file based on their current role and the values
 * of the security nonce.
 *
 * @param  string $nonce     The WordPress-generated nonce.
 * @param  string $action    The developer-generated action name.
 * @return bool              True if the user has permission to save; otherwise, false.
 */
private function userCanSave($nonce, $action)
{
    $isNonceSet   = isset($_POST[$nonce]);
    $isValidNonce = false;

    if ($isNonceSet) {
        $isValidNonce = wp_verify_nonce($_POST[$nonce], $action);
    }

    return ($isNonceSet && $isValidNonce);
}

Ja sitten kutsun tätä yksinkertaisesti prosessin alussa. Jos se epäonnistuu, palaan takaisin.

<?php

/**
 * Assuming the user has permission, verifies the security nonce and uploads the PDF file to the `uploads`
 * directory and the Media Library.
 */
public function save()
{
  if (!$this->userCanSave('acme-item-importer', 'acme-item-upload')) {
    return;
  }

  // More to come...

}

Suosittelen virheilmoituksen näyttämistä, mutta poikkean tästä asiasta, koska viestissä on joitain tapoja tehdä tämä.

2 Lataa tiedosto

Olettaen, että käyttäjällä on oikeus tarkistaa tiedosto, tiedoston lataaminen on turvallista. Prosessi tämän tekemiseksi on yksinkertaista, mutta vaatii silti hieman työtä WordPress API:n (eli wp_upload_bits- funktion) kanssa.

Ensin tiedosto täytyy napata PHP:n $_FILES globaalista tiedostosta ja ladata sitten. Kun teet niin, on kuitenkin tärkeää varmistaa, että lataat tiedoston oikealla tiedostotunnisteella (ainakin).

<?php

$file_type = explode('.', $filename);
$file_type = strtolower($file_type[count($file_type) - 1]);
if ('pdf' !== $file_type) {
  // Give your feedback of choice here.
}

Jos tiedostotyyppi ei ole PDF, voit tehdä virheilmoituksen, palauttaa sen (vaikka en ole tämän fani) tai antaa käyttäjälle palautetta (mitä minä pidän).

<?php

if ($uploadFile['error']) {
  // Your preferred method of feedback here.
}

Viimeinen vaihe on kuitenkin tiedoston saaminen median latausohjelmaan.

3 Lataaminen Media Uploader -laitteeseen

Viimeinen vaihe kaikessa tässä on tiedoston saaminen median latausohjelmaan. Tätä varten tarvitset useita asioita WordPress-ytimestä:

  1. tiedosto.php-kirjasto,
  2. liitetiedosto, joka tarvitaan kertomaan WordPressille, mitä lisätään,
  3. WordPress API -toiminto, wp_insert_attachment
  4. ohjataan takaisin kutsuvalle sivulle

Kuulostaa paljon, eikö? Se ei ole liian huono.

Yleensä ryhmittelen WordPress-tiedostokirjaston ja wp_insert_attachmentin sisällyttämisen yhdeksi lohkoksi.

Huomaat, että asetan MIME-tyypiksi pdf ja varmistan, että otsikko ei sisällä mitään muuta kuin tiedoston nimeä. Tämän jälkeen lataan tiedoston mediakirjastoon käyttämällä wp_insert_attachment -ohjelmaa.

Sen täydellinen koodi on seuraava:

<?php

require_once(ABSPATH. "wp-admin". '/includes/file.php');
$attachment  = array(
    'post_mime_type' => 'pdf',
    'post_title'     => preg_replace('/.[^.]+$/', '', $filename),
    'post_status'    => 'inherit'
);
$attachment_id = wp_insert_attachment($attachment, $uploadFile['file']);

Tämän jälkeen ohjaan takaisin sivulle, joka aloitti tämän kaiken (joka on yleensä admin-sivu, jonka näimme edellisessä viestissä. Tätä varten nappaan _wp_http_refererin PHP:n $_REQUEST – taulukosta.

<?php
wp_safe_redirect(
    $_REQUEST['_wp_http_referer'],
    301
);
exit;

Ja se ohjaa käyttäjän takaisin sivulle, josta hän tuli.

Ja tiedosto on ladattu

Tässä vaiheessa olemme päättäneet, mitä haluamme tehdä:

  1. Tarjoa kunnollinen asiakaskokemus,
  2. Ladattu tiedosto mediakirjastoon (mahdollisuudella antaa palautetta)
  3. Ja ohjattiin takaisin sivulle, josta kaikki alkoi.

Myönnettäköön, että tässä on paljon tilaa palautteelle, ja kehotan sinua muokkaamaan tätä koodisi tarpeen mukaan, mutta tarvitsemasi perusteet tulisi antaa sekä edellisessä viestissä että tässä viestissä.

Tämä verkkosivusto käyttää evästeitä parantaakseen käyttökokemustasi. Oletamme, että olet kunnossa, mutta voit halutessasi kieltäytyä. Hyväksyä Lisätietoja