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'] ),
            $text
        );
    }

    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.