我们使用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。
所以看起来购物车哈希存储在某处并在重新加载时恢复,但在删除购物车项目时没有正确更新
答案 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