Meertalige website met een WordPress multisite constructie

Karel-Jan 8 december 2014

Er zijn verschillende oplossingen voor het meertalig maken van je WordPress website. De keuze is sterk afhankelijk van de grootte en complexiteit van je website. Onze voorkeur gaat in de meeste gevallen uit naar een multisite constructie, waarbij elke taal een site in de netwerk installatie is.

Het is vrij eenvoudig om een netwerk installatie te maken. Dit wordt duidelijk beschreven op de WordPress codex. Het enige wat hierbij mist is een taalkeuzemenu om te kunnen switchen tussen de verschillende talen. In deze blog een eenvoudige snippet voor het maken van een taalkeuzemenu binnen een multisite constructie.

Sinds WordPress 4.0 is de WPLANG constant komen te vervallen. De taal van je WordPress website kan je nu instellen onder het kopje Instellingen > Algemeen > Websitetaal. Deze optie kunnen we goed gebruiken voor het taalkeuzemenu. Met behulp van de get_blog_option functie kunnen we nu namelijk eenvoudig de taal van een WordPress site opvragen. Door door alle sites binnen het netwerk te loopen kunnen we alle talen binnen een multisite constructie opvragen. Daarmee kunnen we eenvoudig een taalkeuzemenu toevoegen.


function prefix_languages_dropdown() {

	// Current site
	$current_site   = get_blog_details();
	$active_blog_id = $current_site->blog_id;

	// Network sites
	$sites = wp_get_sites();

	// Languages
	$languages = array(
		'nl_NL' => array( 'title' => __( 'Dutch', 'domain' ), 'flag' => 'nl' ),
		'de_DE' => array( 'title' => __( 'German', 'domain' ), 'flag' => 'de' ),
		'en_US' => array( 'title' => __( 'English', 'domain' ), 'flag' => 'en' ),
		'bg_BG' => array( 'title' => __( 'Bulgarian', 'domain' ), 'flag' => 'bg' ),
	);

	$localized_sites = array();

	foreach ( $sites as $site ) {
		$locale = get_blog_option( $site['blog_id'], 'WPLANG' );

		if ( empty( $locale ) ) {
			$locale = 'en_US';
		}

		if ( isset( $languages[ $locale ] ) ) {
			$localized_sites[ $site['blog_id'] ] = array(
				'wplang' => $locale,
				'attr'   => $languages[ $locale ],
			);
		}
	}

	?>

	<div class="language-selector">
		<img src="<?php echo get_stylesheet_directory_uri(); ?>/images/lang/<?php echo $localized_sites[ $active_blog_id ]['attr']['flag'] ?>.png" alt="" />

		<ul class="dropdown">
			<?php foreach ( $localized_sites as $localized_site => $value ) : ?>

				<?php if ( $localized_site != $active_blog_id ) : ?>

					<li>
						<a href="<?php echo get_site_url( $localized_site ); ?>">
							<img src="<?php echo get_stylesheet_directory_uri(); ?>/images/lang/<?php echo $value['attr']['flag'] ?>.png" alt="" />
						</a>
					</li>

				<?php endif; ?>

			<?php endforeach; ?>
		</ul>
	</div>

	<?php
}

In dit voorbeeld maak ik gebruik van een extra array om de naam van de afbeelding en de titel van de taal te kunnen tonen. Je kan deze functie uiteraard verder geheel naar eigen wens aanpassen.

4 reacties

  1. Da’s ook een interessante optie. Zelf maak ik gebruik van de qTranslate+ plugin, waarmee je de verschillende vertalingen in een dashboard naast elkaar hebt (ipv verspreid over verschillende dashboards). Zou er ook een mogelijkheid zijn om het steeds switchen tussen sites te voorkomen met deze netwerkinstallatie-manier?

    • Dat gaat erg lastig worden. Bij een multisite installatie wordt de data in verschillende tabellen opgeslagen. Het direct opvragen van alle data in een multisite omgeving zou teveel resources vragen, wat zou resulteren in een trage WordPress omgeving. Je zult dus altijd moeten switchen tussen de verschillende sites.

Reacties zijn gesloten.

Altijd op de hoogte blijven?