为什么无法访问Ajax成功响应

时间:2019-01-12 05:32:16

标签: php jquery ajax wordpress

我有一个简单的jQuery Ajax帖子调用有效。产品已生成并添加到购物车。 我确实找到了很多答案,但是似乎没有一个答案。

但是我无法在我的JS代码中访问响应内容(帖子ID)本身。 在下面的代码中(在注释中),我尝试了几次尝试都无济于事。

我想念什么?

Ajax发布请求:

    jQuery.post(
                ts_woo.ajax_url, 
                {'action': 'do_ts_woo',
                 'order': orderfilename, 
                 'tilesize': globalTileSize, 
                 'board': urlAtts,
                 'table': table
                },
                function(data) {
                   console.log("type of response="+ typeof data + " string=" + data); // data is a string but does not display it.
                   var response = jQuery.parseJSON(JSON.stringify(data));

                   console.log("do_ts_woo. Got id="+response); // undefined & so is response.id 
                      pid = response;
                      if(pid>0){
                         //pid = response['id'];
                         console.log("do_ts_woo. SUCCESS response="+pid);
                 alert('Add to cart: ' + response.id);
                         ts_iframe(shopdomain + "/cart/?add-to-cart="+pid);
                      } else {
                        // ALWAYS end up here while all was successful...
                         console.log("do_ts_woo. FAILURE response="+response.id);
                      }
                      return false;
                }
    ).done(function(response) {/* alert( "done:"+response );*/})
     .fail(function(msg) {alert( "error msg="+msg );})
     .always(function(response) {
//console.log("do_ts_woo. ALWAYS respone.id="+response.id); SAME PROBLEM HERE
     });

这是PHP代码

    $pid = generate_woo_product("ts-".date("Ymd_His"), $product_price[1], $pimage, $allTable); // PRODUCT is GENERATED

    error_log("pid =". $pid);
    if ($pid > 0){
         error_log ("product pid=".$pid." generated successfully"); 
         echo $pid; 
    //tried wp_send_json_success($pid); 
    //tried wp_send_json_success(array('success' => true, 'id' => $pid));
    } else error_log("do_ts_woo: FAIL generate_woo_product returned".$pid);
    wp_die();   

1 个答案:

答案 0 :(得分:1)

请尝试使用

wp_send_json(['pid' => $pid]);
exit;

代替echo

然后使用

访问js中的$ pid
data.pid 

请在不使用data.pid的情况下使用JSON.parse,因为在这种情况下,数据必须是对象

如果没有,请考虑将此代码添加到您的functions.php中。

add_action( 'rest_api_init', 'salient_child_rest_api_init' );
function salient_child_rest_api_init() {
    register_rest_route(
        'namespace/v1',
        '/example',
        [
            'methods'  => WP_REST_Server::CREATABLE,
            'callback' => 'salient_child_process_example_endpoint',
        ]
    );
}

function salient_child_process_example_endpoint() {

    // your logic ...

    $data = [
        'pid' => 1
    ]; // example data for testing if it is working

    return new WP_REST_Response( $data, 200 );
}

并以此更改您的jQuery.post

jQuery.post(
        {
            url: `${document.location.origin}/wp-json/namespace/v1/example`,
            data: {
                'action': 'do_ts_woo',
                'order': orderfilename,
                'tilesize': globalTileSize,
                'board': urlAtts,
                'table': table
            },
            xhrFields: {
                withCredentials: true
            }
        })
        .done(function (data) {
            const pid = data.pid;

            if (pid > 0) {
                console.log("do_ts_woo. SUCCESS response=" + pid);
                alert('Add to cart: ' + response.id);
                ts_iframe(shopdomain + "/cart/?add-to-cart=" + pid);
            } else {
                console.log("do_ts_woo. FAILURE response=" + response.id);
            }

            return false;
        })
        .fail(function (msg) {
            alert("error msg=" + msg);
        })
        .always(function (response) {

        });

否则-可能会有PHP警告修改带有预期消息的响应输出并破坏响应数据。