web-dev-qa-db-ja.com

WordPressのAjaxリクエストを終了する最良の方法とその理由

これらのような通常のWordPress ajaxリクエストを考えてみましょう。

add_action( 'wp_ajax_merrychristmas_happynewyear', array( $this, 'merrychristmas_happynewyear' ) );
add_action( 'wp_ajax_nopriv_merrychristmas_happynewyear', array( $this, 'merrychristmas_happynewyear' ) );

関数merrychristmas_happynewyeardie()die(0)wp_die()、またはそれ以外のもので終了するのが最善でしょうか。

12
prosti

これらのオプションの中で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()と友達に送り返します。

9
J.D.

コーデックスから 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とのより良い統合を提供し、あなたのコードをテストすることをより簡単にします。

11
Tunji

Codexにwp_send_json()と記述されている send a JSON response back to an AJAX request, and die(). を使うこともできます。

そのため、配列を返さなければならない場合は、関数をwp_send_json($array_with_values);で終了するだけです。 echodieは不要です。

また、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.
5
RRikesh

ワードプレスの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()関数を安全に使用するためです。

3
Saran

私はこの答えを受け入れないでしょう、これは公平ではないでしょう。私が大事にした項目について概要と考えられるヒントを作成したいと思いました。

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: }

wp_send_json

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: }

wp_doing_ajax

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-urlencodedmultipart/form-datatext/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.phpdie( '0' );を返すものです。

なぜwp_die(...)ではないのですか?

2
prosti

これは他の人が言ったことに加えてです。 wp_dieを好む理由は、coreがそこでアクションを引き起こすことができ、プラグインがトレース、モニタリング、キャッシュなどのことを適切に完了できることです。

一般的に、直接のPHP呼び出しでは得られない値(キャッシング、プラグインの統合など)を追加する可能性があるため、コアAPI呼び出しを使用する場合は常にコアAPI呼び出しを優先する必要があります。

2
Mark Kaplun

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()は、空またはタイムアウトの応答を避けるために、終了する直前に出力を提供するように設計されています。

完全なコーデックス記事 ここ を読んでください。

1
Faisal Alvi

wp_die()を使用してください。できる限りWordPressの機能を使用することをお勧めします。

1
Greeso