2017-12-29 54 views
1

Wir verwenden Wordpress JSON API, um einen Benutzer anzumelden und Warenkorb-Elemente hinzuzufügen/zu aktualisieren/zu entfernen. Wir machen das mit der register_rest_route Funktion.woocommerce 3: das Entfernen von Warenkorb-Elementen für eingeloggte Benutzer funktioniert nicht

Wir verwenden diesen Code einen Wagen Artikel zu entfernen:

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()); 
} 

Dies funktioniert für die Gäste völlig in Ordnung. Sobald ein angemeldeter Benutzer es jedoch versucht, kehrt der Warenkorb nach dem erneuten Laden der Seite in seinen normalen Zustand zurück. Die von erstellte Antwort zeigt den Einkaufswagen ohne den entfernten Artikel richtig an. Nach dem erneuten Laden der Seite ist das Element jedoch immer noch vorhanden. Da dies nur für eingeloggte Benutzer und nicht für Gäste passiert, denke ich, es ist ein Session-Problem. Außerdem funktioniert der Wagen mit dem folgenden Verfahren aktualisieren Benutzer für angemeldete:

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()); 
} 

Leider ist die Menge auf 0 Einstellung auch nicht funktioniert. Diese

ist, wie wir Benutzer SignOn:

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); 
} 

Und wir alle Caching-Plugins nicht verwenden. Was ist hier falsch? Hier

ist eine Liste aller Session-Cookies: enter image description here

EDIT:

Ich inspizierte nur die Cookies während angemeldet beeing in und Entfernen eines Wagenposition.

  1. Wagen Hash vor dem Löschen: bb35785a228a17ceb85f8ed2dc522b16
  2. Wagen Hash direkt nach dem Löschen: d32e22e278d42022e04b6992b7d65816
  3. Wagen Hash nach Neuladen der Seite: bb35785a228a17ceb85f8ed2dc522b16 wieder

So scheint es, wie die Warenkorb Hash ist irgendwo gespeichert und bei einem Neuladen wiederhergestellt, aber beim Löschen eines Warenkorb-Artikels nicht korrekt aktualisiert

Antwort

1

Es scheint, als ob Sie Nonces benötigen um DELETE-Anfragen zu authentifizieren.

Jetzt bin ich das Hinzufügen Nonces zu jeder Antwort in einem Header:

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

Und im Frontend ich es gesetzt:

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; 
    }) 
}; 

Vergewissern Sie sich, dass der Header in dem Antrag genannt wird X-WP-Nonce

Verwandte Themen