Last active
February 19, 2023 06:12
-
-
Save zeshanshani/fade1ba03e7d35a2542ef1eabe92becf to your computer and use it in GitHub Desktop.
Custom Language Switcher for Polylang. Contains both the PHP function and SCSS styling. HTML markup is using BEM methodology. SCSS file is using my variables and mixins from here: https://gist.github.com/zeshanshani/c4d5ae43e6a9f661d012
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Component: Languages */ | |
.languages__item { | |
text-transform: uppercase; | |
color: #899099; | |
font-size: 13px; | |
font-size: 1.3rem; | |
line-height: 1.15; | |
} | |
.languages__item--current { | |
color: #212121; | |
} | |
.languages__item:before { | |
content: ' / '; | |
color: #899099; | |
} | |
.languages__item:first-child:before { | |
content: ''; | |
} | |
.languages a.languages__item:hover { | |
color: #212121; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php // Don't copy this line in functions.php file if it's already added. | |
/** | |
* Show Polylang Languages with Custom Markup | |
* @param string $class Add custom class to the languages container | |
* @return string | |
*/ | |
function rarus_polylang_languages( $class = '' ) { | |
if ( ! function_exists( 'pll_the_languages' ) ) return; | |
// Gets the pll_the_languages() raw code | |
$languages = pll_the_languages( array( | |
'display_names_as' => 'slug', | |
'hide_if_no_translation' => 1, | |
'raw' => true | |
) ); | |
$output = ''; | |
// Checks if the $languages is not empty | |
if ( ! empty( $languages ) ) { | |
// Creates the $output variable with languages container | |
$output = '<div class="languages' . ( $class ? ' ' . $class : '' ) . '">'; | |
// Runs the loop through all languages | |
foreach ( $languages as $language ) { | |
// Variables containing language data | |
$id = $language['id']; | |
$slug = $language['slug']; | |
$url = $language['url']; | |
$current = $language['current_lang'] ? ' languages__item--current' : ''; | |
$no_translation = $language['no_translation']; | |
// Checks if the page has translation in this language | |
if ( ! $no_translation ) { | |
// Check if it's current language | |
if ( $current ) { | |
// Output the language in a <span> tag so it's not clickable | |
$output .= "<span class=\"languages__item$current\">$slug</span>"; | |
} else { | |
// Output the language in an anchor tag | |
$output .= "<a href=\"$url\" class=\"languages__item$current\">$slug</a>"; | |
} | |
} | |
} | |
$output .= '</div>'; | |
} | |
return $output; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Component: Languages */ | |
.languages { | |
// El: Item | |
&__item { | |
text-transform: uppercase; | |
color: #899099; | |
font-size: 13px; | |
line-height: 1.15; | |
// Mod: Current | |
&--current { | |
color: #212121; | |
} | |
// Divider | |
&:before { | |
content: ' / '; | |
color: #899099; | |
} | |
// Remove divider from first item | |
&:first-child:before { | |
content: ''; | |
} | |
} | |
// Hover Styling for links | |
a.languages__item:hover { | |
color: #212121; | |
} | |
} |
Thanks for this code snippets! Just having trouble to get the name? any idea why the following is not working?
$name = $language['name'];
EDIT: figured it out! forgot to change the slug to name in the following line:
'display_names_as' => 'slug',
to 'display_names_as' => 'name',
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@zeshanshani thank you!