woocommerce 3:删除已登录用户的购物车商品无效

时间:2017-12-29 17:30:50

标签: wordpress session caching woocommerce session-cookies

我们使用wordpress JSON API来登录用户并添加/更新/删除购物车项目。我们使用register_rest_route函数执行此操作。

我们使用此代码删除购物车项目:

function remove_from_cart(WP_REST_Request $req)
{
    $resp = null;

    $cart_item = $req['cart_item'];
    try {
        WC()->cart->remove_cart_item($cart_item);
    } catch (Exception $e) {
        $resp = $e;
    }
    return rest_ensure_response(new CartResponse());
}

这对客人来说非常好。但是一旦登录用户尝试它,在重新加载页面后,购物车就会恢复正常状态。 new CartResponse()创建的响应正确显示没有删除项目的购物车。但是,在页面重新加载后,该项目仍然存在。 因为这只发生在登录用户而不是客人身上,我认为这是一个会话问题。 此外,使用以下方法更新购物车适用于登录用户:

function update_cart_item(WP_REST_Request $req)
{
    $resp = null;

    $cart_item = $req['cart_item'];
    try {
        if ($cart_item && $cart_item['quantity']) {
            WC()->cart->set_quantity($cart_item['key'], $cart_item['quantity']);
        }
    } catch (Exception $e) {
        $resp = $e;
    }
    return rest_ensure_response(new CartResponse());
}

不幸的是,将数量设置为0也无效。

这是我们签署用户的方式:

function login_customer(WP_REST_Request $req)
{

    $body = $req->get_body();
    $input = json_decode($body, TRUE);
    $credentials = ['user_login' => $input['email'], 'user_password' => $input['password']];

    $user = wp_signon($credentials, false);
    if (is_a($user, 'WP_Error') || !$user) {
        // if an error occurs, return null
        return rest_ensure_response(null);
    }
    $resp = new CustomerResponse($user->ID);
    return rest_ensure_response($resp);
}

我们没有使用任何缓存插件。这有什么不对?

以下是所有会话Cookie的列表:enter image description here

修改

我只是在登录并删除购物车项目时检查了Cookie。

  1. 删除前的购物车哈希:bb35785a228a17ceb85f8ed2dc522b16
  2. 删除后直接购物车哈希:d32e22e278d42022e04b6992b7d65816
  3. 重新加载页面后的购物车哈希:bb35785a228a17ceb85f8ed2dc522b16
  4. 所以看起来购物车哈希存储在某处并在重新加载时恢复,但在删除购物车项目时没有正确更新

1 个答案:

答案 0 :(得分:1)

您似乎需要随机数来验证DELETE请求。

现在我在标题中为每个响应添加随机数:

function add_cors_http_header(){
    header("X-WP-Nonce: ".wp_create_nonce('wp_rest'));
}
add_action('init','add_cors_http_header');

在我设置的前端:

let nonce: string = null;
export const fetchNoAuth = (endpoint: string, method: string = 'GET', data: any = null): Promise<any> => {
  let headers: any = {'Content-Type': 'application/json'};
  if (nonce) {
    headers['X-WP-Nonce'] = nonce;
  }
  return fetch('http://' + apiUrl + apiPath + endpoint + '?' + debugQuery, {
    method,
    credentials: 'include',
    headers,
    body: data ? JSON.stringify(data) : null
  })
    .then((data) => {
      const nonceFromResponse = data.headers.get('X-WP-Nonce');
      if (nonceFromResponse) {
        nonce = nonceFromResponse;
      } else {
        nonce = null;
      }
      return data;
    })
};

确保请求中的标头名为X-WP-Nonce