web-dev-qa-db-ja.com

POSTデータとAxiosを使用するとadmin-ajax.phpが機能しません

AJAXリクエストを含むメールサインアップフォームを作成しようとしています。

早い段階で、Wordpressがデフォルトで$_POST変数を空にすることがわかりました。 admin_postadmin_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.phpPOSTリクエストを処理できませんか?誰かをニュースレターに登録するためにGETリクエスト*を使用したくないので、AJAX経由でそれを行いたいです。


* W3の学校から(通常は嫌いですが、リクエストの概要がわかりやすい):

GETリクエストに関するその他の注意事項:

  • GETリクエストをキャッシュできます
  • GETリクエストはブラウザの履歴に残ります
  • GETリクエストをブックマークできます
  • 機密データを扱う場合は、GETリクエストを使用しないでください
  • GETリクエストには長さの制限があります
  • GETリクエストは、データをリクエストするためにのみ使用されます(変更は不可)
1
Djave

ここでの問題は、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のどのバージョンでも動作しません

3
Jacob Peattie