Erste Dinge zuerst: ist kein "Session-Cookie" im Sinne von PHP. Es ist ein normaler Cookie, der mit der PHP-Funktion setcookie
erstellt wurde. Das bedeutet, dass weder ini_set
noch wc_session_use_secure_cookie
dieses Verhalten ändern.
ich die WooCommerce Quellcode heruntergeladen haben und gefunden woocommerce\includes\wc-product-functions.php
:
/**
* Track product views.
*/
function wc_track_product_view() {
if (! is_singular('product') || ! is_active_widget(false, false, 'woocommerce_recently_viewed_products', true)) {
return;
}
global $post;
if (empty($_COOKIE['woocommerce_recently_viewed']))
$viewed_products = array();
else
$viewed_products = (array) explode('|', $_COOKIE['woocommerce_recently_viewed']);
if (! in_array($post->ID, $viewed_products)) {
$viewed_products[] = $post->ID;
}
if (sizeof($viewed_products) > 15) {
array_shift($viewed_products);
}
// Store for session only
wc_setcookie('woocommerce_recently_viewed', implode('|', $viewed_products));
}
add_action('template_redirect', 'wc_track_product_view', 20);
Die wc_setcookie
ist wie folgt definiert (woocommerce\includes\wc-core-functions.php
):
/**
* Set a cookie - wrapper for setcookie using WP constants.
*
* @param string $name Name of the cookie being set.
* @param string $value Value of the cookie.
* @param integer $expire Expiry of the cookie.
* @param string $secure Whether the cookie should be served only over https.
*/
function wc_setcookie($name, $value, $expire = 0, $secure = false) {
if (! headers_sent()) {
setcookie($name, $value, $expire, COOKIEPATH ? COOKIEPATH : '/', COOKIE_DOMAIN, $secure);
} elseif (defined('WP_DEBUG') && WP_DEBUG) {
headers_sent($file, $line);
trigger_error("{$name} cookie cannot be set - headers already sent by {$file} on line {$line}", E_USER_NOTICE);
}
}
Wie Sie sehen können, gibt es keine Wordpress-Filter zum Einhängen (sollte wirklich eine Einstellung sein, Fragen Sie eine Funktion Anfrage!), so müssen Sie die $secure
Parameter zu den Woocommerce Quellen hinzufügen ...
... aber es ist eine andere Art und Weise (ein bisschen Affe-Patch, aber hey, zumindest wir nicht brechen Dinge über Updates):
function custom_wc_track_product_view() {
if (! is_singular('product') || ! is_active_widget(false, false, 'woocommerce_recently_viewed_products', true)) {
return;
}
global $post;
if (empty($_COOKIE['woocommerce_recently_viewed']))
$viewed_products = array();
else
$viewed_products = (array) explode('|', $_COOKIE['woocommerce_recently_viewed']);
if (! in_array($post->ID, $viewed_products)) {
$viewed_products[] = $post->ID;
}
if (sizeof($viewed_products) > 15) {
array_shift($viewed_products);
}
// Store for session only
wc_setcookie('woocommerce_recently_viewed', implode('|', $viewed_products), 0, true);
}
remove_action('template_redirect', 'wc_track_product_view', 20);
add_action('template_redirect', 'custom_wc_track_product_view', 20);
ich die Funktion mit einem anderen Namen kopiert haben, hat die Änderungen, die ich brauchte, dann habe ich den Originalhaken durch meinen ersetzt. Setzen Sie diesen Code in ein neues Plugin oder in Thema functions.php
.
Leider gibt es keinen besseren Weg ohne WooCommerce Collaboration.
Danke für die Antwort. Ich habe Ihnen das Kopfgeld zugesprochen, obwohl ich eine Pull-Anfrage mit einer Option in den allgemeinen Einstellungen eingereicht habe, um alle Cookies zu sichern. Dumm, dass diese Funktion nicht schon da war. Danke noch einmal.. –