web-dev-qa-db-ja.com

Wp_ajax_にコールバック関数を追加しても効果はありません。

WordPress AJAX action woocommerce_apply_couponにもう1つコールバック関数を追加しようとしていました。

このアクションはWooCommerceプラグインで定義されています。プラグインファイルからこのアクションに独自のコールバック関数を追加します。

私が試したこと:

add_action( 'wp_ajax_nopriv_woocommerce_apply_coupon','darn',999);
add_action( 'wp_ajax_woocommerce_apply_coupon', 'darn',999);

function darn(){
         print_r($_REQUEST);
         exit;
    }

私のfunctions.phpの中でこれを行っても、私はこのコードの影響を見ることができないように、エラーを示すことすらありません。

私はこれが達成することさえ可能であるかどうか知りたいのです。ありがとうございました。

2
codepixlabs

はい。それは可能であり、あなたは正しい軌道に乗っています! :)

AJAX呼び出しは「舞台裏で」行われ、処理中に画面出力は生成されません。echoprint_rに関係なく、何も返されません。そのサーバーの応答はJavaScriptによって取得され、そこで処理されます。

それはあなたのAJAXアクションをデバッグするための2つの基本的なオプションをあなたに与えます:

1)AJAXアクションでerror_log()を使用して、出力をWP_DEBUG_LOGファイルに書き込み、そこで結果を確認することができます。

function darn(){
     error_log( print_r($_POST, 1) );
     exit;
}

詳細については、 Codex:Debugging_in_WordPress - WP_DEBUG_LOG を参照してください。

助言1:端末コンソールを起動し、デバッグの煩わしさのライブストリームにtail -f debug.logを使います;)

ヒント2:tail -f debug.log | grep -v 'bad-plugin'を使わないプラグインの作者からあまりにも多くのデバッグの不快さを排除するためにWP_DEBUG_LOGを使ってください。 P

2)javascript独自のconsole.log()を使用してブラウザで応答を確認します。

AJAXアクションから応答を送信...

function darn(){
    echo 'darn!'
    exit;
}

...そしてJSでそれを受け取る:

$.post(ajaxurl, data, function(response) {
    // Response will be 'darn!'
    if( typeof(console) == 'object' ) console.log( response );
});

アドバイス3:上記のように単純に応答をエコーする代わりに、wp_send_json() を使用できます。 JSON形式のレスポンスを生成する場合は、XMLの場合はWP_Ajax_Responseクラス。より複雑な応答やエラー処理に便利!

ヒント4:不明な点があれば、コメント欄で教えてください:D

ようこそ、WPSEを楽しんでください。

4
Michal Mau

他のハンドラコードが最初にフックされ、それがexit()も呼び出すと、スクリプトは終了するので、あなたのコードは決して実行されません。

他のハンドラを確認してください。

1
Otto