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.