私は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/
値はパラメーターとして渡されませんが、$_POST
配列で渡されます。
check_ajax_nonce
https://developer.wordpress.org/reference/functions/check_ajax_referer/ を使用して、セキュリティのためにナンスを追加する必要がありますこれを行う方法を次に示します。
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); });
});