Ich habe eine neue Seite unter "Seiten" im WordPress-Administrator hinzugefügt und mehrere benutzerdefinierte Felder hinzugefügt. Ich möchte auch ein Upload-Bildfeld zum Seiteneditor hinzufügen können. Gibt es eine Möglichkeit, dies über benutzerdefinierte Felder zu tun?
Oder muss ich eine andere Richtung einschlagen, wenn ich diese Fähigkeit brauche?
Antworten:
Für alle, die mehr über das Hochladen von Dateien erfahren möchten, finden Sie hier eine kurze Einführung zu den wichtigsten Themen und Schwachstellen. Dies ist mit WordPress 3.0 auf einer Linux-Box geschrieben und der Code ist nur eine grundlegende Übersicht, um die Konzepte zu vermitteln. Ich bin sicher, dass einige Leute hier Ratschläge zur Verbesserung der Implementierung geben könnten.
Skizzieren Sie Ihren grundlegenden Ansatz
Es gibt mindestens drei Möglichkeiten, Bilder mit Beiträgen zu verknüpfen: Verwenden eines Felds post_meta zum Speichern des Bildpfads, Verwenden eines Felds post_meta zum Speichern der Medienbibliotheks-ID des Bildes (dazu später mehr) oder Zuweisen des Bildes zum Beitrag als Anhang . In diesem Beispiel wird ein Feld post_meta verwendet, um die Medienbibliotheks-ID des Bildes zu speichern. YMMV.
Multipart-Codierung
Standardmäßig haben die Formulare zum Erstellen und Bearbeiten von WordPress keinen Enctype. Wenn Sie eine Datei hochladen möchten, müssen Sie dem Formular-Tag ein "enctype = 'multipart / form-data'" hinzufügen - andernfalls wird die $ _FILES-Auflistung überhaupt nicht durchgeschoben. In WordPress 3.0 gibt es dafür einen Haken. In einigen Vorgängerversionen (ohne genaue Angaben) müssen Sie den Formular-Tag durch einen String ersetzen.
Erstellen Sie die Meta-Box und das Upload-Feld
Ich werde nicht weit gehen, um Meta-Boxen zu erstellen, da die meisten von Ihnen wahrscheinlich bereits wissen, wie es geht, aber ich sage nur, dass Sie nur eine einfache Meta-Box mit einem Dateifeld benötigen. Im folgenden Beispiel habe ich Code eingefügt, um nach einem vorhandenen Bild zu suchen und es anzuzeigen, falls eines vorhanden ist. Ich habe auch einige einfache Fehler- / Feedback-Funktionen hinzugefügt, die Fehler mithilfe eines post_meta-Felds übergeben. Sie sollten dies ändern, um die WP_Error-Klasse zu verwenden. Dies dient nur zu Demonstrationszwecken.
Handhabung des Dateiuploads
Dies ist die große Aufgabe - die eigentliche Bearbeitung des Datei-Uploads, indem Sie sich in die Aktion save_post einbinden. Ich habe unten eine stark kommentierte Funktion eingefügt, möchte jedoch die beiden wichtigsten WordPress-Funktionen erwähnen, die sie verwendet:
wp_handle_upload () erledigt die Magie des Uploads. Übergeben Sie ihm einfach einen Verweis auf Ihr Feld im Array $ _FILES und eine Reihe von Optionen (machen Sie sich darüber keine allzu großen Sorgen - Sie müssen nur test_form = false festlegen. Vertrauen Sie mir). Diese Funktion fügt die hochgeladene Datei jedoch nicht zur Medienbibliothek hinzu. Es wird lediglich der Upload durchgeführt und der Pfad der neuen Datei (und handlich auch die vollständige URL) zurückgegeben. Wenn ein Problem auftritt, wird ein Fehler zurückgegeben.
wp_insert_attachment () fügt das Bild der Medienbibliothek hinzu und generiert alle entsprechenden Miniaturansichten. Sie übergeben ihm lediglich eine Reihe von Optionen (Titel, Post-Status usw.) und den LOKALEN Pfad (nicht die URL) zu der Datei, die Sie gerade hochgeladen haben. Das Tolle daran, Ihre Bilder in die Medienbibliothek zu stellen, ist, dass Sie später alle Dateien problemlos löschen können, indem Sie wp_delete_attachment aufrufen und ihm die Medienbibliotheks-ID des Elements übergeben (was ich in der folgenden Funktion mache). Mit dieser Funktion müssen Sie auch wp_generate_attachment_metadata () und wp_update_attachment_metadata () verwenden, die genau das tun, was Sie erwarten - Metadaten für das Medienelement generieren.
Berechtigungen, Eigentum und Sicherheit
Wenn Sie Probleme beim Hochladen haben, hat dies möglicherweise mit Berechtigungen zu tun. Ich bin kein Experte für Serverkonfiguration. Bitte korrigieren Sie mich, wenn dieser Teil wackelig ist.
Stellen Sie zunächst sicher, dass Ihr Ordner "wp-content / uploads" vorhanden ist und apache gehört: apache. In diesem Fall sollten Sie die Berechtigungen auf 744 setzen können und alles sollte funktionieren. Die Inhaberschaft ist wichtig - selbst das Festlegen von Perms auf 777 hilft manchmal nicht, wenn das Verzeichnis nicht in ordnungsgemäßem Besitz ist.
Sie sollten auch in Betracht ziehen, die Dateitypen zu beschränken, die mithilfe einer htaccess-Datei hochgeladen und ausgeführt werden. Auf diese Weise wird verhindert, dass Benutzer Dateien hochladen, die keine Bilder sind, und als Bilder getarnte Skripts ausführen. Sie sollten dies wahrscheinlich googeln, um weitere Informationen zu erhalten, aber Sie können eine einfache Einschränkung des Dateityps wie folgt vornehmen:
quelle
if ( ! function_exists( 'wp_handle_upload' ) ) require_once( ABSPATH . 'wp-admin/includes/file.php' );
Der von @MathSmath bereitgestellte Code ist richtig. Wenn Sie jedoch mit vielen Upload-Feldern arbeiten oder mehrere Dateien hochladen möchten, müssen Sie diese häufig ändern.
Außerdem wird die WordPress-Medienbibliothek nicht zum Hochladen von Dateien verwendet (was die ganze Drecksarbeit hinter den Kulissen erledigt).
Ich würde vorschlagen, dass Sie sich ein Plugin wie Meta Box ansehen . Das Plugin unterstützt beide Möglichkeiten zum Hochladen von Dateien:
input[type="file"]
, das einen ähnlichen Code wie oben verwendet (siehe Dokumente ) undDies kann Ihnen dabei helfen, den Aufwand für das Schreiben und Verwalten des Codes zu verringern, insbesondere wenn Sie mehrere Uploads erstellen möchten.
Haftungsausschluss: Ich bin der Autor von Meta Box.
quelle