web-dev-qa-db-ja.com

フォーム送信からの電子メール添付

私は現在非常に奇妙な問題に遭遇しています。

2つの既存のワードプレス関数(wp_handle_uploadとwp_mail)と、カスタムのajax機能を使用してデータを処理するフォームを使用して、そのデータを自分の電子メールアドレスに送信しようとしています。これにはいくつかのテキスト入力とファイルが含まれます。

私の努力の大部分はうまくいっているようです(データは私のフォームから送られます、それは私のphpファイルなどで受け取られます)。しかしwp_handle_uploadは私の$ _filesデータを与えられた時に何も返しません。私のファイルは$ _filesデータを直接使うときはいつでも(最初にwp_handle_uploadに送ることなく)正しく送信/添付されるので、デバッグは私の仮定をサポートしました。

ここでの問題はもちろん私が一時的な送信データでジャグリングしていること、そしてまた正しい状態でファイルを受信することは決してないだろうということです(その名前はファイルの終わりなどを含まない一時的なものです)。したがって、これは明らかに私の問題に対する解決策ではありませんが、wp_handle_uploadを使用するたびに問題が発生しているという情報を得ることはできません。

私の推測は、私のフォームデータが通過しないように、その関数内に安全性チェックがあるかもしれないので、それは常にNULLを返すだろうと思います。現在の実装では、私は添付ファイルなしで常にメールを受け取ります。

私はすでに投稿された質問の多くを見て、それに応じて私の解決策を適応させましたが、残念ながら役に立ちませんでした。よろしくお願いします。素敵な一日を。

以下のコードは、私の投稿を混乱させすぎないようにするために少し変更されました(名前の変更、文の削除など)。それでもすべてが機能するはずです。

JSファイル(ページ読み込み時に含まれる):

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ファイル(カスタムプラグイン):

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

編集:

大丈夫私は私の実際の問題を見つけたようです。解決策はうまくいけばすぐに続くでしょう。何らかの理由で、私のオーバーライドが正しく機能しません。フォームチェックを無効にしてもそういう意味

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

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

特に、ここに質問を投稿した直後に自分自身の問題に対する解決策を見つけたのでだけでなく、自分のページを適切にデバッグしていればずっと早い段階でそれを見つけたからです。エラーコード)。

いずれかの方法...

上記の私の編集で述べたように:私がそれらを上書きしたにもかかわらず私のフォームテストはまだ実行されていました。投稿されたソリューションがドキュメントから直接引用されているため機能しない理由はまだわかりませんが、「回避策」を見つけました。

私の関数呼び出し内でオーバーライド配列を作成することは実際に私がそれに期待するだろうように働きます:

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

ごめんね。ハッピーデバッグ!

0
Faceless