WordpressでAJAX要求を正しい方法で処理する方法を学習しようとしています。これを行うために、私は このチュートリアル を使用して、(リンクからの)投稿のIDを自分のページに配置するという非常に単純なAJAXリクエストを作成します。コンテンツ。
ロジック
#our-work a
リンクがクリックされたとき[js]data-id
属性から)、それをpostID
変数として保存します[js]postID
を渡す(WPのadmin-ajax.php
ファイルを使用)[js]example_ajax_request
関数はIDを拾い上げて単純にそれをエコーします[php]#hero
divにサーバーの応答を追加します。私はこれには利点がないことを認識していますが、その作業が完了したら、実際の目的を果たすために機能を修正します。
私のコード
これは私がpluginsフォルダに作成した関数のコピーです。
wp_enqueue_script( 'my-ajax-request', plugin_dir_url( __FILE__ ) . 'acl-plugin.js', array( 'jquery' ) );
wp_localize_script( 'my-ajax-request', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
function example_ajax_request() {
if ( isset($_REQUEST) ) {
$postID = $_REQUEST['postID'];
echo $postID;
}
die();
}
add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );
そして、これがJSファイルのコピーです。
jQuery(document).ready(function($) {
$('#our-work a').click( function() {
var postID = $(this).attr("data-id");
$.ajax({
url: MyAjax.ajaxurl,
data: {
'action':'example_ajax_request',
'postID' : postID
},
success:function(data) {
$('#hero').append( "Well this seems to work" + data );
},
error: function(errorThrown){
console.log("This has thrown an error:" + errorThrown);
}
});
return false;
});
});
問題
リンクをクリックするとJSは起動しますが、次のような応答を返します。
<div id="hero">
Well this seems to work 0
</div>
アラートを使用すると、AJAXリクエストの前にIDが取得されていることがわかります。だから問題は私の機能にあります。もっと知るために、私は(暫定的に)WPのadmin-ajax.php
ファイルを微調整しました、それで私はどのdie();
が "0"の応答を生み出しているかを見つけることができました。
それは私が私自身の関数にdie();
コマンドを持っているので私が発火しないだろうと思ったファイルの最後のものです。誰かが私が間違っているところを指摘してもらえますか?
これは私が誇らしげに言うことができるそれらのまれな時のうちの1つです...何の問題もないです!
サーバーが0
を返してきたのは、ログインしたからです。 wp_ajax_nopriv_example_ajax_request
はログインしていないユーザーのためだけのものです。ログアウトした後はこれでうまくいきます。
あなたが同じことをやろうとしているのであれば、ちょうどあなたが関数の下に両方のアクションを持っていることを確認してください:
add_action( 'wp_ajax_example_ajax_request', 'example_ajax_request' );
add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );
もう1つ注意が必要なのは、Wordpressにはwp_die()という独自のdie()があることです。私はAJAX呼び出しの終わりに私がそれを見つけるまでその0を得ていました。
echo(json_encode($return));
wp_die();
wp_send_json_success と wp_send_json_error もあります。これらはすべて、末尾に0を付けずに、期待したとおりの結果を返します。
wp_send_json_success($data);
データ要素とともにjsonとして返される
success: function(trn) {
console.log(trn.data)
}
Functionにwp_die();
の代わりにdie();
を使用してください。
add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );
add_action( 'wp_ajax_example_ajax_request', 'example_ajax_request' );
function example_ajax_request() {
// Your code goes here.
wp_die();
}