I am trying to setup a multi store website with shared cart. I followed the instruction on this article: Share cart in magento 2 multistore
However, I noticed that sharing cart functionality does not work. I am only able to add items to the cart for the default store.
I will outline the key steps below.
Created multiple Stores
I have setup 3 Stores with 1 Website. Each Store has its unique Store View.
One thing ambiguous about this article was that what to do with the Default Store View
. I changed Store Code
for the "Default Store View" from "default" to "store1". And renamed it from "Default Store View" to "Store View 1".
I set Store Code
for the 2nd Store as "store2", and same for 3rd Store as "store3".
Root Categories for each store
I used the Default Category
as the root category for store1.
I created Store2 Root Category for store2.
I created Store3 Root Category for store3.
Share cart admin setting
Since I wanted to share the cart among 3 Stores, I had to set Share Customer Accounts
as "Global" for the Default Config.
Domain names
I created virtual hosts for the default domain as "dev.m2.com".
The 2nd store domain is "dev.m2b.com".
The 3rd store domain is "dev.m2c.com".
.htaccess change
I added this code to .htaccess
file on the project root:
SetEnvIf Host dev.m2.com MAGE_RUN_CODE=store1
SetEnvIf Host dev.m2.com MAGE_RUN_TYPE=store
SetEnvIf Host ^dev.m2.com MAGE_RUN_CODE=store1
SetEnvIf Host ^dev.m2.com MAGE_RUN_TYPE=store
SetEnvIf Host dev.m2b.com MAGE_RUN_CODE=store2
SetEnvIf Host dev.m2b.com MAGE_RUN_TYPE=store
SetEnvIf Host ^dev.m2b.com MAGE_RUN_CODE=store2
SetEnvIf Host ^dev.m2b.com MAGE_RUN_TYPE=store
SetEnvIf Host dev.m2c.com MAGE_RUN_CODE=store3
SetEnvIf Host dev.m2c.com MAGE_RUN_TYPE=store
SetEnvIf Host ^dev.m2c.com MAGE_RUN_CODE=store3
SetEnvIf Host ^dev.m2c.com MAGE_RUN_TYPE=store
index.php change
Store Switcher
worked fine from switching from store1 to store2, and from store1 to store3, and from store2 to store3. However, switching back from store2/3 to store1 required to use the Store Switcher twice to go back to store1.
Due to this, I had to reset the value for $_COOKIE['store']
at the index.php
:
<?php
/**
* Application entry point
*
* Example - run a particular store or website:
* --------------------------------------------
* require __DIR__ . '/app/bootstrap.php';
* $params = $_SERVER;
* $params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website2';
* $params[\Magento\Store\Model\StoreManager::PARAM_RUN_TYPE] = 'website';
* $bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $params);
* \/** @var \Magento\Framework\App\Http $app *\/
* $app = $bootstrap->createApplication('Magento\Framework\App\Http');
* $bootstrap->run($app);
* --------------------------------------------
*
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
try {
require __DIR__ . '/app/bootstrap.php';
} catch (\Exception $e) {
echo <<<HTML
<div style="font:12px/1.35em arial, helvetica, sans-serif;">
<div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;">
<h3 style="margin:0;font-size:1.7em;font-weight:normal;text-transform:none;text-align:left;color:#2f2f2f;">
Autoload error</h3>
</div>
<p>{$e->getMessage()}</p>
</div>
HTML;
exit(1);
}
// Fix store switcher bug on switching to the default store
if ( isset($_SERVER['MAGE_RUN_TYPE']) == 'store' && isset($_SERVER['MAGE_RUN_CODE']) ) {
if ( !empty($_SERVER['MAGE_RUN_CODE']) ) {
$_COOKIE['store'] = $_SERVER['MAGE_RUN_CODE'];
}
}
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
/** @var \Magento\Framework\App\Http $app */
$app = $bootstrap->createApplication('Magento\Framework\App\Http');
$bootstrap->run($app);
.htaccess change (2nd time)
On the browser's inspector, a lot of CORS
error was reported. To remove this, I added this code to .htaccess
:
# Always set these headers.
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Max-Age "1000"
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
# Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request.
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
Add to Cart on store2 and store3 do not work
Now at this point, the Store Switcher is working correctly. But, the Add to Cart
button is not working on store2 and store3.
I can add items on the store1 (the default store), and it would update the mini cart. But, if I switched to store2 or store3, the cart is empty. And when I try to add an item to the cart, I get one of the following scenarios:
1: The Add to Cart
button on store2 and store3 stays on "Adding....", and nothing added to the cart. No JavaScript errors.
2: The Add to Cart
button on store2 and store3 changes from "Adding..." to "Added", but the cart is not updated. No JavaScript errors.
Note, this happens for both logged-in and not-logged-in users.
Summary
How can I make the cart be shared among the 3 Stores for logged-in users?
Is it possible to make it work for not-logged-in users?
Having 3 different root categories for each store be part of the issue? Do I have to have a category shared among multiple Stores?
More info
I tried Add Store Code to Urls
to Yes, but it did not solve the problem.
The Add to Cart
AJAX call on the store2 resulted in "You have no items in your shopping cart." page, rendered from vendor/magento/module-checkout/view/frontend/templates/cart/noItems.phtml
It seems store2 cannot find items in the cart.