Magento Multi-store

uk This post is also available in English.

Redelijk vaak krijgen wij van klanten de vraag of zij ook meerdere webshops in een enkele Magento installatie kunnen draaien. Uiteraard is dat geen probleem in Magento, maar de exacte implementatie verschilt nogal van klant tot klant, van webshop tot webshop. Ook is het voor veel mensen niet exact duidelijk wat ze moeten doen om de extra domeinen werkend te krijgen in Magento. Daarom hier een kleine uitleg over hoe je meerdere Magento shops in een installatie krijgt bij Byte.

Extra domeinnamen

Uiteraard heeft u voor uw extra winkels een eigen domeinnaam nodig. Als voorbeeld hebben wij een winkel in exotische pakdieren. Deze willen we online gaan verkopen en dus hebben wij het domein www.kamelen-online.nl geregistreerd met een Magento 1000 pakket. Dit pakket biedt wat extra ruimte op de schijf, wat we bij een setup met meerdere winkels, en dus extra producten, goed kunnen gebruiken. Omdat we internationaal willen gaan met onze webwinkel, hebben we een tweede domein geregistreerd, genaamd www.camels-online.com. Voor dit pakket nemen we een Presence. Ook gaan we dromedarissen aanbieden, en dus registeren we ook www.dromedaris-online.nl, met een Presence pakket.
Als deze domeinen allemaal geregistreerd zijn, kan je daarna de Presence pakketten in stellen. De beste oplossing is om deze op het service paneel, met de optie "Server Alias" allemaal te koppelen aan de domeinnaam met het hosting pakket (In dit geval is dat kamelen-online.nl).

Websites, stores, views...

Stores en Websites

Even snel wat termen tussendoor. In Magento spreekt men over Websites, Stores, en Store Views.

  • Het verschil tussen een Website en een Store, is dat een Website eigenlijk alleen klant data bevat, maar geen producten en categorieën.
  • Stores zijn de echte winkels. Deze bevatten de verschillende producten die in de shop beschikbaar zijn. Stores hebben een of meerdere Store views.
  • Store views zijn de verschillende manieren waarop de Stores zichtbaar worden gemaakt. Vaak zijn er b.v. per taal een Store view aangemaakt.

Elke Magento site heeft dus altijd minstens een Website, een Store, en een Store View.

Deze zijn allemaal aan te maken via de Admin interface van Magento, onder System, Manage Stores. In ons voorbeeld hebben we dit als volgt opgelost: Een website "Kamelen Site", met een enkele shop genaamd "Kamelen Shop". Deze shop hebben we vervolgens twee views gegeven, een in het Nederlands, en een in het Engels. Daarnaast hebben we een website "Dromedaris Site" aangemaakt, met een enkele shop en een enkele view. Bij het aanmaken van de Store Views wordt ook gevraagd om een code waar de view intern mee werkt. Deze hebben we ingesteld op "kamelen_nl", "kamelen_en" en "dromedaris". Deze zijn belangrijk omdat we deze codes later aan de domeinnamen moeten koppelen.

Magento Multistore Settings

Magento Multistore Settings

Domeinnamen en Store Views koppelen

Een van de eerste dingen die Magento doet zodra het opstart, is namelijk de shop starten. Standaard start dan de default shop, maar dit is uiteraard in te stellen, b.v. aan de hand van de website die bezocht wordt. Het enige wat we hoeven te doen, is kijken welke shop er bezocht wordt en Magento opstarten met de code van de benodigde store front.
Het koppelen van domeinnamen en store views kan helaas nog niet via de Magento backend.

Gelukkig is het erg makkelijk. Er hoeft slechts 1 bestand aangepast te worden. Welke dat is, is afhankelijk van welke Magento versie er draait.

Koppelen in Magento 1.3

In Magento 1.3 is de koppeling te realiseren via het index.php bestand. Hierin worden alle Magento bestanden geladen, en vervolgens wordt de website gestart. We moeten daarvoor index.php aanpassen. Zoek onderstaande regel in PHP:

Mage::run();

Vervang deze regel met onderstaande stuk code:

switch ($_SERVER['HTTP_HOST']) {
	//Klant komt voor Nederlandse Kamelen.
	case 'www.kamelen-online.nl':
	case 'kamelen-online.nl':
		Mage::run('kamelen_nl', 'store');
	break;

	//Klant komt voor Internationale Kamelen.
	case 'www.camels-online.com':
	case 'camels-online.com':
		Mage::run('kamelen_en', 'store');
	break;

	//Klant komt voor de Dromedaris.
	case 'www.dromedaris-online.nl':
	case 'dromedaris-online.nl':
		Mage::run('dromedaris', 'store');
	break;

	default:
		Mage::run();
	break;
}

Koppelen in Magento 1.4

Sinds Magento 1.4 is besloten om het detecteren van de juiste store front uit de standaard bestanden van Magento te halen. Dit voorkomt problemen bij het upgraden van webshops, waarbij ineens alle store views op dezelfde website uitkomen, of dat Magento helemaal niet meer werkt na een upgrade.

Extra aanpassing voor Byte Hosting

Hoewel de manier die Magento gebruikt om de store view te kiezen mooi in elkaar zit, werkt het helaas niet 100% samen met de extra beveiligde omgeving waarin uw website draait bij Byte. Byte maakt gebruik van het "suExec" principe voor website hosting. Dit zorgt ervoor dat niemand bij uw bestanden/website kan op de server. Zo ruimt het onder andere het omgeving-geheugen op voordat uw website geladen wordt. Helaas maakt Magento van dit geheugen gebruik om daarin op te slaan welke store er in beeld moet komen.
Om toch gebruik te maken van de gegevens die in het omgeving geheugen worden geladen, is een kleine aanpassing aan het bestand index.php nodig. Rond regel 75 staat de volgende regel:

$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : '';

Vervang dit door het volgende:

$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] :
(isset($_SERVER['REDIRECT_MAGE_RUN_CODE']) ? $_SERVER['REDIRECT_MAGE_RUN_CODE'] : '');

Na het aanpassen van deze code zal Magento voortaan ook in de opgeruimde waardes kijken welke store er gestart moet worden.

In Magento 1.4 staat alle logica om de juiste shop te kiezen in het .htaccess bestand. Hierin wordt in het omgeving geheugen opgeslagen welke store er gestart moet worden. Het index.php bestand kijkt vervolgens in dit geheugen en start de juiste winkel.

In het .htaccess voegen we hiervoor het volgende toe:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^(.*)kamelen-online.nl
RewriteRule ^ - [E=MAGE_RUN_CODE:kamelen_nl]

RewriteCond %{HTTP_HOST} ^(.*)camels-online.com
RewriteRule ^ - [E=MAGE_RUN_CODE:camels_en]

RewriteCond %{HTTP_HOST} ^(.*)dromedaris-online.nl
RewriteRule ^ - [E=MAGE_RUN_CODE:dromedaris]

Ook hier zijn weer drie verschillende stores opgegeven. Alle domeinen die eindigen op 'kamelen-online.nl' komen op de "kamelen_nl" store uit, camels-online.com komt uit op de engelse, en ook de dromedaris store staat nog geconfigureerd.

Verschillende shops configureren

Magento Config Scope

Magento Config Scope

Het enige wat nu nog gedaan moet worden is alles goed instellen voor de verschillende stores in Magento. Standaard zijn bij stores de instellingen namelijk automatisch hetzelfde als bij de website en de instellingen van de websites zijn weer gelinked aan de globale instellingen. Uiteraard zijn de instellingen op elk niveau aan te passen. Wisselen tussen de verschillende niveau's kan simpelweg door de juiste view, shop, of de standaard instelling te kiezen via het pull down menu links boven het menu in Magento's configuratie editor.

Het belangrijkste om aan te passen is natuurlijk de base URL, welke te vinden is in de backend van Magento terug onder System\Configuration\Web\Unsecure en \Secure. Hier vullen we op de verschillende niveaus in welke URL's Magento als standaard URL moet gebruiken. Zo vullen we in dit voorbeeld als hoofddomein onder "Default Config" in dat de shop "http://www.kamelen-online.nl/" heet. De English versie onder "Kamelen Store" krijgt als base URL "http://www.camels-online.com/", en de Dromedarissen versie komt natuurlijk op "http://www.dromedaris-online.nl/".
Mochten deze shops nou ook een HTTPS/Secure versie hebben, dan moet deze uiteraard onder "Secure" ook nog even worden ingevuld, maar dan met https linkjes.

Magento baseURL settings

Magento baseURL settings

Uiteraard is het aanmaken van de verschillende stores slechts het begin. Er zijn nu nog heel veel opties in het Magento Admin Panel om per shop in te stellen, maar laten we het, for now, hier maar even bij laten. Graag horen we nog van klanten die nog mooie of handige tips en trucks hebben met Magento Multi Shops. Wie weet, als er echt een mooie tussen zit, kan er nog wel eens een taart uitgaan ;-)

  • Cipriano Groenendal

    We hebben de blogpost aangepast en uitgebreid. Hopelijk behoren, dankzij de extra uitleg over base URL’s, de problemen die sommige bezoekers hadden met 404 errors nu tot het verleden.

  • Dennis

    Maar vraag 2 is dan (en volgens google een hele belangrijke en nog te vaak onbeantwoorde…)

    Hoe deel je dan je shopping cart tussen 2 of meer verschillende stores?

    Om even technisch te doen: Hoe zorg je ervoor dat er bij het bezoeken van beide stores maar 1 sessie wordt aangemaakt :)

  • http://johanroel.nl JohanRoel

    Ik heb alle stappen gevolgd welke je hebt aangegeven. Ik krijg alleen een foutmelding op het tweede domein n.l. app/mage.php was not found. Klopt mijn map structuur niet en moet ik de index.php aanpassen met de juiste structuur of is het noodzakelijk om symbolic links te maken?

  • Cipriano Groenendal

    Hoi Johan,

    Wat er precies niet klopt is moeilijk te zeggen in dit geval. Wat we bij Byte altijd doen voor onze klanten is de “Tweede domeinnaam” als Server Alias in Apache toevoegen aan het hoofd domein. Dit zorgt ervoor dat beide domeinen vanuit dezelfde map draaien. Als je het echt met twee losse mappen doet dan kan het inderdaad dat je wat extra symlinks hiertussen moet plaatsen. Het makkelijkste is dan, indien dat kan, om de “DocumentRoot” te symlinken zodat, wederom, beide sites vanuit dezelfde map gehost worden.

  • Mike

    Hoi,

    Ik maak gebruik van subfolders voor development dus example.com/webnl example.com/webde etc..
    Hoe is dit het makkelijkst te installeren in mijn omgeving ( 1.5.1 )

    Mike

  • Paul

    Met het bovenstaande kwam ik al een heel stuk verder, maar toch loop ik nu weer tegen een probleem aan. Zo kan ik tijdens de checkout geen verzendmethode kiezen. De klant kan dus ook niet verder. Ergens loopt Magento dus nog vast op de multishop!

  • Thorwald

    Ik heb bovenstaande doorgevoerd in een 1.4 shop en het werkt fantastisch. Door deze wijziging heb ik ook de webshop naam uit de url verwijdered. Waar ik nu alleen tegenaan loop, is dat de reeds geindexeerde URL’s niet meer werken. Hiervoor moet een 301 redirect ingevoerd worden. Ik kom hier alleen niet aan uit. Heeft iemand daar ervaring mee met bovenstaande htaccess regels?