このコードはチュートリアルから入手したばかりです。うまくいかないようです。
HTML(home.php)
<form name="myform" id="myform" action="" method="POST">
<!-- The Name form field -->
<label for="name" id="name_label">Name</label>
<input type="text" name="name" id="name" size="30" value=""/>
<br>
<!-- The Email form field -->
<label for="email" id="email_label">Email</label>
<input type="text" name="email" id="email" size="30" value=""/>
<br>
<!-- The Submit button -->
<input type="submit" name="submit" value="Submit">
</form>
<!-- We will output the results from process.php here -->
<div id="results"><div>
PHP(function.php)
function myform(){
echo "Form submitted successfully: <br>Your name is <b>".$_POST['name']."</b> and your email is <b>".$_POST['email']."</b><br>";
}
add_action('wp_ajax_myform', 'myform');
add_action('wp_ajax_nopriv_myform', 'myform');
Javascript(header.php)
<script type="text/javascript">
jQuery(document).ready(function(){
jQuery("#myform").validate({
debug: false,
rules: {
name: "required",
email: {
required: true,
email: true
}
},
messages: {
name: "Please let us know who you are.",
email: "A valid email will help us get in touch with you.",
},
submitHandler: function(form) {
// do other stuff for a valid form
jQuery.post('/wp-admin/admin-ajax.php', jQuery("#myform").serialize(), function(data) {
jQuery('#results').html(data);
});
}
});
});
</script>
これは理解するのに非常にイライラしました。私はこの問題に何時間もかけて、あなたの問題がこのインプットにあることを発見しました:
<input type="text" name="name" id="name" size="30" value=""/>
入力フィールド名を "name"以外に変更してみてください。例えば:
<input type="text" name="user_name" id="name" size="30" value=""/>
AJAXリクエストで404を受け取った場合は、パスが間違っています。パスをハードコーディングするのではなく、admin_url
を使用してパスを作成します。
jQuery.post(<?php admin_url('admin-ajax.php') ?>, // ...
テンプレートに直接印刷するよりも、 wp_localize_script
を介してJavascript変数に管理URLアドレスを印刷するほうがおそらく賢明です。例えば:
wp_enqueue_script('jquery');
wp_localize_script( 'jquery', 'my_ajax_vars', array(
'ajaxurl' => admin_url( 'admin-ajax.php' )
);
スクリプト、特にheader.php
をテンプレートに直接書くよりも、 登録 および エンキュー スクリプトをオフにしたほうがよいでしょう。書かれているように、あなたのjavascriptがすべてのページにロードするものであり、私はそれがすべてのページに必要であるとは思わない。
まず第一に、あなたのすべてのデータを無害化する。
次に、これを行います。
jQuery(function($){
$("#myform").validate({
debug: false,
rules: {
name: "required",
email: {
required: true,
email: true
}
},
messages: {
name: "Please let us know who you are.",
email: "A valid email will help us get in touch with you.",
},
submitHandler: function(form) {
// do other stuff for a valid form
//if you don't have your script localized and you will add it in header.php (not a good practice)
$.post(
'<?php echo admin_url('admin-ajax.php); ?>',
form.serialize(),
function(data){
//just to check the data
console.log(data);
$('#results').html(data);
}
});
jQuery.post('/wp-admin/admin-ajax.php', jQuery("#myform").serialize(), function(data) {
jQuery('#results').html(data);
});
}
});
});
そしてあなたのphp(functions.php)ファイルの中で:
必ずdie()を追加してください。機能の最後に。
function myform(){
echo "Form submitted successfully: <br>Your name is <b>".$_POST['name']."</b> and your email is <b>".$_POST['email']."</b><br>";
die();
}
add_action('wp_ajax_myform', 'myform');
add_action('wp_ajax_nopriv_myform', 'myform');
あなたは(wp)アクションをフォームまたはjQueryのajax関数に入れるのを忘れていました。
フォームに<input type="hidden" name="action" value="myform">
を追加すると、それはあなたのajax関数をフックします。