webentwicklung-frage-antwort-db.com.de

Speichern oder Zwischenspeichern von benutzerdefinierten Warenkorbdaten für jede Benutzersitzung

Ich entwickle einen Einkaufswagen und möchte keine Plugins verwenden, da keines meiner Plugins meine Anforderungen erfüllen kann. Also mache ich mich auf den Weg, um meinen eigenen Warenkorb zu erstellen.

Meine Frage ist: Wie speichere ich, was der Benutzer seinem Warenkorb hinzugefügt hat?

Ich habe über wp_cache und über Transients API gelesen.

Sind sie sicher genug?

Gibt es einen anderen besseren Weg?

1
Samer Massad

Transienten können verwendet werden, Sie müssen jedoch sicherstellen, dass sie nicht früher als gewünscht ablaufen.

Ich habe eine ähnliche Frage mit einem anderen Ziel beantwortet hier , aber ich habe versucht, die etwas andere Antwort in sich geschlossen zu halten.

Option 1 - PHP Sitzungen

Ich habe Einkaufswagen in einer PHP Sitzung gespeichert, was im Allgemeinen in Ordnung ist, aber gelegentlich ein paar Probleme hat. Während es funktioniert, würde ich etwas Robusteres empfehlen.

Mein Plugin-Code verwendet ein Basket-Objekt. Auf dem Aktions-Hook init starte ich die Sitzung PHP und wenn es ein serialisiertes Basket-Objekt in der Sitzung gibt, unserialisiere ich es in ein globales, ansonsten instanziiere ich einen neuen Basket in das globale.

Am Haken shutdown serialisiere ich mein Objekt in die Sitzung.

function setup_session() {

    global $Basket;

    session_start();

    if (isset($_SESSION['basket'])) {
        $Basket = unserialize($_SESSION['basket']);
    } else {
        $Basket = new Basket();
    }

    $Basket->do_actions(); 
    // my own hooks to allow me to add Housekeeping code without messing with my core codde

}



function save_session() {

    global $Basket;
    if (isset($Basket)) {
        $_SESSION['basket'] = serialize($Basket);
    }

}

add_action( 'init', 'setup_session' );
add_action( 'shutdown', 'save_session' ); // works even when redirecting away from a page

Das funktioniert gut, aber auf einer Seite treten einige Probleme mit leeren Körben auf, die wahrscheinlich auf einen Konflikt mit dem Sitzungscode für ein benutzerdefiniertes Login-Plugin zurückzuführen sind.

Option 2 - Bessere Sitzungen

Es gibt ein WP Session-Framework, das von Eric Mann geschrieben und von Pippin, der es in seinem bekannten Easy Digital Downloads-Plugin verwendet, gut erklärt wurde, hier . Sie verwenden eine globale $ wp_session genauso wie $ _SESSION, aber es gibt auch Hilfsfunktionen zum Verwalten der Sitzungen. Hierbei werden die Transienten von WP für die Lagerung verwendet, es wird jedoch auch die Verlängerung der Verfallszeiten richtig gehandhabt, damit Ihre Körbe nicht zu früh aufgeräumt werden.

Ich werde auf meine eigenen Websites übergehen, wenn ich mir genau angesehen habe, wie es für mich selbst funktioniert.

Wir versuchen, Sie nicht davon abzubringen, anderen Links in den Antworten zu folgen, da diese möglicherweise nicht von Dauer sind. Wenn Sie jedoch beide Links hierher ziehen, erhalten Sie eine recht lange Antwort.

Option 3 - Benutzeranmeldungen

Wenn Sie nicht möchten, dass Käufer ein Konto erstellen, ist dieser Ansatz nichts für Sie, es sei denn, Sie möchten das Konzept eines anonymen Benutzers codieren und dann dessen Warenkorb in einen Warenkorb für einen angemeldeten Benutzer umwandeln, während dieser sein Konto erstellt. Wenn Sie Benutzerkonten benötigen, ist dies der richtige Weg, da Sie die Sitzungsverwaltung an die in WP integrierten Benutzeranmeldungen übergeben können. Dann können Sie auf init & shutdown Ihren Warenkorb in ein Benutzer-Metafeld unserialisieren und serialisieren, das zwischen Anmeldesitzungen bestehen bleibt.

Während update_user_meta die Serialisierung für Sie übernimmt, sollten Sie diesen langjährigen Fehler berücksichtigen, wenn Sie versuchen, ein Objekt zu speichern.

0