J'ai un formulaire qui permet aux utilisateurs de télécharger une image. J'utilise le code ci-dessous (qui ne fonctionne pas actuellement) pour garantir la validité des envois des utilisateurs.
Quelqu'un peut-il m'aider et mettre à jour mon code ou me diriger dans la bonne direction sur la manière d'utiliser autant de fonctions WordPress intégrées (wp_check_filetype_and_ext ()), ou toute autre fonction qui conviendrait bien, pour gérer la validation possible? Il doit également être sécurisé pour empêcher tout fichier malveillant, attaque, etc.
if ( $_FILES ) {
foreach ($_FILES as $file => $array) {
//Check if the $_FILES is set and if the size is > 0 (if =0 it's empty)
if ( isset( $_FILES[$file]) && ($_FILES[$file]['size'] > 0 ) ) {
$tmpName = $_FILES[$file]['tmp_name'];
list($width, $height, $type, $attr) = @getimagesize($tmpName);
if ($width != 500 || $height != 500) {
$error .= "Image is to small<br />";
unlink($_FILES[$file]['tmp_name']);
}
// Get the type of the uploaded file. This is returned as "type/extension"
$arr_file_type = wp_check_filetype(basename($_FILES[$file]['name']));
$uploaded_file_type = $arr_file_type['type'];
// Set an array containing a list of acceptable formats
$allowed_file_types = array('image/jpg','image/jpeg','image/gif','image/png');
// If the uploaded file is the right format
if (in_array($uploaded_file_type, $allowed_file_types)) {
} else { // wrong file type
$error .= "Please upload a JPG, GIF, or PNG file<br />";
}
}
}
}
Tout le code de votre question peut être remplacé par:
require_once( ABSPATH . 'wp-admin/includes/image.php' );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );
if ( $_FILES ) {
foreach ($_FILES as $file => $array) {
$image_post_id = media_handler_upload( $file );
if ( is_wp_error( $image_post_id ) ) {
$error .= $image_post_id->get_error_message();
} else {
// $image_post_id now holds the post ID of an attachment that is your uploaded file
}
}
}
La puissance de media_handle_upload
signifie que vous avez maintenant complètement externalisé votre sécurité, vos contrôles et votre téléchargement vers WordPress Core. media_handle_upload
sera conservé longtemps après la fin de votre projet, par des personnes beaucoup plus intelligentes que l’un d’entre nous et par d’autres personnes ayant un intérêt particulier à protéger WordPress.
media_handle_upload
effectuera toutes les vérifications que vous obtiendrez lorsque vous téléchargerez des éléments via le tableau de bord, et créera des publications en pièce jointe pour représenter ces fichiers téléchargés dans la base de données. Il gérera également la création de différentes tailles d'image, la compatibilité avec les plug-ins et respectera les paramètres de sécurité spécifiés dans le tableau de bord.
En cas de succès, il renverra l'ID de la pièce jointe créée. En cas d'échec, il retournera un objet WP_Error
avec un message d'erreur.
Vous pouvez ensuite utiliser wp_get_attachment_url
si vous avez besoin de l’URL complète de la pièce jointe, ou wp_get_attachment_image_src
si vous souhaitez obtenir une taille particulière pour l’image, par exemple:
$image = wp_get_attachment_image_src( $image_post_id, 'thumbnail' );
if ( $image != false ) {
echo $image[0];
}