これらのような通常のWordPress ajaxリクエストを考えてみましょう。
add_action( 'wp_ajax_merrychristmas_happynewyear', array( $this, 'merrychristmas_happynewyear' ) );
add_action( 'wp_ajax_nopriv_merrychristmas_happynewyear', array( $this, 'merrychristmas_happynewyear' ) );
関数merrychristmas_happynewyear
をdie()
、die(0)
、wp_die()
、またはそれ以外のもので終了するのが最善でしょうか。
これらのオプションの中でwp_die()
を使用するのが最善です。
他の人が指摘したように、プレーンdie
またはexit
よりもWordPress固有の機能を好む多くの理由があります。
wp_die()
によって呼び出されるアクションにフックできるようにします。wp_die()
の動作は、リクエストがAjaxリクエストであるかどうかに基づいて調整されます)。最後の方がより重要です。そのため、 Codexにそのメモを追加しました 。コードに対して ユニット/統合テストの作成 を実行する場合、exit
またはdie
を直接呼び出す関数をテストすることはできません。想定されるように、スクリプトを終了します。これを回避するためにWordPress独自のテストを設定する方法(テスト対象のAjaxコールバックの場合)は、wp_die()
によってトリガーされるアクションにフックし、例外をスローすることです。これにより、テスト内で例外をキャッチし、コールバックの出力(ある場合)を分析できます。
die
またはexit
を使用するのは、wp_die()
から特別な処理をバイパスし、すぐに実行を強制終了する場合のみです。 WordPressがこれを行う場所(およびwp_die()
からの処理が重要でない、または誰も作品のテストを作成しようとしていないためにdie
を直接使用する可能性のある場所があります)まだコードので、見落とされていました)。また、これによりコードのテストがより難しくなるため、通常は関数本体にないコードでのみ使用されます(WordPressがadmin-ajax.php
で行うように)。したがって、wp_die()
からの処理が特に望ましくない場合、または予防措置として特定の時点でスクリプトを強制終了する場合(admin-ajax.php
のように、通常はAjaxコールバックが既に適切に終了することを期待している場合)、 die
を直接使用します。
wp_die()
対wp_die( 0 )
の観点から、使用する必要があるのは、フロントエンドでそのAjax要求の応答を処理しているものによって異なります。特定の応答本文を予期している場合、そのメッセージ(この場合は整数)をwp_die()
に渡す必要があります。リッスンしているのが成功した応答(200
応答コードなど)のみである場合、wp_die()
に何も渡す必要はありません。ただし、wp_die( 0 )
で終わると、応答がデフォルトのadmin-ajax.php
応答と区別できなくなります。したがって、0
で終了しても、コールバックが適切に接続されて実際に実行されたかどうかはわかりません。別のメッセージの方が良いでしょう。
他の回答で指摘したように、wp_send_json()
et al。 JSONレスポンスを返送する場合に役立ちます。これは一般に良い考えです。また、必要に応じてJSONオブジェクトでより多くの情報を渡すことができるため、これはコードでwp_die()
を呼び出すよりも優れています。 wp_send_json_success()
とwp_send_json_error()
を使用すると、成功/エラーメッセージも標準形式で送信され、WordPressが提供するJS Ajaxヘルパー関数が理解できるようになります( wp.ajax
など) )。
TL; DR:Ajaxコールバックの有無にかかわらず、おそらくwp_die()
を常に使用する必要があります。さらに良いことに、情報をwp_send_json()
と友達に送り返します。
コーデックスから AJAXプラグイン
add_action( 'wp_ajax_my_action', 'my_action_callback' );
function my_action_callback() {
global $wpdb; // this is how you get access to the database
$whatever = intval( $_POST['whatever'] );
$whatever += 10;
echo $whatever;
wp_die(); // this is required to terminate immediately and return a proper response
}
wp_die()
またはdie()
の代わりにexit()
を使用していることに注意してください。ほとんどの場合、Ajaxコールバック関数でwp_die()
を使うべきです。これはWordPressとのより良い統合を提供し、あなたのコードをテストすることをより簡単にします。
Codexにwp_send_json()
と記述されている send a JSON response back to an AJAX request, and die().
を使うこともできます。
そのため、配列を返さなければならない場合は、関数をwp_send_json($array_with_values);
で終了するだけです。 echo
やdie
は不要です。
また、2つのヘルプヘルパー関数 wp_send_json_success()
と wp_send_json_error()
があり、それぞれsuccess
またはtrue
となるfalse
という名前のキーを追加します。
例えば:
$array_val = range( 1,10 );
var_dump( wp_send_json_error( $array_val ) ); # Output: {"success":false,"data":[1,2,3,4,5,6,7,8,9,10]}
echo 'Hey there'; # Not executed because already died.
ワードプレスのAjax/Wooコマースを使用するためのAjaxの一般的な構文は次のとおりです。
add_action( 'wp_ajax_my_action', 'my_action_callback' );
add_action( 'wp_ajax_nopriv_my_action', 'my_action_callback' );
function my_action_callback()
{
// your code goes here
wp_die();
}
Wp_die()関数の実行中は、ワードプレスは内部的に filter を使用しているので、wp_die()を使用しないでください。 )また、die()および他の関数は、実行を終了するときに考慮すべきワードプレス関数を考慮せずに、PHP実行を直ちに終了します。
内部でwp_send_json()を使用している場合は、次のように機能します。
function my_action_callback()
{
// your code goes here
wp_send_json();
//wp_die(); not necessary to use wp_die();
}
コールバック関数 の中にwp_send_json()を含める場合は、最後にwp_die()を使用する必要はありません。ワードプレス自体はwp_send_json()関数内でwp_die()関数を安全に使用するためです。
私はこの答えを受け入れないでしょう、これは公平ではないでしょう。私が大事にした項目について概要と考えられるヒントを作成したいと思いました。
File: wp-includes/functions.php
2607: /**
2608: * Kill WordPress execution and display HTML message with error message.
2609: *
2610: * This function complements the `die()` PHP function. The difference is that
2611: * HTML will be displayed to the user. It is recommended to use this function
2612: * only when the execution should not continue any further. It is not recommended
2613: * to call this function very often, and try to handle as many errors as possible
2614: * silently or more gracefully.
2615: *
2616: * As a shorthand, the desired HTTP response code may be passed as an integer to
2617: * the `$title` parameter (the default title would apply) or the `$args` parameter.
2618: *
2619: * @since 2.0.4
2620: * @since 4.1.0 The `$title` and `$args` parameters were changed to optionally accept
2621: * an integer to be used as the response code.
2622: *
2623: * @param string|WP_Error $message Optional. Error message. If this is a WP_Error object,
2624: * and not an Ajax or XML-RPC request, the error's messages are used.
2625: * Default empty.
2626: * @param string|int $title Optional. Error title. If `$message` is a `WP_Error` object,
2627: * error data with the key 'title' may be used to specify the title.
2628: * If `$title` is an integer, then it is treated as the response
2629: * code. Default empty.
2630: * @param string|array|int $args {
2631: * Optional. Arguments to control behavior. If `$args` is an integer, then it is treated
2632: * as the response code. Default empty array.
2633: *
2634: * @type int $response The HTTP response code. Default 200 for Ajax requests, 500 otherwise.
2635: * @type bool $back_link Whether to include a link to go back. Default false.
2636: * @type string $text_direction The text direction. This is only useful internally, when WordPress
2637: * is still loading and the site's locale is not set up yet. Accepts 'rtl'.
2638: * Default is the value of is_rtl().
2639: * }
2640: */
2641: function wp_die( $message = '', $title = '', $args = array() ) {
2642:
2643: if ( is_int( $args ) ) {
2644: $args = array( 'response' => $args );
2645: } elseif ( is_int( $title ) ) {
2646: $args = array( 'response' => $title );
2647: $title = '';
2648: }
2649:
2650: if ( wp_doing_ajax() ) {
2651: /**
2652: * Filters the callback for killing WordPress execution for Ajax requests.
2653: *
2654: * @since 3.4.0
2655: *
2656: * @param callable $function Callback function name.
2657: */
2658: $function = apply_filters( 'wp_die_ajax_handler', '_ajax_wp_die_handler' );
2659: } elseif ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) {
2660: /**
2661: * Filters the callback for killing WordPress execution for XML-RPC requests.
2662: *
2663: * @since 3.4.0
2664: *
2665: * @param callable $function Callback function name.
2666: */
2667: $function = apply_filters( 'wp_die_xmlrpc_handler', '_xmlrpc_wp_die_handler' );
2668: } else {
2669: /**
2670: * Filters the callback for killing WordPress execution for all non-Ajax, non-XML-RPC requests.
2671: *
2672: * @since 3.0.0
2673: *
2674: * @param callable $function Callback function name.
2675: */
2676: $function = apply_filters( 'wp_die_handler', '_default_wp_die_handler' );
2677: }
2678:
2679: call_user_func( $function, $message, $title, $args );
2680: }
File: wp-includes/functions.php
3144: /**
3145: * Send a JSON response back to an Ajax request.
3146: *
3147: * @since 3.5.0
3148: * @since 4.7.0 The `$status_code` parameter was added.
3149: *
3150: * @param mixed $response Variable (usually an array or object) to encode as JSON,
3151: * then print and die.
3152: * @param int $status_code The HTTP status code to output.
3153: */
3154: function wp_send_json( $response, $status_code = null ) {
3155: @header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) );
3156: if ( null !== $status_code ) {
3157: status_header( $status_code );
3158: }
3159: echo wp_json_encode( $response );
3160:
3161: if ( wp_doing_ajax() ) {
3162: wp_die( '', '', array(
3163: 'response' => null,
3164: ) );
3165: } else {
3166: die;
3167: }
3168: }
File: wp-includes/load.php
1044: /**
1045: * Determines whether the current request is a WordPress Ajax request.
1046: *
1047: * @since 4.7.0
1048: *
1049: * @return bool True if it's a WordPress Ajax request, false otherwise.
1050: */
1051: function wp_doing_ajax() {
1052: /**
1053: * Filters whether the current request is a WordPress Ajax request.
1054: *
1055: * @since 4.7.0
1056: *
1057: * @param bool $wp_doing_ajax Whether the current request is a WordPress Ajax request.
1058: */
1059: return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX );
1060: }
通常、私たちがajax呼び出しから得たものはある種の応答です。応答はjsonでエンコードされていても、jsonでエンコードされていなくてもかまいません。
json
outupt wp_send_json
が必要な場合、または2つの衛星が素晴らしいアイデアです。
ただし、x-www-form-urlencoded
、multipart/form-data
、text/xml
、またはその他のエンコーディングタイプを返すことがあります。その場合はwp_send_json
を使いません。
Html全体を返すこともありますが、その場合はwp_die()
の最初と2番目のパラメータを使用するのが意味があります。それ以外の場合、これらのパラメータは空にする必要があります。
wp_die( '', '', array(
'response' => null,
) );
しかし、パラメータなしでwp_die()
を呼び出すことの利点は何ですか?
最後に、あなたが素晴らしいWPコアをチェックすればあなたは見つけるかもしれません
File: wp-includes/class-wp-ajax-response.php
139: /**
140: * Display XML formatted responses.
141: *
142: * Sets the content type header to text/xml.
143: *
144: * @since 2.1.0
145: */
146: public function send() {
147: header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ) );
148: echo "<?xml version='1.0' encoding='" . get_option( 'blog_charset' ) . "' standalone='yes'?><wp_ajax>";
149: foreach ( (array) $this->responses as $response )
150: echo $response;
151: echo '</wp_ajax>';
152: if ( wp_doing_ajax() )
153: wp_die();
154: else
155: die();
どちらのフォーマットもdie()
とwp_die()
を使います。その理由を説明できますか?
最後に、admin-ajax.php
がdie( '0' );
を返すものです。
なぜwp_die(...)
ではないのですか?
これは他の人が言ったことに加えてです。 wp_die
を好む理由は、coreがそこでアクションを引き起こすことができ、プラグインがトレース、モニタリング、キャッシュなどのことを適切に完了できることです。
一般的に、直接のPHP呼び出しでは得られない値(キャッシング、プラグインの統合など)を追加する可能性があるため、コアAPI呼び出しを使用する場合は常にコアAPI呼び出しを優先する必要があります。
echo
を使用すると、die()
またはdie(0)
またはwp_die()
の使用を強制されます。
echo
を使用しない場合は、JavaScriptがそれを処理できます。
それならwp_send_json()
というデータを返すより良い方法を使うべきです。
コールバックでデータを(json
形式で)送信するには、次のようにします。
wp_send_json()
wp_send_json_success()
wp_send_json_error()
それらのすべてがあなたのために死ぬのです。後で終了したり、死ぬ必要はありません。
_ update _
出力フォーマットとしてjson
が必要ない場合は、次のようにします。
wp_die($response)
それは死ぬ前にそれはあなたの応答を返します。コーデックスに従って:
関数
wp_die()
は、空またはタイムアウトの応答を避けるために、終了する直前に出力を提供するように設計されています。
完全なコーデックス記事 ここ を読んでください。
wp_die()
を使用してください。できる限りWordPressの機能を使用することをお勧めします。