首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >woocommerce 3:删除登录用户的购物车项无效

woocommerce 3:删除登录用户的购物车项无效
EN

Stack Overflow用户
提问于 2017-12-29 17:30:49
回答 1查看 1K关注 0票数 1

我们使用wordpress JSON对用户进行登录,并添加/更新/删除购物车项。我们正在用register_rest_route函数来完成这个任务。

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

代码语言:javascript
复制
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()创建的响应正确地显示了没有删除项的购物车。但是,在页面重新加载之后,项目仍然存在。因为这只发生在登录用户,而不是客人,我认为这是一个会话问题。另外,使用以下方法更新购物车对于登录用户也是有效的:

代码语言:javascript
复制
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也不起作用。

这就是我们如何登录用户:

代码语言:javascript
复制
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的列表:

编辑:

我刚刚检查了饼干,同时登录并删除了一个购物车项目。

  1. 删除前的购物车哈希: bb35785a228a17ceb85f8ed2dc522b16
  2. 删除后的购物车哈希: d32e22e278d42022e04b6992b7d65816
  3. 页面重新加载后的购物车哈希:再次bb35785a228a17ceb85f8ed2dc522b16

因此,似乎购物车哈希存储在某个地方,并在重新加载时恢复,但在删除购物车项时没有正确更新。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-29 18:36:16

似乎您需要非need对删除请求进行身份验证。

现在,我在标题中为每个响应添加非Now:

代码语言:javascript
复制
function add_cors_http_header(){
    header("X-WP-Nonce: ".wp_create_nonce('wp_rest'));
}
add_action('init','add_cors_http_header');

在前面我把它设置为:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48026219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档