web-dev-qa-db-ja.com

Admin-ajax.phpは処理機能なしで "0"を消しています

WordpressでAJAX要求を正しい方法で処理する方法を学習しようとしています。これを行うために、私は このチュートリアル を使用して、(リンクからの)投稿のIDを自分のページに配置するという非常に単純なAJAXリクエストを作成します。コンテンツ。

ロジック

  1. #our-work aリンクがクリックされたとき[js]
  2. 投稿IDを取得し(data-id属性から)、それをpostID変数として保存します[js]
  3. AJAXを介してpostIDを渡す(WPのadmin-ajax.phpファイルを使用)[js]
  4. example_ajax_request関数はIDを拾い上げて単純にそれをエコーし​​ます[php]
  5. 成功したら、#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
Sheixt

これは私が誇らしげに言うことができるそれらのまれな時のうちの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' );
3
Sheixt

もう1つ注意が必要なのは、Wordpressにはwp_die()という独自のdie()があることです。私はAJAX呼び出しの終わりに私がそれを見つけるまでその0を得ていました。

echo(json_encode($return));
wp_die();

wp_send_json_successwp_send_json_error もあります。これらはすべて、末尾に0を付けずに、期待したとおりの結果を返します。

wp_send_json_success($data);

データ要素とともにjsonとして返される

success: function(trn) {
    console.log(trn.data)
}
0
Mark Cicchetti

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();
}
0
Yuvraj Khavad