Obwohl das Problem uns seit PrestaShop 1.5 begleitet, scheinen die Entwicklerteams der letzten Jahre so etwas nicht für einen "kritischen Fehler" gehalten zu haben. Und nur solche haben anscheinend die Chance, irgendwann behoben zu werden. Ganz besonders virulent scheinen solche Fehler auch beim neuen PrestaShop 1.7 zu sein, zumindest lassen die vielen verzweifelten Anfragen im PrestaShop-Forum so etwas vermuten. Denn irgendwie läuft das alles auf einen Cache-Fehler hinaus.
Oder vielleicht doch nur irgendwie?
Den entscheidenden Hinweis hat, wie ich finde, ein User im PrestaShop-Forum schon vor über drei Jahren gegeben: "The problem is that prestashop creates cookies for www and non www domain." Und ein anderer User - ja, das gab es damals noch im PrestaShop-Forum! - hat daraufhin etwas später eine Lösung präsentiert, indem er die Funktion __construct in der /classes/Cookie.php erweiterte:
public function __construct($name, $path = '', $expire = null, $shared_urls = null, $standalone = false, $secure = false)
{
$this->_content = array();
$this->_standalone = $standalone;
$this->_expire = is_null($expire) ? time() + 1728000 : (int)$expire;
$this->_path = trim(($this->_standalone ? '' : Context::getContext()->shop->physical_uri).$path, '/\\').'/';
if ($this->_path{0} != '/') {
$this->_path = '/'.$this->_path;
}
$this->_path = rawurlencode($this->_path);
$this->_path = str_replace('%2F', '/', $this->_path);
$this->_path = str_replace('%7E', '~', $this->_path);
$this->_domain = $this->getDomain($shared_urls);
//remove www from url > example: .domain.com
$this->_domain =str_replace('www','', $this->_domain);
//Change cookie name "PrestaShop" > "MyCookieName"
$this->_name = 'MyCookieName-'.md5(($this->_standalone ? '' : _PS_VERSION_).$name.$this->_domain);
$this->_allow_writing = true;
$this->_salt = $this->_standalone ? str_pad('', 8, md5('ps'.__FILE__)) : _COOKIE_IV_;
if ($this->_standalone) {
$this->_cipherTool = new Blowfish(str_pad('', 56, md5('ps'.__FILE__)), str_pad('', 56, md5('iv'.__FILE__)));
} elseif (!Configuration::get('PS_CIPHER_ALGORITHM') || !defined('_RIJNDAEL_KEY_')) {
$this->_cipherTool = new Blowfish(_COOKIE_KEY_, _COOKIE_IV_);
} else {
$this->_cipherTool = new Rijndael(_RIJNDAEL_KEY_, _RIJNDAEL_IV_);
}
$this->_secure = (bool)$secure;
$this->update();
}
Der angenehme Nebeneffekt dieser Maßnahme ist: Von heute auf morgen verschwinden die vielen verwaisten Warenkörbe auf Nimmerwiedersehen.
Da dieser Teil PrestaShops mehr seit der Version 1.5 nicht mehr überarbeitet wurde, ist es das einfachste, daraus ein kleines Override zu machen und dies in das Verzeichnis /overrides/classes/Cookie.php einzuspielen. Anschließend einmal unter
- Erweiterte Einstellungen --> Leistung den Cache löschen oder
- im Back Office einmal STRG+F5 drücken oder
- per FTP die Datei /cache/class_index.php löschen (letztere enthält die Dateiverweise auf Original oder Override-Dateien und wird bei jedem Programmstart neu erzeugt).
Und das Problem ist fürs Erste gelöst!
Ich habe der Einfachheit halber die benötigten Overrides für 1.5 bis 1.7 als Zip-Datei zum Download angehängt. In 1.7 sieht die Funktion nur deshalb etwas anders aus, weil es dort die Klasse Rijndael.php nicht mehr gibt.
EDIT: Da sich in das Override für 1.5/16 ein kleiner Fehler eingeschlichen hatte, habe ich die ZIP-Datei am 18.07.2019, 19:00 Uhr geändert.