web-dev-qa-db-de.com

E-Mail-Anhang vom Formular senden

Ich habe gerade ein sehr seltsames Problem.

Mit Hilfe von zwei vorhandenen WordPress-Funktionen (wp_handle_upload und wp_mail) und einem Formular, das einige benutzerdefinierte Ajax-Funktionen zur Verarbeitung meiner Daten verwendet, versuche ich, diese Daten an meine E-Mail-Adresse zu senden. Dazu gehören einige Texteingaben und eine Datei.

Die meisten meiner Bemühungen scheinen in Ordnung zu sein (Daten werden von meinem Formular gesendet, in meiner PHP-Datei usw. empfangen), wp_handle_upload gibt jedoch niemals etwas zurück, wenn meine $ _files-Daten eingegeben werden. Das Debuggen hat meine Annahme unterstützt, dass meine Datei korrekt an meine E-Mails gesendet/angehängt wird, wenn ich meine $ _files-Daten direkt verwende (ohne sie zuerst an wp_handle_upload weiterzuleiten).

Das Problem hierbei ist natürlich, dass ich mit temporären Sendedaten jongliere und die Datei auch nie in ihrem korrekten Zustand erhalte (wie in: Der Name ist temporär und enthält nicht die Dateiendung usw.). Dies ist also offensichtlich keine Lösung für mein Problem. Es gibt mir jedoch die Information, dass etwas schief geht, wenn ich wp_handle_upload verwende.

Ich vermute, dass es in dieser Funktion einige Sicherheitsüberprüfungen gibt, die meine Formulardaten nicht bestehen, sodass sie immer NULL zurückgeben. Mit der aktuellen Implementierung erhalte ich immer eine Mail ohne Anhänge.

Ich habe viele bereits gestellte Fragen angeschaut und meine Lösung entsprechend angepasst, aber leider ohne Erfolg. Vielen Dank im Voraus und einen schönen Tag.

Der folgende Code wurde leicht angepasst (geänderte Namen, entfernte if-Anweisungen usw.), um meinen Beitrag nicht zu überladen. Es sollte aber trotzdem alles funktionsfähig sein.

JS-Datei (beim Laden der Seite enthalten):

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 
    });          
    } 

};

});

PHP-Datei (benutzerdefiniertes Plugin):

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();
}

BEARBEITEN:

In Ordung. Ich scheine mein eigentliches Problem gefunden zu haben. Die Lösung wird hoffentlich bald folgen. Aus irgendeinem Grund funktionieren meine Overrides nicht richtig. Das heißt, auch das Deaktivieren von Formularprüfungen

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

überspringt nicht den folgenden Test, der in der WordPress-Funktion durchgeführt wurde (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

Okay, ich fühle mich jetzt ziemlich dumm, vor allem, weil ich gleich nach dem Posten meiner Frage hier die Lösung für mein eigenes Problem gefunden habe, aber auch, weil ich sie viel früher gefunden hätte, wenn ich meine Seite richtig debuggt hätte (eine Methode implementiert, um die Rückkehr zu betrachten) Fehlercodes).

Sowieso...

Wie oben in meinem EDIT angegeben: Meine Formtests wurden noch ausgeführt, obwohl ich sie überschrieb. Ich weiß immer noch nicht genau, warum die veröffentlichte Lösung nicht funktioniert, da sie direkt aus der Dokumentation stammt, aber ich habe eine "Problemumgehung" gefunden.

Das Erstellen des Override-Arrays in meinem Funktionsaufruf funktioniert tatsächlich so, wie ich es erwarten würde:

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

Tut mir leid, Leute. Viel Spaß beim Debuggen!

0
Faceless