Делали мы тут одному из коллег сайт на двух языках. Использовали тему Studiopresss Atmosphere Pro. И пришлось научиться бороть логику отображения виджетов на главной странице. Рассказываю, как.
Речь идет о сайте флейтиста Николая Попова. Сайт двуязычный, используем WPML.
Кстати сказать, раньше, например на сайте Духового квинтета Большого театра, для того, чтобы при одном и том же дизайне показывались одинаковые виджеты, но на разных языках, мы использовали плагин Widget logic. Он прекрасно делал свою работу, только не очень удобно: для выбора языка нужно было в специальное поле вводить код
1 |
ICL_LANGUAGE_CODE == 'ru' |
А тут оказалось, что появился новый плагин, WPML Widgets, который делает все то же самое, только язык отображения виджета выбирается в выпадающем меню. Мелочь, но жизнь облегчает сильно, поскольку обычно таких виджетов много и копипастить код туда-сюда устаешь. Но речь не об этом — это просто небольшой лайфхак.
Так вот, в теме Atmosphere Pro во второй зоне главной страницы можно использовать несколько виджетов, а их расположение определяет тема в зависимости от количества этих самых виджетов.
На этом сайте мы эти виджеты используем для отображения трех последних событий в афише. Итого в зоне получается четыре виджета: заголовок и три события. Соответственно, для двух языков нужно восемь виджетов. И тут обнаружилась засада: на главной странице тема располагает виджеты в зависимости от того, сколько их размещено в зоне. Мы используем логику отображения виджетов, в соответствии с которой одномоментно должны демонстрироваться только виджеты на определенном языке, но тема этот факт в расчет не берет.
Это значит, что если у нас 2 языка и 4 виджета для одного языка (то есть для двух языков — 8 виджетов), то тема выбирает расположение таким образом, чтобы поместилось 8 виджетов. Итого: логика виджетов работает, но выглядит это всё, естественно, по-уродски.
У плагина WPML Widgets настроек никаких нет, у Widget logic, вроде бы, можно выбрать, когда загружается эта самая логика, но на деле нам это не помогло. Пришлось лезть в код, конкретнее — в functions.php. Там мы нашли код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//* Flexible widget classes function atmosphere_widget_area_class( $id ) { $count = atmosphere_count_widgets( $id ); $class = ''; if ( $count == 1 ) { $class .= ' widget-full'; } elseif ( $count % 3 == 1 ) { $class .= ' widget-thirds'; } elseif ( $count % 4 == 1 ) { $class .= ' widget-fourths'; } elseif ( $count % 2 == 0 ) { $class .= ' widget-halves uneven'; } else { $class .= ' widget-halves'; } return $class; } |
Напоминаю, что в нашем случае требовалось 4 виджета: один для заголовка и три — для последних событий. В вашем случае могут быть другие требования, но, посмотрев на то, как мы изменили код, вы легко поймете, что нужно делать именно в вашем случае. В Atmosphere Pro это точно работает. Пока не проверял, будет ли работать в других темах от StudioPress, где используется расположение в зависимости от количества виджетов, но наверняка там можно применить похожий подход.
Для наших нужд код я изменил таким образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//* Flexible widget classes function atmosphere_widget_area_class( $id ) { $count = atmosphere_count_widgets( $id ); if ($count % 4 == 0) { $count = $count / 4; } $class = ''; if ( $count == 1 ) { $class .= ' widget-full'; } elseif ( $count % 3 == 2 ) { $class .= ' widget-thirds'; } elseif ( $count % 4 == 2 ) { $class .= ' widget-fourths'; } elseif ( $count % 2 == 0 ) { $class .= ' widget-halves uneven'; } else { $class .= ' widget-halves'; } return $class; } |
На всякий случай напоминаю, что для внесения изменений такого рода рекомендуется использовать FTP, а не встроенный редактор WordPress, или как минимум иметь мгновенный доступ к сайту по FTP. Иначе любая опечатка или лишняя запятая могут привести к «белому экрану», при котором доступа к админке сайта не будет. Если это произойдет, нужно использовать FTP для того, чтобы вернуть файл functions.php к исходному состоянию.
А вообще правильно будет сначала скопировать на локальный компьютер исходный файл, а потом уже проводить с ним изменения на сервере.