✅ WEB- och WordPress -nyheter, teman, plugins. Här delar vi tips och bästa webbplatslösningar.

Ladda upp filer i WordPress Revisited, del 2 – Serversidan

46

Innan jag hoppade direkt in i koden för detta ville jag nämna två saker:

  1. Ja, jag har täckt det här i detalj för ett tag sedan,
  2. Och detta är den andra delen av en serie i två delar.

Om du inte har läst den första delen, gör det först. Tanken är att koden ska fungera tillsammans med det jag ska ta upp i det här inlägget för att säkerställa att både klientsidan och serversidan täcks.

I slutändan är anledningen till att dela upp det så här inte bara för att se till att saker görs korrekt, utan också för att se till att användaren får en så positiv upplevelse som möjligt.

Med det sagt, så här går du tillväga för att ladda upp filer i WordPress på serversidan.

Ladda upp filer i WordPress på serversidan

Observera att även om det finns vissa säkerhetskontroller som kan – och bör – göras, har jag ännu inte hittat ett sätt som är helt idiotsäkert för att upptäcka att filen som laddas upp är av rätt typ.

Det betyder att det fortfarande finns en chans att en felaktig filtyp kan laddas upp. Huruvida detta är skadligt eller inte är uppenbarligen upp till slutanvändaren. Jag delar just detta för att vara tydlig med att koden jag kommer att visa är så bra som jag kan göra, men att det fortfarande finns en nivå av diskretion du bör använda.

Kanske är det värt att till och med leta efter ett tredjepartsbibliotek för att validera binära data när de väl har tagits emot. Men jag avviker.

1 Verifiera användarbehörigheter

Kom ihåg att när vi har skapat gränssnittet så låter vi WordPress generera en nonce så att vi kan använda detta för att se till att användaren har behörighet att ladda upp filen.

Förutom att kontrollera nonce, finns det flera andra saker jag gillar att kontrollera som alla är inlindade i en metod som kallas userCanSave.

Kom först ihåg gränssnittet:

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

Ta sedan en titt på hur jag använder det i koden. Först definierar jag funktionen 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);
}

Och då kallar jag helt enkelt detta i början av processen. Om det misslyckas, då återkommer jag .

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

}

Jag rekommenderar att du visar ett felmeddelande, men jag avviker från denna punkt eftersom det finns några sätt att göra detta i inlägget.

2 Ladda upp filen

Förutsatt att användaren har behörighet att kontrollera filen, då är det säkert att ladda upp filen. Processen för att göra detta är enkel men kräver fortfarande lite arbete med WordPress API (nämligen med funktionen wp_upload_bits ).

Först måste filen hämtas från PHP:s $_FILES globala och sedan laddas upp. När du gör det är det dock viktigt att se till att du laddar upp en fil med rätt filtillägg (åtminstone).

<?php

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

Om filtypen inte är en PDF kan du skicka ett felmeddelande, helt enkelt returnera (även om jag inte är ett fan av detta), eller ge användarna feedback (vilket jag är ett fan av att göra).

<?php

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

Det sista steget är dock att få in filen i mediauppladdningsprogrammet.

3 Laddar den i Media Uploader

Det sista steget i allt detta är att få filen till mediauppladdningsprogrammet. För att göra detta behöver du flera saker från WordPress-kärnan:

  1. biblioteket file.php,
  2. en bilaga som behövs för att berätta för WordPress vad som läggs till,
  3. en WordPress API-funktion, wp_insert_attachment
  4. omdirigerar tillbaka till uppringningssidan

Låter som mycket, eller hur? Det är inte så illa.

Jag brukar gruppera inkluderingen av WordPress-filbiblioteket och wp_insert_attachment i ett enda block.

Du kommer att märka att jag ställer in MIME-typen till pdf och jag ser till att titeln inte innehåller något förutom filnamnet. Efter det använder jag wp_insert_attachment för att ladda filen i mediebiblioteket.

Den fullständiga koden för det är följande:

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

Efter det omdirigerar jag tillbaka till sidan som startade allt detta (som vanligtvis är adminsidan vi såg i förra inlägget. Till detta tar jag tag i _wp_http_referer från PHPs $_REQUEST- array.

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

Och det kommer att omdirigera användaren tillbaka till sidan varifrån de kom.

Och filen laddas upp

Vid det här laget har vi bestämt vad vi vill göra:

  1. Ge en anständig kundupplevelse,
  2. Laddade upp filen till mediebiblioteket (med möjligheter att ge feedback)
  3. Och omdirigeras tillbaka till sidan som startade det hela.

Visst, det finns mycket utrymme för feedback i detta, och jag uppmanar dig att anpassa detta efter behov för din kod, men grunden för vad du behöver bör tillhandahållas både i det tidigare inlägget och i det här inlägget.

Inspelningskälla: tommcfarlin.com

Denna webbplats använder cookies för att förbättra din upplevelse. Vi antar att du är ok med detta, men du kan välja bort det om du vill. Jag accepterar Fler detaljer