Добавление фильтра в qTranslate для изменения отображения выбора языка
У меня возникла проблема с qTranslate, но решение скорее связано с пониманием работы хуков и фильтров в WordPress.
Вместо использования виджета qTranslate я использую хук:
<?php echo qtrans_generateLanguageSelectCode('text');?>
для вызова переключателя языков в шапке сайта и затем изменяю его внешний вид через CSS. Это не проблема. Однако я хочу добавить "стиль" в функцию Language Select Code, чтобы вместо полного названия языка ("Francais" и "English" в моем случае) отображался только код языка (EN
и FR
). Я нашел решение, изменив (и я понимаю, что это плохая практика) файл qtranslate_widget.php
, добавив новый case в функцию qtrans_generateLanguageSelectCode($style='', $id='')
.
Это работало отлично, но после обновления WordPress и qTranslate мои изменения пропали. Вместо повторного внесения изменений в файл плагина, я хотел бы узнать, как добавить фильтр к этой функции в файле functions.php моей темы. Я предполагаю, что это должно выглядеть примерно так:
add_filter('qtrans_generateLanguageSelectCode', 'qtrans_myLanguageSelectcode',
но дальше я теряюсь, так как недостаточно разбираюсь в фильтрах. Надеюсь, объяснение достаточно понятное!
После обновления я потерял свои изменения, но думаю, что нижеприведенный код должен работать (я еще не тестировал его!):
case 'code':
foreach(qtrans_getSortedLanguages() as $language) {
$classes = array('lang-'.$language);
if($language == $q_config['language'])
$classes[] = 'active';
echo '<a href="'.qtrans_convertURL($url, $language).'" class="'. implode(' ', $classes) .'"';
// устанавливаем hreflang
echo 'hreflang="'.$language.'" title="'.$q_config['language_name'][$language].'"';
echo '>''.$language.'</a>';
}
break;
Чтобы не делать пост слишком длинным, вот оригинальная функция из плагина qTranslate:
// Код выбора языка для тех, кто не использует виджеты
function qtrans_generateLanguageSelectCode($style='', $id='') {
global $q_config;
if($style=='') $style='text';
if(is_bool($style)&&$style) $style='image';
if(is_404()) $url = get_option('home'); else $url = '';
if($id=='') $id = 'qtranslate';
$id .= '-chooser';
switch($style) {
case 'image':
case 'text':
case 'dropdown':
echo '<ul class="qtrans_language_chooser" id="'.$id.'">';
foreach(qtrans_getSortedLanguages() as $language) {
$classes = array('lang-'.$language);
if($language == $q_config['language'])
$classes[] = 'active';
echo '<li class="'. implode(' ', $classes) .'"><a href="'.qtrans_convertURL($url, $language).'"';
// устанавливаем hreflang
echo ' hreflang="'.$language.'" title="'.$q_config['language_name'][$language].'"';
if($style=='image')
echo ' class="qtrans_flag qtrans_flag_'.$language.'"';
echo '><span';
if($style=='image')
echo ' style="display:none"';
echo '>'.$q_config['language_name'][$language].'</span></a></li>';
}
echo "</ul><div class=\"qtrans_widget_end\"></div>";
if($style=='dropdown') {
echo "<script type=\"text/javascript\">\n// <![CDATA[\r\n";
echo "var lc = document.getElementById('".$id."');\n";
echo "var s = document.createElement('select');\n";
echo "s.id = 'qtrans_select_".$id."';\n";
echo "lc.parentNode.insertBefore(s,lc);";
// создаем выпадающие элементы для каждого языка
foreach(qtrans_getSortedLanguages() as $language) {
echo qtrans_insertDropDownElement($language, qtrans_convertURL($url, $language), $id);
}
// скрываем текстовый переключатель языков
echo "s.onchange = function() { document.location.href = this.value;}\n";
echo "lc.style.display='none';\n";
echo "// ]]>\n</script>\n";
}
break;
case 'both':
echo '<ul class="qtrans_language_chooser" id="'.$id.'">';
foreach(qtrans_getSortedLanguages() as $language) {
echo '<li';
if($language == $q_config['language'])
echo ' class="active"';
echo '><a href="'.qtrans_convertURL($url, $language).'"';
echo ' class="qtrans_flag_'.$language.' qtrans_flag_and_text" title="'.$q_config['language_name'][$language].'"';
echo '><span>'.$q_config['language_name'][$language].'</span></a></li>';
}
echo "</ul><div class=\"qtrans_widget_end\"></div>";
break;
}
}

В моем файле header.php
, где я хочу разместить переключатель языков qTranslate, я добавил это:
<?php echo qtrans_SelectCode('code');?>
Затем я добавил этот код в functions.php
. Он немного избыточен, так как повторяет встроенные варианты qTranslate (изображение, текст, выпадающий список), которые я не использую на своей странице — но я хотел сохранить код, поскольку мой фильтр переопределяет функцию qtrans_generateLanguageSelectCode
. (Если кто-то сможет придумать, как просто ДОБАВИТЬ стиль, не переопределяя всю функцию, это было бы здорово!)
Стиль, который я использую, называется 'code' (вы увидите его ближе к концу) и просто выводит код языка — например, FR
и EN
в моем случае. Вы можете создать любой вывод, который захотите, добавив новый стиль:
if( function_exists( 'qtrans_getLanguage' ) )
{
// Фильтр кода выбора языка qTranslate
add_filter( 'qtrans_generateLanguageSelectCode', 'qtrans_SelectCode' );
function qtrans_SelectCode( $style = '', $id = '' ) {
global $q_config;
if( $style == '' )
$style = 'text';
if( is_bool( $style ) && $style )
$style = 'image';
if( is_404() )
$url = get_option( 'home' );
else
$url = '';
if( $id == '' )
$id = 'qtranslate';
$id .= '-chooser';
switch( $style ) {
case 'image':
case 'text':
case 'dropdown':
echo '<ul class="qtrans_language_chooser" id="' . $id . '">';
foreach( qtrans_getSortedLanguages() as $language ) {
$classes = array( 'lang-' . $language );
if( $language == $q_config['language'] )
$classes[] = 'active';
echo '<li class="' . implode( ' ', $classes ) . '"><a href="' . qtrans_convertURL( $url, $language ) . '"';
// установка hreflang
echo ' hreflang="' . $language . '" title="' . $q_config['language_name'][$language] . '"';
if( $style == 'image' )
echo ' class="qtrans_flag qtrans_flag_' . $language . '"';
echo '><span';
if( $style == 'image' )
echo ' style="display:none"';
echo '>' . $q_config['language_name'][$language] . '</span></a></li>';
}
echo "</ul><div class=\"qtrans_widget_end\"></div>";
if( $style == 'dropdown' ) {
echo "<script type=\"text/javascript\">\n// <![CDATA[\r\n";
echo "var lc = document.getElementById('" . $id . "');\n";
echo "var s = document.createElement('select');\n";
echo "s.id = 'qtrans_select_" . $id . "';\n";
echo "lc.parentNode.insertBefore(s,lc);";
// создание элементов выпадающего списка для каждого языка
foreach( qtrans_getSortedLanguages() as $language ) {
echo qtrans_insertDropDownElement( $language, qtrans_convertURL( $url, $language ), $id );
}
// скрытие текстового переключателя языков
echo "s.onchange = function() { document.location.href = this.value;}\n";
echo "lc.style.display='none';\n";
echo "// ]]>\n</script>\n";
}
break;
case 'both':
echo '<ul class="qtrans_language_chooser" id="' . $id . '">';
foreach( qtrans_getSortedLanguages() as $language ) {
echo '<li';
if( $language == $q_config['language'] )
echo ' class="active"';
echo '><a href="' . qtrans_convertURL( $url, $language ) . '"';
echo ' class="qtrans_flag_' . $language . ' qtrans_flag_and_text" title="' . $q_config['language_name'][$language] . '"';
echo '><span>' . $q_config['language_name'][$language] . '</span></a></li>';
}
echo "</ul><div class=\"qtrans_widget_end\"></div>";
break;
case 'code':
$count = 0;
foreach( qtrans_getSortedLanguages() as $language ) {
if( $count > 0 )
print ' ';
$count++;
if( $language == $q_config['language'] ) {
print '<span class="qtrans_language_chooser active" title="' . $q_config['language_name'][$language] . '">';
print $language;
print '</span>';
}
else {
print '<a href="' . qtrans_convertURL( $url, $language ) . '" class="qtrans_language_chooser"';
print ' hreflang="' . $language . '" title="' . $q_config['language_name'][$language] . '">';
print $language;
print '</a>';
}
}
break;
}
}
}
Важно обернуть функции в:
if(function_exists('qtrans_getLanguage'))
на случай, если плагин qTranslate сломается или вы его деактивируете, иначе ваш functions.php
не будет работать корректно, и вы не сможете получить доступ к своему сайту!
Извините, что немного задержался с ответом, я не профессиональный веб-разработчик, поэтому не касался этого несколько месяцев. Я полностью самоучка, поэтому моя терминология может быть немного неясной. Но надеюсь, это поможет!
