WordPress 아약스 요청을 끝내는 가장 좋은 방법은 무엇입니까?


16

다음과 같은 일반적인 WordPress 아약스 요청을 고려하십시오.

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(), 또는 뭔가 다른 이유는 무엇입니까?

답변:


13

사용하는 wp_die()것이 가장 좋습니다.

다른 사람들이 지적했듯이, WordPress 관련 기능을 일반 die또는 exit다음 보다 선호하는 많은 이유가 있습니다 .

  • 다른 플러그인이에 의해 호출되는 작업에 연결될 수 있습니다 wp_die().
  • 컨텍스트를 기반으로 종료하는 특수 핸들러를 사용할 수 있습니다 ( wp_die()요청이 Ajax 요청인지 여부에 따라 동작 이 조정 됨).
  • 코드를 테스트 할 수 있습니다.

마지막 것이 더 중요 하므로 Codex에 해당 메모를 추가했습니다 . 코드에 대한 단위 / 통합 테스트 를 작성 하려는 경우 exit또는 die직접 호출하는 함수를 테스트 할 수 없습니다 . 예상대로 스크립트를 종료합니다. 이것을 피하기 위해 WordPress 자체 테스트를 설정하는 방법은 (테스트가있는 Ajax 콜백의 경우) 트리거 된 작업에 연결 wp_die()하고 예외를 throw하는 것입니다. 이를 통해 테스트 내에서 예외를 포착하고 콜백 (있는 경우)의 출력을 분석 할 수 있습니다.

당신이 사용하는 것이 유일한 시간 die또는 exit당신의 특별한 처리를 우회하려는 경우입니다 wp_die()즉시 실행을 죽인다. WordPress 에서이 작업을 수행하는 곳이 있습니다 (그리고 die처리 wp_die()가 중요하지 않거나 직접 코드 조각에 대한 테스트를 시도하지 않았기 때문에 직접 간과 할 수있는 곳이 있습니다). 이렇게하면 코드를 테스트하기가 더 어려워 지므로 일반적으로 함수 본문에없는 코드 (예 : WordPress에서와 같이)에만 사용됩니다 admin-ajax.php. 따라서 처리를 wp_die()구체적으로 원하지 않거나 예방 조치로 특정 시점에서 스크립트를 죽이는 경우 (예 :admin-ajax.php일반적으로 Ajax 콜백이 이미 올바르게 종료 될 것으로 예상하면 die직접 사용 하는 것이 좋습니다.

wp_die()vs의 관점 wp_die( 0 )에서, 프론트 엔드에서 해당 Ajax 요청의 응답을 처리하는 대상에 따라 다릅니다. 특정 응답 본문이 필요한 경우 해당 메시지 (또는이 경우 정수)를로 전달해야합니다 wp_die(). 수신 대기중인 모든 응답이 200응답 코드 ( 응답 코드 또는 기타)이면 전달할 필요가 없습니다 wp_die(). 그러나로 끝나는 wp_die( 0 )응답은 기본 admin-ajax.php응답 과 구분할 수 없게됩니다 . 따라서 0콜백이 제대로 연결되어 실제로 실행되었는지 여부를 알려주지 않습니다. 다른 메시지가 더 좋습니다.

다른 답변에서 지적했듯이 종종 wp_send_json()et al. JSON 응답을 다시 보내는 경우에 도움이됩니다. 일반적으로 좋은 생각입니다. wp_die()필요한 경우 JSON 객체로 훨씬 더 많은 정보를 다시 전달할 수 있기 때문에 코드를 호출 하는 것보다이 방법이 더 좋습니다. 를 사용 wp_send_json_success()하고 wp_send_json_error()성공 / 오류 메시지를 WordPress에서 제공하는 모든 JS Ajax 헬퍼 기능이 이해할 수있는 표준 형식으로 다시 보냅니다 (예 wp.ajax:).

TL; DR :wp_die() Ajax 콜백 여부에 관계없이 항상을 사용해야 합니다. 더 좋은 방법은 wp_send_json()친구 와 정보를 다시 보내십시오 .


좋은 관점을 추가했습니다. 나는 생각으로 실을 업데이트했다. 원하는 경우 의견을 제시 할 수 있습니다. @JD
— prosti

@prosti 감사합니다. 귀하 die대신 WordPress가 언제 어떻게 사용되는지에 대한 단락을 추가했습니다 wp_die().
— JD

나는 워드 프레스 코어 가끔 사용하는 이유하지만, 이해가 안, 당신의 노력에 감사 die()하고 때로는 wp_die().
— prosti

감사합니다 @prosti. WordPress에서 때때로을 사용하는 이유에 관해서는 die()경우에 따라 레거시 코드 일뿐이거나 die()실제로 예기치 않은 일이 발생하여 wp_die()호출되지 않은 경우 마지막 수단으로 스크립트를 종료하는 데 사용됩니다 . 다른 경우에는 아무도 코드 조각에 대한 테스트를 만들지 wp_die()않았으므로 특별한 처리 가 특별히 필요하지 않으므로 간과되었습니다.
— JD

13

플러그인 의 코덱스 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()대신을 사용하는 것에 주목하십시오 . 대부분의 경우 Ajax 콜백 함수에서 사용해야합니다 . 이를 통해 WordPress와의 통합이 향상되고 코드를 쉽게 테스트 할 수 있습니다.die()exit()wp_die()


언급 한 ccodex는 훌륭하지만 WordPress 핵심은 따르지 않습니다. 어떻게에 대한?
— prosti

3
모든 wp_send_json_*기능을 모두 사용 wp_send_json여전히 호출wp_die
— Tunji

그러나 왜 여기에 뭔가 빠져 있습니다. 이 기능들을 분석하고 결론을 내렸습니까?
— prosti

1
wp_send_json답변에 메모를 추가 하시겠습니까?
— Mark Kaplun

1
어느 것이 맞습니까? wp_die (0) 또는 wp_die ()?
— Anwer AR

5

wp_send_json()Codex에 설명 된대로 사용할 수도 있습니다.send a JSON response back to an AJAX request, and die().

따라서 배열을 반환 해야하는 경우으로 만 기능을 종료합니다 wp_send_json($array_with_values);. echo또는 필요가 없습니다 die.

또한 두 개의 도움 도우미 기능을 얻을 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.

wp_json_encode예외가 발생하면 false를 반환 할 수 있습니다.이 경우 어떻게됩니까?
— prosti

세 번째 인수 (깊이)가 0보다 작은 경우 예외가 발생합니다.
— RRikesh

wp_send_json()가장 좋은 방법 이라고 생각 하십니까? 왜?
— prosti

@prosti wp_send_json() 는 우리를 위해 몇 가지 일 을합니다. 이 질문 은 또한 다루고 있습니다 wp_send_json().
— RRikesh

이것은 왜 WP 코어가 그 기능을 사용하라고 요청하는지 정확히 @RRikesh입니다. 왜 이럴까요? 그게 더 낫습니까?
— prosti

3

워드 프레스 아약스 / woo 커머스를 사용하는 경우 아약스 일반 구문은 다음과 같습니다.

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 ()를 사용해야합니다 .wordpress는 내부적으로 wp_die () 함수 중에 필터를 사용하기 때문에 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 ()를 사용할 필요는 없습니다 . wordpress 자체는 wp_send_json () 함수 내에서 wp_die () 함수를 안전하게 사용하기 때문입니다.


2

이것은 다른 사람들의 말에 추가 된 것입니다. 선호하는 이유 wp_die는 코어가 거기에서 작업을 트리거 할 수 있고 플러그인이 추적, 모니터링 또는 캐싱과 같은 작업을 올바르게 완료 할 수 있기 때문입니다.

일반적으로 직접 PHP 호출에서 얻지 못하는 값 (캐싱, 플러그인 통합 또는 기타)을 추가 할 가능성이 있으므로 가능한 경우 핵심 API 호출을 선호해야합니다.


2

나는이 답변을 받아들이지 않을 것이며, 이것은 공평하지 않을 것이다. 중요한 항목에 대한 개요와 가능한 힌트를 만들고 싶었습니다.

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

일반적으로 아약스 호출에서 얻는 것은 일종의 응답입니다. 응답은 json으로 인코딩되거나 json으로 인코딩되지 않을 수 있습니다.

우리가 jsonoutupt 가 필요 wp_send_json하거나 두 개의 위성이 좋은 생각입니다.

그러나, 우리는 반환 할 수 있습니다 x-www-form-urlencoded또는 multipart/form-data또는 text/xml또는 기타 인코딩 유형. 이 경우을 사용하지 않습니다 wp_send_json.

전체 HTML을 반환 할 수 있으며이 경우 wp_die()첫 번째와 두 번째 매개 변수 를 사용하는 것이 좋습니다. 그렇지 않으면 이러한 매개 변수가 비어 있어야합니다.

 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(...)?


1

사용하십시오 wp_die(). 가능한 한 WordPress 기능을 사용하는 것이 좋습니다.


1

당신이 사용하는 경우 echo , 당신이 사용하는 강제 die()또는 die(0)나 wp_die().

를 사용하지 않으면 echoJavaScript가이를 처리 할 수 ​​있습니다.

그런 다음 더 나은 방법으로 데이터를 반환해야합니다 wp_send_json().

콜백 json형식으로 데이터를 보내려면 다음을 사용할 수 있습니다.

wp_send_json()

wp_send_json_success()

wp_send_json_error()

그들 모두가 당신을 위해 죽을 것입니다. 나중에 나가거나 죽을 필요가 없습니다.

최신 정보

json출력 형식으로 필요하지 않은 경우 다음 을 사용해야합니다.

wp_die($response)

사망하기 전에 응답을 반환합니다. 코덱에 따라 :

이 함수 wp_die()는 비어 있거나 시간 초과되는 응답을 피하기 위해 죽기 직전에 출력하도록 설계되었습니다.

여기에서 전체 코덱 기사를 읽으 십시오 .


1
고마워요, 대신에 당신은 무엇을 제안 echo합니까?
— prosti

1
참고로 Javascript는을 처리하지 않습니다 echo. 당신을 위해 wp_send_json_*사용 echo하고 종료합니다. 클라이언트와 서버간에 혼동이 있습니다.
— Brian Fegter

@prosti wp_send_json ()
— 파이잘 알비

감사 json합니다. 출력 형식이 필요하지 않은 경우
— prosti

1
코덱에 따라 wp_die ($ response)를 사용해야하는 것보다 @prosti : wp_die () 함수는 비어 있거나 시간 초과되는 응답을 피하기 위해 죽기 직전에 출력을 제공하도록 설계되었습니다.
— 파이살 알비
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.