Manchmal möchte man wissen, ob ein Website Besucher (Visitor) bereits auf deiner Website war und vielleicht sogar schon einige Aktionen ausgeführt hat, die man bereits abgespeichert hat.
Zum Beispiel um zu erfassen, ob ein Visitor bereits einen Post hochgevotet bzw geliked hat wie ich es in meinen Beitrag: Custom Upvote / Like Funktion für WordPress Posts erkläre. Dieser Beitrag ist zugleich die Vorbereitung für die Upvote Funktion.
Einen einzigartigen Token pro Visitor generieren
Wir benötigen einen einzigartigen String den wir einem Visitor via Cookie zuweisen. Dazu brauchen wir zunächst einen Token Generator.
Token Generator
function keygen() {
$data = random_bytes(16);
assert(strlen($data) == 16);
$data[6] = chr(ord($data[6]) & 0x0f | 0x40);
$data[8] = chr(ord($data[8]) & 0x3f | 0x80);
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
Diese Funktion wird einen zufälligen einzigartigen String ausgeben, der z.B. so aussehen kann: 3abc17d1-2a8e-4ad8-bea4-697d5a765e0c
Cookie setzen
Beim Erstaufruf eines Visitors wird mit dem folgenden Codebaustein ein Token generiert und der Cookie vt (visitor_token) gesetzt.
function set_cookie() {
if (headers_sent()) return;
// prüft ob Besucher ein Bot ist, wenn ja wird kein Token generiert / Cookie gesetzt
$agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
if (stripos($agent, 'Bot') !== false) {
return;
}
// Visitor Cookie
$visitor_cookie_set = 0;
if ( isset( $_COOKIE['vt'] ) ) {
$visitor_cookie_set= 1;
if ( '' === trim($_COOKIE['vt']) ) {
// Wenn Cookie gesetzt ist aber keinen Wert hat, wird er hier gelöscht.
unset($_COOKIE['vt']);
setcookie('vt', '', time() - 3600, '/');
$visitor_cookie_set= 0;
}
}
if ( 0 === (int) $visitor_cookie_set ) {
// token wird generiert
$token = keygen();
// cookie 'vt' wird gesetzt
setcookie( 'vt', $token, time()+YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
}
}
add_action( 'init', 'set_cookie', -1 );
Deine Website Besucher erhalten jetzt einen Cookie für 365 Tage du kannst den Visitor nun wie folgt identifizieren:
if ( isset( $_COOKIE['vt'] ) ) {
$visitor = $_COOKIE['vt'];
}