AJAXリクエストを含むメールサインアップフォームを作成しようとしています。
早い段階で、Wordpressがデフォルトで$_POST
変数を空にすることがわかりました。 admin_post
とadmin_post_nopriv
を使用してみましたが、どちらも機能していないようです。私は今、次を試しています:
add_action('wp_ajax_nopriv_newsletter', 'subscribeToNewsletter');
add_action('wp_ajax_newsletter', 'subscribeToNewsletter');
function subscribeToNewsletter()
{
echo json_encode([ 'success' => true ]);
私のJavaScriptで、次を使用する場合:
axios
.post('/wp-admin/admin-ajax.php', {
'email' : '[email protected]',
'action' : 'newsletter',
})
.then(response => {
console.log(response.data);
});
400件の不正なリクエストを受け取り、0
が返されました。次のように変更した場合:
axios
.get('/wp-admin/[email protected]&action=newsletter')
.then(response => {
console.log(response.data);
});
すべてが機能します。
admin-ajax.php
はPOST
リクエストを処理できませんか?誰かをニュースレターに登録するためにGET
リクエスト*を使用したくないので、AJAX経由でそれを行いたいです。
* W3の学校から(通常は嫌いですが、リクエストの概要がわかりやすい):
GETリクエストに関するその他の注意事項:
ここでの問題は、axiosの動作方法だと思います。 WordPressではありません。ただし、ここでPOSTリクエストを使用することは間違いありません。
デフォルトでは、axiosはPOSTリクエストでデータを本文としてJSONとして送信すると信じています。 PHPのリクエストの本文でJSONを取得するには、これを行う必要があります(from here ):
$inputJSON = file_get_contents('php://input');
$input = json_decode($inputJSON, TRUE); //convert JSON into array
問題は、wp_ajax_
フックが機能するために、WordPressが$_REQUEST['action']
でアクションを探すことです。データがJSONとして送信されるときに$_REQUEST
が入力されないため、アクション名がリクエスト本文の一部である場合、これは設定されません。
フォームと同じようにPOSTデータをaxiosで送信し、$_POST
または$_REQUEST
でアクセスしたい場合は、 FormData
スクリプト内:
var data = new FormData();
data.append('email', '[email protected]');
data.append('action', 'newsletter');
axios
.post('/wp-admin/admin-ajax.php', data)
.then(response => {
console.log(response.data);
});
PS:ご存知の通り、この構文:response => {
、 はIEのどのバージョンでも動作しません 。