Bevor ich direkt in den Code dafür einsteige, wollte ich zwei Dinge erwähnen:
- Ja, ich habe das vor einiger Zeit ausführlich behandelt ,
- Und dies ist der zweite Teil einer zweiteiligen Serie.
Wenn Sie den ersten Teil noch nicht gelesen haben, tun Sie dies zuerst. Die Idee ist, dass der Code in Verbindung mit dem funktioniert, was ich in diesem Beitrag behandeln werde, um sicherzustellen, dass sowohl die Client- als auch die Serverseite abgedeckt sind.
Letztendlich besteht der Grund für eine solche Aufschlüsselung nicht nur darin, sicherzustellen, dass die Dinge korrekt ausgeführt werden, sondern auch, um sicherzustellen, dass der Benutzer eine möglichst positive Erfahrung macht.
Vor diesem Hintergrund erfahren Sie hier, wie Sie Dateien in WordPress auf der Serverseite hochladen.
Hochladen von Dateien in WordPress auf der Serverseite
Beachten Sie, dass, obwohl es einige Sicherheitsüberprüfungen gibt, die durchgeführt werden können – und sollten – ich noch keinen Weg gefunden habe, der absolut narrensicher ist, um zu erkennen, dass die hochgeladene Datei vom richtigen Typ ist.
Das heißt, es besteht immer noch die Möglichkeit, dass ein falscher Dateityp hochgeladen wird. Ob dies bösartig ist oder nicht, liegt natürlich beim Endbenutzer. Ich teile dies nur, um klarzustellen, dass der Code, den ich zeigen werde, so gut ist, wie ich ihn bereitstellen kann, aber dass Sie immer noch ein gewisses Maß an Diskretion haben sollten.
Vielleicht lohnt es sich sogar, nach einer Bibliothek eines Drittanbieters zu suchen, um die Binärdaten nach dem Empfang zu validieren. Aber ich schweife ab.
1 Überprüfen Sie die Benutzerberechtigungen
Denken Sie daran, dass WordPress jedes Mal, wenn wir das Front-End erstellt haben, eine Nonce generiert, damit wir diese verwenden können, um sicherzustellen, dass der Benutzer die Berechtigung zum Hochladen der Datei hat.
Zusätzlich zur Überprüfung der Nonce gibt es noch einige andere Dinge, die ich gerne überprüfe, die alle in einer Methode namens userCanSave zusammengefasst sind.
Erinnern Sie sich zunächst an das Frontend:
<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>
Dann schau dir an, wie ich es im Code verwende. Zuerst definiere ich die Funktion 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);
}
Und dann rufe ich das einfach zu Beginn des Prozesses auf. Wenn es fehlschlägt, dann kehre ich zurück.
<?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...
}
Ich empfehle, eine Fehlermeldung anzuzeigen, aber ich schweife an diesem Punkt ab, da es einige Möglichkeiten gibt, dies innerhalb des Beitrags zu tun.
2 Laden Sie die Datei hoch
Angenommen, der Benutzer hat die Berechtigung, die Datei zu überprüfen, dann ist es sicher, die Datei hochzuladen. Der Prozess dafür ist unkompliziert, erfordert aber dennoch ein wenig Arbeit mit der WordPress-API (nämlich mit der Funktion wp_upload_bits ).
Zuerst muss die Datei aus PHPs $_FILES global geholt und dann hochgeladen werden. Dabei ist es jedoch wichtig sicherzustellen, dass Sie eine Datei mit der richtigen Dateiendung (mindestens) hochladen.
<?php
$file_type = explode('.', $filename);
$file_type = strtolower($file_type[count($file_type) - 1]);
if ('pdf' !== $file_type) {
// Give your feedback of choice here.
}
Wenn der Dateityp kein PDF ist, können Sie einen Fehler ausgeben, einfach zurückgeben (obwohl ich kein Fan davon bin) oder dem Benutzer Feedback geben (was ich gerne tue).
<?php
if ($uploadFile['error']) {
// Your preferred method of feedback here.
}
Der letzte Schritt besteht jedoch darin, die Datei in den Medien-Uploader zu übertragen.
3 Laden in den Media Uploader
Der letzte Schritt dabei ist, die Datei in den Medien-Uploader zu laden. Dazu benötigen Sie mehrere Dinge aus dem WordPress-Kern:
- die file.php-Bibliothek,
- ein Attachment-Array, das notwendig ist, um WordPress mitzuteilen, was hinzugefügt wird,
- eine WordPress-API-Funktion, wp_insert_attachment
- Umleitung zurück auf die aufrufende Seite
Klingt nach viel, oder? Es ist nicht so schlimm.
Normalerweise gruppiere ich die Einbindung der WordPress-Dateibibliothek und des wp_insert_attachment in einem einzigen Block.
Sie werden feststellen, dass ich den MIME-Typ auf pdf setze und darauf achte, dass der Titel nichts außer dem Dateinamen enthält. Danach verwende ich wp_insert_attachment, um die Datei in die Medienbibliothek zu laden.
Der vollständige Code dafür lautet wie folgt:
<?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']);
Danach leite ich zurück auf die Seite, auf der das alles begonnen hat (was normalerweise die Admin-Seite ist, die wir im vorherigen Beitrag gesehen haben. Dazu nehme ich den _wp_http_referer aus dem $_REQUEST – Array von PHP .
<?php
wp_safe_redirect(
$_REQUEST['_wp_http_referer'],
301
);
exit;
Und das leitet den Benutzer zurück auf die Seite, von der er gekommen ist.
Und die Datei wird hochgeladen
An dieser Stelle haben wir dargelegt, was wir tun wollen:
- Bieten Sie ein anständiges Kundenerlebnis,
- Die Datei in die Medienbibliothek hochgeladen (mit Möglichkeiten, Feedback zu geben)
- Und zurück zu der Seite umgeleitet, mit der alles begann.
Zugegeben, es gibt viel Raum für Feedback, und ich fordere Sie dringend auf, dies nach Bedarf für Ihren Code anzupassen, aber die Grundlage dessen, was Sie benötigen, sollte sowohl im vorherigen als auch in diesem Beitrag bereitgestellt werden.