✅ WEB ja WordPressi uudised, teemad, pistikprogrammid. Siin jagame näpunäiteid ja parimaid veebisaidi lahendusi.

Failide üleslaadimine WordPressis Revisited, 2. osa – serveripool

13

Enne selle koodi juurde hüppamist tahtsin mainida kahte asja:

  1. Jah, ma olen seda mõnda aega tagasi üksikasjalikult käsitlenud,
  2. Ja see on kaheosalise sarja teine ​​osa.

Kui te pole esimest osa lugenud, tehke seda kõigepealt. Idee seisneb selles, et kood töötab koos sellega, mida ma selles postituses käsitlen, et tagada nii kliendi- kui ka serveripoolne hõlmatus.

Lõppkokkuvõttes ei ole selle sellise lagunemise põhjus mitte ainult veenduda, et asjad on õigesti tehtud, vaid ka see, et kasutajal oleks võimalikult positiivne kogemus.

Seda arvestades toimige järgmiselt, kuidas WordPressi serveri poolel faile üles laadida.

Failide üleslaadimine WordPressis serveri poolel

Pange tähele, et kuigi on olemas turvakontrolle, mida saab – ja peakski – tegema, ei ole ma veel leidnud viisi, mis oleks täiesti lollikindel tuvastamaks, et üleslaaditav fail on õiget tüüpi.

See tähendab, et on endiselt võimalus, et üles laaditakse vale failitüüp. See, kas see on pahatahtlik või mitte, on ilmselt lõppkasutaja otsustada. Jagan seda, et olla selge, et kood, mida ma näitan, on nii hea kui suudan, kuid teil on siiski teatud kaalutlusõigus.

Võib-olla tasub isegi otsida kolmanda osapoole teeki, et binaarandmed pärast nende kättesaamist kinnitada. Aga ma kaldun kõrvale.

1 Kontrollige kasutaja õigusi

Pidage meeles, et iga kord, kui oleme esiotsa loonud, laseme WordPressil genereerida nonce’i, et saaksime seda kasutada veendumaks, et kasutajal on luba faili üleslaadimiseks.

Lisaks nonce’i kontrollimisele meeldib mulle kontrollida mitmeid muid asju, mis kõik on koondatud meetodisse nimega userCanSave.

Esiteks tuletage meelde esiosa:

<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>

Seejärel vaadake, kuidas ma seda koodis kasutan. Esiteks määratlen funktsiooni userCanSave :

<?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 siis ma lihtsalt nimetan seda protsessi alguses. Kui see ebaõnnestub, pöördun tagasi.

<?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...

}

Soovitan kuvada veateade, kuid kaldun sellel teemal kõrvale, kuna postituses on mõned võimalused seda teha.

2 Laadige fail üles

Eeldades, et kasutajal on luba faili kontrollida, on faili üleslaadimine ohutu. Protsess selle tegemiseks on lihtne, kuid nõuab siiski natuke tööd WordPressi API-ga (nimelt funktsiooniga wp_upload_bits ).

Esiteks tuleb fail PHP $_FILES globaalsest failist haarata ja seejärel üles laadida. Seda tehes on aga oluline veenduda, et laadite üles õige faililaiendiga faili (vähemalt).

<?php

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

Kui failitüüp ei ole PDF, saate teha vea, lihtsalt tagastada (kuigi ma ei ole selle fänn) või anda kasutajale tagasisidet (mida ma armastan).

<?php

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

Viimane samm on aga faili viimine meediumi üleslaadijasse.

3 Laadige see meedia üleslaadijasse

Selle kõige viimane samm on faili viimine meediumi üleslaadijasse. Selleks vajate WordPressi tuumast mitut asja:

  1. fail.php teek,
  2. manuste massiiv, mis on vajalik lisatavast WordPressile teatamiseks,
  3. WordPressi API funktsioon, wp_insert_attachment
  4. suunab tagasi helistavale lehele

Kõlab nagu palju, eks? See pole väga hull.

Tavaliselt rühmitan WordPressi failiteegi ja faili wp_insert_attachment kaasamise ühte plokki.

Märkate, et määran MIME tüübiks pdf ja veendun, et pealkiri ei sisaldaks midagi peale faili nime. Pärast seda kasutan faili meediumiteeki laadimiseks wp_insert_attachment .

Selle täielik kood on järgmine:

<?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']);

Pärast seda suunan ma tagasi lehele, kust see kõik alguse sai (mis on tavaliselt see administraatori leht, mida nägime eelmises postituses. Selleks haaran PHP massiivist $_REQUEST _wp_http_refereri.

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

Ja see suunab kasutaja tagasi lehele, kust ta tuli.

Ja fail on üles laaditud

Siinkohal oleme paika pannud, mida tahame teha:

  1. Pakkuge korralikku kliendipoolset kogemust,
  2. Laadis faili üles meediumiteeki (koos võimalusega anda tagasisidet)
  3. Ja suunati tagasi lehele, kust see kõik alguse sai.

Tõsi, selles on palju ruumi tagasisidele ja soovitan teil seda koodi jaoks vastavalt vajadusele kohandada, kuid selle, mida vajate, tuleks esitada nii eelmises postituses kui ka selles postituses.

See veebisait kasutab teie kasutuskogemuse parandamiseks küpsiseid. Eeldame, et olete sellega rahul, kuid saate soovi korral loobuda. Nõustu Loe rohkem