Create a custom language switcher

This tutorial is part of our MultilingualPress 2 documentation. In case you are using the newer version 3, please switch to MultilingualPress 3.

We offer a widget and the “quick links” to show links to translations, but many users need a custom solution at other places or in a formatting we just don’t give them (yet).

There is a handy helper function to get all the links as an array: mlp_get_interlinked_permalinks(). It returns an array with the text (human readable language name), the permalink to the other site’s translation and an entry lang (the language code) – for each single translation.

You can use that to create your own language switcher. The following function creates a string that might look like this:

EN | DE | RU

Add it to your theme’s functions.php.

 * Create a navigation between translations
 * @param  string $between  Separator between items
 * @param  string $before   HTML before items
 * @param  string $after    HTML after items
 * @return string
function mlp_navigation(
    $between = ' | ',
    $before  = '<p class="mlp-lang-nav">',
    $after   = '</p>'
    $links = (array) mlp_get_interlinked_permalinks();

    if ( empty ( $links ) )
        return '';

    $items = array ();

    foreach ( $links as $link ) {
        if ( isset ( $link['text'] ) ) {
            $text = $link['text'];
        else {
            // take just the main code
            $first = strtok( $link['lang'], '_' );
            $text  = mb_strtoupper( $first );

        $items[] = sprintf(
            '<a href="%1$s" hreflang="%2$s" rel="alternate">%3$s</a>',
            esc_url( $link['permalink'] ),
            esc_attr( $link['lang'] ),

    return $before . join( $between, $items ) . $after;

Now you can call the function wherever you need it without any arguments:

echo mlp_navigation();

Don’t forget the closing semicolon!

If you want to get a list, you can change the parameters:

echo mlp_navigation(
    '</li><li>', // between items
    '<ul class="mlp-lang-nav"><li>', // before
    '</li></ul>' // after

We will add support for custom menus in one of the next versions of Multilingual Press, so you can create your own menus with drag and drop.

Build the perfect multilingual webshop with WooCommerce and our plugins MultilingualPress and CentralStock!