web-dev-qa-db-ja.com

jQuery Ajaxが関数に空のパラメーターを渡す?

私はajaxで簡単なフォーム送信をしようとしています(ページが更新されません)

functions.php

add_action('wp_ajax_send_projectmessage', 'send_projectmessage');
function send_projectmessage($projectid, $userid, $message) {
    global $wpdb;
    $wpdb->insert('tbl_messages', array(
        'project_id' => $projectid,
        'user_id' => $userid,
        'message_body' => $message
    ));
    echo 'success?'; //this shows up in console.log but 3 parameters are empty
    wp_die();
}

js:

$('#form-pm').on('submit',function(e) {

    e.preventDefault();

    //hardcode stuff for testing
        var testdata = { 
            'action': 'send_projectmessage',
            'projectid': '71', 
            'userid': '1', 
            'message': 'voila' 
        };

        var ajaxRequest =
        $.ajax({
            url: admin_ajax.ajax_url,
            type: 'post',
            data: testdata
        });

        ajaxRequest.done(function(data) { console.log(data); });
        ajaxRequest.fail(function(jqXHR) { alert('You are fail. ' + jqXHR); });      
});

admin-ajax.phpは正しく配線されています。私のerror.logはsend_projectmessage関数が呼び出されていますが、パラメーターが空です。ここで何か不足していますか?昨日からずっと髪を引っ張っています。

error.log

PHP Warning:  Missing argument 2 for send_projectmessage(), called in /var/www/html/wp-includes/class-wp-hook.php on line 286 and defined in /var/www/html/wp-content/themes/mytheme_child/functions.php on line 178, referer: https://xxxxx
PHP Warning:  Missing argument 3 for send_projectmessage(), called in /var/www/html/wp-includes/class-wp-hook.php on line 286 and defined in /var/www/html/wp-content/themes/mytheme_child/functions.php on line 178, referer: https://xxxxx
WordPress database error Column 'user_id' cannot be null for query INSERT INTO `tbl_messages` (`project_id`, `user_id`, `message_body`) VALUES ('', NULL, NULL) made by do_action('wp_ajax_send_projectmessage'), WP_Hook->do_action, WP_Hook->apply_filters, send_projectmessage, referer: https://xxxxx/
1
Rollor

値はパラメーターとして渡されませんが、$_POST配列で渡されます。

これを行う方法を次に示します。

add_action( 'wp_ajax_send_projectmessage', 'send_projectmessage' );

function send_projectmessage() {

    global $wpdb;

    check_ajax_referer( 'send_projectmessage', 'send_projectmessage_nonce' );

    $projectid = sanitize_text_field( $_POST['projectid'] );
    $userid = sanitize_text_field( $_POST['userid'] );
    $message = sanitize_text_field( $_POST['message'] );

    $wpdb->insert( 'tbl_messages', array(
        'project_id'   => $projectid,
        'user_id'      => $userid,
        'message_body' => $message
    ) );

    wp_send_json_success();
}

また、POSTを介してuseridを送信することはお勧めしません。ユーザーが自分で定義できるためです。これがWordPress userの場合その値を取得するには、代わりに内部コア関数を使用する必要があるID:

add_action( 'wp_ajax_send_projectmessage', 'send_projectmessage' );

function send_projectmessage() {

    global $wpdb;

    check_ajax_referer( 'send_projectmessage', 'send_projectmessage_nonce' );
    $user_id = get_current_user_id();

    if ( empty( $user_id ) ) {
        wp_send_json_error( array( 'not_logged_in' => 'User is not logged in' ) );
        return;
    }

    $projectid = sanitize_text_field( $_POST['projectid'] );
    $message = sanitize_text_field( $_POST['message'] );

    $wpdb->insert( 'tbl_messages', array(
        'project_id'   => $projectid,
        'user_id'      => $user_id,
        'message_body' => $message
    ) );

    wp_send_json_success();
}

Nonceについては、こちらをご覧ください:

https://codex.wordpress.org/WordPress_Nonceshttps://codex.wordpress.org/Function_Reference/wp_nonce_field

ページのどこかに、非表示のノンスフィールドを含める必要があります。

<?php wp_nonce_field( 'send_projectmessage', 'send_projectmessage_nonce' ); ?>

そして、POSTに必ず含めてください。

$('#form-pm').on('submit',function(e) {

    e.preventDefault();
    var send_projectmessage_nonce = $('#send_projectmessage_nonce').val();
    //hardcode stuff for testing
        var testdata = { 
            'action': 'send_projectmessage',
            'projectid': '71', 
            'userid': '1', 
            'message': 'voila',
            'send_projectmessage_nonce': send_projectmessage_nonce
        };

        var ajaxRequest =
        $.ajax({
            url: admin_ajax.ajax_url,
            type: 'post',
            data: testdata
        });

        ajaxRequest.done(function(data) { console.log(data); });
        ajaxRequest.fail(function(jqXHR) { alert('You are fail. ' + jqXHR); });      
});
2
sMyles