web-dev-qa-db-fra.com

Pièce jointe à un courrier électronique à partir du formulaire Envoyer

Je rencontre actuellement un problème très étrange.

À l'aide de deux fonctions wordpress existantes (wp_handle_upload et wp_mail) et d'un formulaire utilisant certaines fonctionnalités ajax personnalisées pour traiter mes données, j'essaie de les envoyer à mon adresse électronique. Cela inclut quelques entrées de texte et un fichier.

La plupart de mes efforts semblent bien se dérouler (les données sont envoyées de mon formulaire, elles sont reçues dans mon fichier php, etc.). Cependant, wp_handle_upload ne renvoie jamais rien lorsqu'il est alimenté avec mes données $ _files. Le débogage a corroboré mon hypothèse car mon fichier était correctement envoyé/attaché à mon courrier chaque fois que j'utilise mes données $ _files directement (sans d'abord l'envoyer à wp_handle_upload).

Le problème ici est bien sûr que je jonglerais avec les données de soumission temporaires et que je ne recevrais jamais le fichier dans son état correct (comme dans: son nom est temporaire et n’inclut pas la fin du fichier, etc.). Donc, ce n’est évidemment pas une solution à mon problème, mais j’ai l’information que quelque chose ne va pas lorsque j’utilise wp_handle_upload.

Mon hypothèse est qu'il pourrait y avoir un contrôle de sécurité dans cette fonction pour lequel mes données de formulaire ne sont pas transmises, ainsi il retournera toujours NULL. Avec la mise en œuvre actuelle, je recevrai toujours un courrier sans aucune pièce jointe.

J'ai examiné de nombreuses questions déjà postées et adapté ma solution en conséquence, mais malheureusement en vain. Merci beaucoup d'avance et passez une bonne journée.

Le code ci-dessous a été légèrement adapté (changement de nom, suppression de déclaration, etc.) pour ne pas trop encombrer mon message. Tout devrait cependant rester fonctionnel.

Fichier JS (inclus au chargement de la page):

jQuery(function($){

$(document).ready(function(){
    register.init();
});

var register= {

    init : function(){
        this.createEvents();
    },

    createEvents : function(){

        var t = this;          
        $( "form" ).submit(function() {
            t.submitForm($(this));
        });
    },

    submitForm: function(clicked){

        var data = new FormData();

        data.append('action', 'register_form');             
        data.append('firstname', $('#firstname').val());
        data.append('lastname', $('#lastname').val());
        data.append('email', $('#email').val());
        data.append('attachmentFile', $('#attachmentFile')[0].files[0] );       

        jQuery.ajax({
        url : registerFormAjax.ajaxurl,
        type: 'POST',
        data : data,
        cache: false,
        processData: false, 
        contentType: false 
    });          
    } 

};

});

Fichier PHP (plugin personnalisé):

add_action( 'wp_ajax_register_form', 'register_form' );
add_action( 'wp_ajax_nopriv_register_form', 'register_form' ); 
function register_form()
{   
    $kv_errors= array();
    if('POST' == $_SERVER['REQUEST_METHOD'])  {
        $fields = array('firstname', 'lastname', 'email');      
        foreach ($fields as $field) {
            if (isset($_POST[$field])) $posted[$field] = 
               stripslashes(trim($_POST[$field])); else $posted[$field] = '';
        }
        if ( ! function_exists( 'wp_handle_upload' ) ) {
            require_once( ABSPATH . 'wp-admin/includes/file.php' );
        }

        if(isset($_FILES['attachmentFile'])) 
        {       
            $uploadedfile = $_FILES['attachmentFile'];
            $upload_overrides = array( 'test_form' => false );                  
            $movefile = wp_handle_upload( $uploadedfile, $upload_overrides );


            $attachment = $movefile['file'];
            $headers = 'From: '.$posted['firstname']. ' ' . $posted['lastname'].' <'.$posted['email'].'>' . "\r\n";
            wp_mail('[email protected]', 'Subject' , "Test", $headers, $attachment);
            unlink( $movefile['file'] );

        }
    }

wp_die();
}

MODIFIER:

Bien. Je semble avoir trouvé mon problème actuel. Nous espérons que la solution suivra bientôt. Pour une raison quelconque, mes substitutions ne fonctionneront pas correctement. Sens même en désactivant les vérifications de formulaire

$upload_overrides = array( 'test_form' => false );

ne passera pas le test suivant effectué dans la fonction wordpress (wp_handle_upload)

// A correct form post will pass this test.
if ( $test_form && ( ! isset( $_POST['action'] ) || ( $_POST['action'] != $action ) ) ) {
    return call_user_func_array( $upload_error_handler, array( &$file, __( 'Invalid form submission.' ) ) );
}
1
Faceless

Très bien, je me sens plutôt stupide maintenant, surtout parce que j’ai trouvé la solution à mon problème juste après avoir posté ma question ici, mais aussi parce que j’aurais trouvé cela beaucoup plus tôt si j'avais correctement débogué ma page (mise en place d’un moyen de regarder codes d'erreur).

Quoi qu'il en soit ...

Comme indiqué dans mon EDIT ci-dessus: mes tests de formulaire étaient toujours en cours d'exécution malgré le fait que je les ai annulés. Je ne sais toujours pas vraiment pourquoi la solution publiée n'est pas fonctionnelle car elle provient directement de la documentation, mais j'ai trouvé une "solution de contournement".

La création du tableau de substitution dans mon appel de fonction fonctionne en réalité comme je l’attendrais:

$movefile = wp_handle_upload( $uploadedfile, array( 'test_form' => false ) );

Désolé les gars. Bon débogage!

0
Faceless