wp_enqueue_scriptsアクションフックのみを使用したadmin-ajax.phpでの400の悪いリクエスト


15

私は最近ajaxに取り組んでいます。ネットで見つけたチュートリアルはすべて非常に似ており、実装が非常に簡単です。しかし、私は常に私のファイルに悪いリクエスト400を受け取りajax-admin.phpます。

長時間にわたる集中的な検索の後、統合の時期が原因であることがわかりました。

initアクションフックを使用してスクリプトとを初期化するとwp_localize_script、すべてが正常に機能します。したがって、コード自体が正しい必要があります。

my-page-test-functions.php

function ajax_login_init(){
   wp_register_script('ajax-login-script',get_stylesheet_directory_uri().'/js/ajax-login-script.js',array('jquery'));
   wp_enqueue_script('ajax-login-script');
   wp_localize_script('ajax-login-script','ajax_login_object',array('ajaxurl' => admin_url('admin-ajax.php'),'redirecturl' => 'REDIRECT_URL_HERE','loadingmessage' => __('Sending user info, please wait...')));
   add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
}

if(!is_user_logged_in()){
   add_action('init','ajax_login_init');
}

function ajax_login(){
    //nonce-field is created on page
    check_ajax_referer('ajax-login-nonce','security');
    //CODE
    die();
}

しかし、たとえばwp_enqeue_scriptsアクションフックを使用すると、常に悪いリクエストが返されます。

if(!is_user_logged_in()){
    add_action('wp_enqueue_scripts','ajax_login_init');
}

これの問題は次のとおりです。

関数を追加のphpファイルに入れて、特定のページで必要な場合にのみロードしたいです。これには、たとえばが必要is_page()です。しかしis_page()parse_queryアクションフックにincludeを使用して関数をフックすると、最も早く動作します。

functions.php

function sw18_page_specific_functions(){
    if(is_page('page-test')){
        include_once dirname(__FILE__).'/includes/my-page-test-functions.php';
    }
}

add_action('parse_query','sw18_page_specific_functions');

それでは機能がために夢中initにフックmy-page-test-functions.phpトリガーされませんので、私が思う、ファイルinitの前に来ますparse_query

これを整理するベストプラクティスはありますか?またはadmin-ajax.phpwp_enqeue_scriptsアクションフックを使用しているときに、どうすれば悪いリクエストを修正できますか?

回答:


13

ここで欠けている唯一のことはあなたがadd_action('wp_ajax_nopriv_ajaxlogin','ajax_login');外に移動する必要があると思いますajax_login_init

このコードはAjaxハンドラーを登録しますがwp_enqueue_scripts、それを実行するだけの場合は既に手遅れであり、wp_ajax_nopriv_フックは既に実行されています。

だから、あなたはこのようなことを試しましたか:

function ajax_login_init(){
  if ( ! is_user_logged_in() || ! is_page( 'page-test' ) ) {
    return;
  }

  wp_register_script('ajax-login-script',get_stylesheet_directory_uri().'/js/ajax-login-script.js',array('jquery'));
  wp_enqueue_script('ajax-login-script');
  wp_localize_script('ajax-login-script','ajax_login_object',array('ajaxurl' => admin_url('admin-ajax.php'),'redirecturl' => 'REDIRECT_URL_HERE','loadingmessage' => __('Sending user info, please wait...')));
}

add_action( 'wp_enqueue_scripts','ajax_login_init' );

add_action( 'wp_ajax_nopriv_ajaxlogin','ajax_login' );

function ajax_login(){
  //nonce-field is created on page
  check_ajax_referer('ajax-login-nonce','security');
  //CODE
  die();
}

編集:

これで、特定のページにのみJavaScriptをロードしたいことがより明確になります。これはあなたのis_page()中に置く必要があることを意味しますajax_login_init()。それに応じてコードを更新しました。

さて、なぜあなたのソリューションは機能しなかったのですか?

このis_page()チェックは、関数ファイルがその特定のページにのみロードされることを意味していました。ajax_login_init()呼び出され、スクリプトがキューに入れられます。ここまでは順調ですね。

これで、スクリプトがajax呼び出しを行います。コメントで述べたように、ajax呼び出しは現在のページを認識していません。ファイルがにあるのには理由がありますwp-admin/admin-ajax.php。ないWP_Queryためis_page()、ajaxリクエスト中は機能しません。

これは機能しないためsw18_page_specific_functions()、ajaxコンテキストでは何もしません。これは、関数ファイルがロードされておらず、ajaxハンドラーが存在しないことを意味します。

そのため、その関数ファイルを常に含め、そのis_page()チェックを内部に移動する必要がありajax_login_init()ます。

そのsw18_page_specific_functions() { … }ため、include_once dirname(__FILE__).'/includes/my-page-test-functions.php';直接実行する代わりに。add_action( 'parse_query' )呼び出しなし。


良い提案。私はそれを変更しました(それでも同じエラーです)が、問題はまだ関数を含むファイルの読み込みが遅すぎるということです。しかし、使用されているページを区別する方法が必要です。-現在、上記のようにis_page()でこれを試します。

is_page()ajax_login()からまたは内から実行しようとしていますajax_login_init()。前者はAjaxコンテキストにあるため機能しません。
swissspidy

上記の説明テキストとして、関数が含まれるファイルを列挙しました。is_page()はfunctions.phpで使用され、必要な場合にのみファイルをajax関数に含める役割を果たします。

@Sin繰り返しis_page()ますが、Ajaxコンテキストでは機能しません。それに応じて回答を更新しました。
swissspidy

0

wp_ajax_タグに「アクション」関数名を追加することを忘れないでください。

function fetchorderrows() { // Want to run this func on ajax submit
  // Do awesome things here all day long
}

add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);

-3

ただダイを書きます。最後に次のように...ここに画像の説明を入力してください


8
こんにちはジー・シャン。サイトへようこそ。あなたの答えにはいくつかの修正が必要です。まず、答えがコードの場合、スクリーンショットを投稿しないでください。代わりに、コードをスニペットとして投稿し、コードとしてフォーマットします({}ボタンを使用します)。それがおそらくあなたの答えが落とされ、受け入れられなかった理由です。また、もう少し説明が役立つでしょう-「なぜ」die()を書くだけで、OP(元の投稿)のコードに関連して正確にこれはどこに行くのですか?
-butlerblog
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.