wp_enqueue_scriptsアクションフックのみを使用したadmin-ajax.phpでの400の不正なリクエスト
3 回答
- 投票
-
- 2018-01-17
ここで欠けているのは、
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' )
呼び出しなし.I think the only thing missing here is that you need to move
add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
outsideajax_login_init
.That code registers your Ajax handler, but when you only run it on
wp_enqueue_scripts
, it's already too late andwp_ajax_nopriv_
hooks are already run.So, have you tried something like this:
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(); }
Edit:
Now it's more clear that you only want to load the JavaScript on that particular page. This means you need to put your
is_page()
insideajax_login_init()
. I've updated the code accordingly.Now, why didn't your solution work?
The
is_page()
check meant that your functions file was only loaded on that specific page.ajax_login_init()
gets called and your scripts enqueued. So far so good.Now your script makes the ajax call. As mentioned in the comments, ajax calls are not aware of the current page you're on. There's a reason the file sits at
wp-admin/admin-ajax.php
. There's noWP_Query
and thusis_page()
does not work during an ajax request.Since that does not work,
sw18_page_specific_functions()
won't do anything in an ajax context. This means your functions file is not loaded and your ajax handler does not exist.That's why you need to always include that functions file and move that
is_page()
check insideajax_login_init()
.So instead of
sw18_page_specific_functions() { … }
just runinclude_once dirname(__FILE__).'/includes/my-page-test-functions.php';
directly. Without anyadd_action( 'parse_query' )
call.-
良い提案.私はそれを変更しましたが(それでも同じエラー)、問題は関数を含むファイルのロードが遅すぎることです.しかし、どのページが使用されているかを区別する方法が必要です.-現在、上記のようにis_page()でこれを試しています.Good suggestion. I have changed that (still the same error), but the problem still is that the file containing the functions will load too late. But I need a way to distinguish which page is used. - currently I try this with is_page () as described above.
- 0
- 2018-01-17
- Sin
-
`is_page()`を `ajax_login()`内から、または `ajax_login_init()`内から実行しようとしていますか?前者はAjaxコンテキストにあるため、機能しません.Are you trying to run `is_page()` from within `ajax_login()` or from within `ajax_login_init()`. The former can't work because it's in an Ajax context.
- 0
- 2018-01-17
- swissspidy
-
上記の説明文として、関数が含まれるファイルを列挙しました.is_page()はfunctions.phpで使用され、必要な場合にのみajax関数にファイルを含めるのに役立ちます.I have enumerated the files in which the functions are, as descriptive text above. The is_page() is used in the functions.php and serves to include the file with the ajax functions only when needed.
- 0
- 2018-01-17
- Sin
-
@Sin繰り返しますが、 `is_page()`はAjaxコンテキストでは機能しません.それに応じて回答を更新しました.@Sin Again, `is_page()` does not work in an Ajax context. I have updated my answer accordingly.
- 0
- 2018-01-17
- swissspidy
-
- 2019-04-14
wp_ajax_
タグに「action」関数名を追加することを忘れないでください.function fetchorderrows() { // Want to run this func on ajax submit // Do awesome things here all day long } add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);
Remember to have the 'action' function name appended to the
wp_ajax_
tag.function fetchorderrows() { // Want to run this func on ajax submit // Do awesome things here all day long } add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);
-
-
こんにちはZeeXhan.サイトへようこそ.あなたの答えはいくつかの修正が必要です.まず、答えがコードの場合は、スクリーンショットを投稿しないでください.代わりに、コードをスニペットとして投稿し、コードとしてフォーマットします({}ボタンを使用).それがあなたの答えが反対票を投じられ、受け入れられなかった理由である可能性があります.また、もう少し説明が役立つでしょう-「なぜ」は単にdie()を書くだけで、これはOP(元の投稿)のコードとの関係で正確にどこに行きますか?Hi Zee Xhan. Welcome to the site. Your answer needs some revisions. First, if your answer is code, don't post a screenshot. Instead, post the code as a snippet and format it as code (use the {} button). That's likely the reason your answer was downvoted and not accepted. Also, a little more explanation would be helpful - like "why" just write die(), and where exactly does this go in relation to the code in the OP (original post)?
- 9
- 2018-11-12
- butlerblog
-
私は最近ajaxに取り組んでいます.ネット上にあるチュートリアルはすべて非常によく似ており、実装が非常に簡単です. しかし、
ajax-admin.php
ファイルで常に不正なリクエスト400 を受け取ります.長く集中的に検索した結果、統合の時期が原因であることがわかりました.
init
アクションフックを使用してスクリプトとwp_localize_script
を初期化すると、すべて正常に機能します.したがって、コード自体は正しくなければなりません.my-page-test-functions.php
しかし、私が使用する場合、例えば
wp_enqeue_scripts
アクションフック私はいつも悪いリクエストを受け取ります.これに関する問題は次のとおりです:
関数を追加のphpファイルに入れて、特定のページで必要な場合にのみロードしたいと思います.これには、たとえば
is_page()
が必要です. しかし、is_page()
は、インクルードを使用して関数をparse_query
アクションフックにフックすると、最も早く機能します.Functions.php
したがって、
my-page-test-functions.php
ファイルのinit
フックにフックされた関数はトリガーされない、と私は思います.init
はparse_query
の前にあります.これを整理するためのベストプラクティスはありますか?または、
wp_enqeue_scripts
アクションフックを使用しているときにadmin-ajax.php
の不正なリクエストを修正するにはどうすればよいですか?