J'ai ajouté une nouvelle page sous "Pages" dans l'administrateur wordpress et ajouté plusieurs champs personnalisés. J'aimerais également pouvoir ajouter un champ d'image de téléchargement à l'éditeur de page. Existe-t-il un moyen de le faire via des champs personnalisés?
Ou dois-je prendre une direction différente si j'ai besoin de cette capacité?
Réponses:
Pour tous ceux qui souhaitent en savoir plus sur le téléchargement de fichiers, voici un bref aperçu des principaux sujets et points critiques. Ceci est écrit avec WordPress 3.0 sur une machine Linux à l’esprit, et le code n’est qu’un aperçu de base pour enseigner les concepts. Je suis sûr que certaines personnes ici pourraient donner des conseils pour améliorer la mise en œuvre.
Décrivez votre approche de base
Il existe au moins trois méthodes pour associer des images à des publications: utiliser un champ post_meta pour stocker le chemin de l'image, utiliser un champ post_meta pour stocker l'ID de la bibliothèque multimédia de l'image (pour plus d'informations à ce sujet plus tard) ou attribuer l'image à la publication en tant que pièce jointe. . Cet exemple utilisera un champ post_meta pour stocker l'ID de la bibliothèque multimédia de l'image. YMMV.
Encodage en plusieurs parties
Par défaut, les formulaires de création et de modification de WordPress n’ont aucun type d’enctype. Si vous souhaitez télécharger un fichier, vous devez ajouter un "enctype = 'multipart / form-data" "à la balise de formulaire - sinon la collection $ _FILES ne sera pas poussée du tout. Dans WordPress 3.0, il existe un crochet pour cela. Dans certaines versions précédentes (vous n'êtes pas sûr des détails), vous devez remplacer la balise de formulaire par une chaîne.
Créer la méta-boîte et le champ de téléchargement
Je n'entrerai pas beaucoup dans la création de méta-boîtes car la plupart d'entre vous savent probablement déjà comment le faire, mais je dirai simplement que vous n'avez besoin que d'une simple méta-boîte contenant un champ de fichier. Dans l'exemple ci-dessous, j'ai inclus du code permettant de rechercher une image existante et de l'afficher, le cas échéant. J'ai également inclus une fonctionnalité simple d'erreur / retour qui transmet les erreurs à l'aide d'un champ post_meta. Vous voudrez changer ceci pour utiliser la classe WP_Error ... c'est juste pour la démonstration.
Gestion du téléchargement de fichier
Il s’agit du gros problème: gérer le téléchargement du fichier en s’accrochant à l’action save_post. J'ai inclus une fonction très commentée ci-dessous, mais j'aimerais noter les deux fonctions clés de WordPress qu'il utilise:
wp_handle_upload () fait toute la magie du traitement du téléchargement. Vous lui transmettez simplement une référence à votre champ dans le tableau $ _FILES, ainsi qu’un tableau d’options (ne vous inquiétez pas trop de cela, le seul important que vous devez définir est test_form = false. Faites-moi confiance.). Cette fonction n’ajoute toutefois pas le fichier téléchargé à la médiathèque. Il effectue simplement le téléchargement et renvoie le chemin d'accès du nouveau fichier (et, également, l'URL complète). En cas de problème, une erreur est renvoyée.
wp_insert_attachment () ajoute l'image à la médiathèque et génère toutes les vignettes appropriées. Vous venez de lui transmettre un tableau d’options (titre, statut du message, etc.), ainsi que le chemin LOCAL (et non l’URL) du fichier que vous venez de télécharger. L'avantage de placer vos images dans la médiathèque est que vous pouvez facilement supprimer tous les fichiers ultérieurement en appelant wp_delete_attachment et en lui transmettant l'ID de la médiathèque de l'élément (ce que je suis en train de faire dans la fonction ci-dessous). Avec cette fonction, vous devrez également utiliser wp_generate_attachment_metadata () et wp_update_attachment_metadata (), qui font exactement ce que vous attendez d'eux: générer des métadonnées pour l'élément multimédia.
Autorisations, propriété et sécurité
Si vous rencontrez des difficultés pour télécharger, il se peut que vous ayez à passer par des autorisations. Je ne suis pas un expert en configuration de serveur, donc corrigez-moi s'il vous plaît.
Tout d’abord, assurez-vous que votre dossier wp-content / uploads existe et qu’il appartient à apache: apache. Si tel est le cas, vous devriez pouvoir définir les autorisations sur 744 et tout devrait fonctionner. La propriété est importante - même le réglage des permanentes sur 777 ne sera parfois pas utile si le répertoire n'est pas correctement possédé.
Vous devriez également envisager de limiter les types de fichiers téléchargés et exécutés à l'aide d'un fichier htaccess. Cela empêche les personnes de télécharger des fichiers qui ne sont pas des images et d'exécuter des scripts déguisés en images. Vous devriez probablement google ceci pour plus d'informations faisant autorité, mais vous pouvez faire une limitation de type de fichier simple comme ceci:
la source
if ( ! function_exists( 'wp_handle_upload' ) ) require_once( ABSPATH . 'wp-admin/includes/file.php' );
Le code fourni par @MathSmath est correct. Toutefois, si vous gérez de nombreux champs de téléchargement ou souhaitez télécharger plusieurs fichiers, vous devez le modifier beaucoup.
De plus, il n’utilise pas la médiathèque WordPress pour le téléchargement de fichiers (ce qui fait tout le sale boulot derrière la scène).
Je vous suggère de regarder un plugin comme Meta Box . Le plugin prend en charge les deux manières de télécharger des fichiers:
input[type="file"]
, qui utilise un code similaire ci-dessus (voir documentation ) etCela peut vous aider à réduire les efforts d'écriture et de maintenance du code, en particulier lorsque vous souhaitez créer plusieurs téléchargements.
Disclaimer: Je suis l'auteur de Meta Box.
la source