Pourquoi un uplaod WPForms dans un dossier au choix ?
WPForms est un des plugins générateur de formulaire les plus populaires de WordPress. Même limitée, la version gratuite vous permet déjà de réaliser des formulaires simples et fonctionnels en toute simplicité. Cet article “Upload WPForms dans un dossier au choix” s’adresse aux utilisateurs de la version pro de WPForms.
Lorsque vous ajoutez un champ upload dans WPForms, la pièce (image, PDF…) est automatiquement chargée dans un dossier créé par le plugin (dans votre dossiers wp-content/uploads/wpforms/IDFORM-e4rfr578g68….) où IDFORM est l’identifiant de votre formulaire suivi d’une série aléatoire de caractères). Vous retrouvez facilement le fichier en visualisant les entrées du formulaire en question dans votre backoffice. Mais dans certains cas, il peut être utile d’envoyer un upload WPForms dans un dossier au choix (dans le dossier uploads ou ailleurs).
Comment changer le répertoire de destination d'un upload WPForms ?
Il faut bien sûr que le dossier existe physiquement dans votre arborescence WordPress sur votre serveur. Via le FTP, créez ce dossier dans le répertoire de votre choix (mais pour une question pratique je vous conseille de le créer dans le dossier “uploads”). Veillez à ce qu’il ait les droits CHMOD 755. Dans ce dossier, placez un fichier index.php dans lequel vous écrirez ce code par sécurité :
Cela fait, collez ce code dans le fichier functions.php ou dans un fichier functions-forms.php que vous inclurez dans le fichier principal, ou encore dans un plugin maison :
function deplace_fichiers_wpforms($fichiers_wpforms, $dossier_destination){
// Vérifier que le dossier de destination existe ou le créer
if ( ! file_exists( $dossier_destination ) ) {
wp_mkdir_p( $dossier_destination ); // créer le dossier de destination s'il n'existe pas
}
//Ci-dessous la ligne permet de convertir l'URL d'un fichier (générée par WPForms) en un chemin absolu sur le système de fichiers du serveur, afin de pouvoir déplacer ou manipuler ce fichier localement.
$chemin_upload = str_replace( home_url(), rtrim(ABSPATH, '/'), $fichiers_wpforms );
// Déplacer le fichier uploadé vers le dossier de destination
$fichier = basename( $chemin_upload ); // Nom du fichier
$destination = $dossier_destination .'/'. $fichier; //ne pas oublier le /
$erreur = "";
// Déplacement du fichier (et suppression du fichier dans le dossier par défaut de WPForms)
$erreurs = array();//tableau pour la gestion des erreurs
if ( file_exists( $chemin_upload ) ) {
if(!rename( $chemin_upload, $destination )){
$erreurs[] = "Erreur déplacement de {$chemin_upload} à {$destination}";
}
}else{
$erreurs[] .= "Le fichier $chemin_upload n'existe pas";
}
if (!empty($erreurs)) { // si debug et debug_log définis à true dans wp-config.php écriture des erreurs dans wp-content/debug.log
foreach ($erreurs as $erreur) {
error_log($erreur);
}
}
}
Voici un exemple d’utilisation de cette fonction depuis un formulaire WPForms (avec en bonus un insert des données dans une table MySQL perso :
add_action( 'wpforms_process_complete', 'traite_form_upload', 10, 4 );
//action quand le formulaire est posté (après le traitement des erreurs par WPForms)
function traite_form_upload($fields, $entry, $form_data, $entry_id){
global $wpdb;
if ( absint( $form_data['id'] ) !== 36443) { //ici votre ID du formulaire concerné
return;
}
// Capturer l'objet de toutes les entrées
$entry = wpforms()->entry->get( $entry_id );
// Les entrées sont encodées JSON nous devons les décoder pour obtenir un tableau
$data = json_decode( $entry->fields, true );
$prenom = sanitize_text_field($data[1]['value']);//traitement d'un champ prénom
$nom = sanitize_text_field($data[3]['value']);// traitement d'un champ nom
$email = sanitize_text_field($data[7]['value']); // traitement d'un champ email
$fichiers = $data[16]['value']; // traitement d'un champ d'upload fichiers
//dans tous les cas, le chiffre est à remplacer par l'ID de chacun de vos champs
if(!empty($fichiers)){
//supposons que vous souhaitiez envoyer vos fichiers dans le répertoir "mon-dossier-perso" situé dans wp-content/uploads
$absolute_url = "https://mon-site.com/wp-content/uploads/mon-dossier_perso";
$dossier_destination = get_server_path_from_url($absolute_url);
//cette fonction est détaillée plus bas
$fic = preg_split('/\s+/', $fichiers); // si c'est un upload fichiers multiples, WPForms va séparer les fichiers par des espaces que l'on va séparer pour former un tableau le cas échéant
if(is_countable($fic) && count($fic) > 1){ //si le champs upload WPForms est multiple, nous avons un tableau
$fichiers_pour_bdd = array(); // si besoin de stocker dans une table MySQL
foreach($fic as $fi){
deplace_fichiers_wpforms($fi, $dossier_destination);
$nom_fichier = basename($fi);//nom fichier seul
$fichiers_pour_bdd[] = $absolute_url.'/'.$nom_fichier;
}
$json_fichiers = json_encode($fichiers_for_bdd);//si vous souhaitez encoder json votre tableau de fichiers
}else{ // ici un upload simple (non multiple)
deplace_fichiers_wpforms($fichiers, $dossier_destination);
$fic = basename($fichiers);
$fichiers_pour_bdd = [$absolute_url.'/'.$fic]; // nous créons un tableau avec le fichier pour l'encode JSON
$json_fichiers = json_encode($fichiers_pour_bdd);
}
}
//insert dans des champs du formulaire dans une table SQL si vous le souhaitez (ici wp_ma_table
// Données à insérer
$data = array(
'prenom' => $prenom,
'nom' => $nom,
'email' => $email,
'fichiers'=> $json_fichiers
);
// Format des données
$format = array('%s', '%s', '%s', '%s');
$table = $wpdb->prefix . 'ma_table'; // Utiliser le préfixe dynamique de WordPress
$wpdb->insert($table, $data, $format);
}
Rappel de la fonction get_server_path_from_url($absolute_url) qui permet de manipuler les chemins pour le déplacement du fichier vers le dossier souhaité du répertoire wp-content/uploads :
function get_server_path_from_url( $absolute_url ) {
// Obtenir l'URL de base du site
$site_url = site_url('/');
// Obtenir le chemin serveur absolu du répertoire wp-content
$wp_content_dir = realpath(ABSPATH . 'wp-content');
// Remplacer la partie de l'URL correspondant au site par le chemin serveur équivalent
$relative_path = str_replace($site_url, '', $absolute_url);
// Générer le chemin complet sur le serveur
$server_path = $wp_content_dir . '/' . str_replace('wp-content/', '', $relative_path);
return $server_path;
}
Conclusion de upload WPForms dans un dossier au choix
Vous savez maintenant comment envoyer un upload WPForms dans un dossier au choix. Vous pouvez coupler ce code avec le redimensionnement des images uploadées pour un traitement supplémentaire.
