WordPress : Le téléchargement de fichiers personnalisés WordPress est écrasé en l’absence de sélection de fichiers

Publié par Jean-Michel le

Je travaille sur un thème personnalisé qui vous permet de télécharger plusieurs images sur une seule page. Comme j’ai plusieurs entrées de fichier, j’utilise cette fonction dans mon functions.phpfichier (à l’intérieur d’une boucle pour chaque entrée de fichier):

register_setting('hero', 'slider_slide_' . $i . '_image',
function($option) use ($i) {
    if (!empty($_FILES['slider_slide_' . $i . '_image']['tmp_name'])) {
        $_FILES['slider_slide_' . $i . '_image']['name'] = 'slide_' . $i . '.png';
        $urls = wp_handle_upload($_FILES['slider_slide_' . $i . '_image'], array('test_form' => FALSE));
        $temp = $urls['url'];
        return $temp;
    }
    return $option; 
});

La fonction en ligne est la seule chose que j’ai essayée qui fonctionne pour plusieurs fichiers à la fois. Quoi qu’il en soit, je suis maintenant confronté au problème de l’écrasement de mes options. Une fois téléchargée, l’option est définie dans ma base de données, avec le lien correct vers l’image. Cependant, si je modifie ultérieurement d’autres paramètres sur la page, puisque rien n’est téléchargé, l’option est remplacée par une chaîne vide, même si je vérifie que le fichier n’est pas vide avant de mettre à jour l’option.

Idéalement, j’aimerais permettre à un utilisateur de changer tout et n’importe quoi et de vérifier le téléchargement du fichier pour vérifier si quelque chose est sélectionné, et si c’est le cas, téléchargez et mettez à jour l’option.

Seul problème, WordPress semble s’occuper de la mise à jour des options…

Aucune erreur n’est lancée non plus, donc je suis totalement perplexe en ce moment.

Solution n°1 trouvée

Daniel G. au-dessus de cette réponse l’a à peu près résolu, j’ai dû l’ajuster un peu, mais pour le bien de tous ceux qui ont ce problème, voici le code que j’ai utilisé pour le résoudre.

register_setting('hero', 'slider_slide_' . $i . '_image',
    function($option) use ($i) {
        if ($_FILES['slider_slide_' . $i . '_image']['error'] != 0) {
            return get_option('slider_slide_' . $i . '_image');
        }
        $_FILES['slider_slide_' . $i . '_image']['name'] = 'slide_' . $i . '.png';
        $urls = wp_handle_upload($_FILES['slider_slide_' . $i . '_image'],
                array(
                    'test_form' => FALSE,
                    'unique_filename_callback' => 'file_override_overwrite'
                )
        );
        $temp = $urls['url'];
        return $temp;
    }
);

Solution n°2 trouvée

Je suppose que WP reçoit toujours vos entrées de fichiers vides, vous devez donc renvoyer la valeur stockée.

Essayez quelque chose comme ça.

register_setting('hero', 'slider_slide_' . $i . '_image',
function($value, $option) use ($i) {
    if (empty($_FILES['slider_slide_' . $i . '_image']['tmp_name'])) {
        return get_option($option); 
    }

    $_FILES['slider_slide_' . $i . '_image']['name'] = 'slide_' . $i . '.png';
    $urls = wp_handle_upload($_FILES['slider_slide_' . $i . '_image'], array('test_form' => FALSE));

    return $urls['url'];
});

Une autre façon consiste à remplir 'slider_slide_' . $i . '_image'l’entrée avec la valeur stockée.

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *