Вопрос или проблема
Я уже несколько часов борюсь с этой проблемой, буду признателен за любую помощь. Я использую тему Underscores с одной боковой панелью (sidebar-1, слева) и плагином Custom Sidebars, чтобы иметь разное боковое содержимое на каждой странице. Проблема заключается в том, что когда я добавляю новую боковую панель (sidebar-2), она должна отображаться прямо над нижним колонтитулом и содержать одно и то же содержимое на всех страницах.
functions.php:
function myunderscores3_widgets_init() {
register_sidebar( array(
'name' => esc_html__( 'Боковая панель', 'myunderscores3' ),
'id' => 'sidebar-1',
'description' => esc_html__( 'Добавьте виджеты сюда.', 'myunderscores3' ),
'before_widget' => '<section id="%1$s" class="widget %2$s">',
'after_widget' => '</section>',
'before_title' => '<h2 class="widget-title">',
'after_title' => '</h2>',
//'before_title' => '<!--',
//'after_title' => '-->',
) );
register_sidebar( array(
'name' => esc_html__( 'Нижняя боковая панель', 'myunderscores3' ),
'id' => 'sidebar-2',
'description' => esc_html__( 'Добавьте виджеты сюда.', 'myunderscores3' ),
'before_widget' => '<section id="%1$s" class="widget %2$s">',
'after_widget' => '</section>',
'before_title' => '<h2 class="widget-title">',
'after_title' => '</h2>',
//'before_title' => '<!--',
//'after_title' => '-->',
) );
}
add_action( 'widgets_init', 'myunderscores3_widgets_init' );
sidebar.php (для содержимого sidebar-1):
if ( ! is_active_sidebar( 'sidebar-1' ) ) {
return;
}
?>
<aside id="secondary" class="widget-area">
<?php dynamic_sidebar( 'sidebar-1' ); ?>
</aside><!-- #secondary -->
page.php (для подключения sidebar-1):
<?php
get_sidebar();
?>
</div><!-- wrapper -->
footer.php (для подключения sidebar-2):
if (is_active_sidebar( 'sidebar-2' )) {
dynamic_sidebar( 'sidebar-2' );
}
?>
</div><!-- #content -->
После добавления виджетов в sidebar-2 все работает нормально на каждой странице, кроме одной, на которой нет содержимого sidebar-1. На этой странице содержимое sidebar-2 появляется дважды – внизу, как и ожидалось, и также в области содержимого sidebar-1! Более того, класс ‘no-sidebar’ отсутствует в теле. В админке виджеты sidebar-1 расположены по каждой отдельной странице, тогда как содержимое sidebar-2 находится через виджет (‘Как боковая панель для выбранных типов записей’ – Страницы). На фактической странице, где содержимое sidebar-2 появляется дважды, я не указывал никаких боковых панелей в самой странице, так как это делаю через настройки виджетов. Есть идеи? Спасибо
Шаблонные файлы включены, а не вызываются как функция. Хотя вы и вызвали get_sidebar()
, за кулисами это в конечном итоге вызывает include
. Другими словами, ваши шаблонные страницы (например, footer.php, page.php и sidebar.php) не находятся непосредственно внутри функции, поэтому вы не можете ‘возвращать’ из них, как вы пытаетесь сделать в sidebar.php.
Таким образом, WordPress проходит мимо этого момента и затем выполняет dynamic_sidebar( 'sidebar-1' );
. Теперь здесь кто-то другой должен будет вмешаться и сказать вам, почему загружаются неправильные виджеты. Я не думал, что он будет использовать активную боковую панель, но, судя по вашему коду, похоже, что да. WordPress определенно делает это с меню, если вы не скажете ему иначе.
Но в любом случае, я думаю, если вы просто измените ваш код, вы избежите этого поведения совершенно:
if ( is_active_sidebar( 'sidebar-1' ) ) :
?>
<aside id="secondary" class="widget-area">
<?php dynamic_sidebar( 'sidebar-1' ); ?>
</aside><!-- #secondary -->
<?php endif; ?>
Таким образом, все, что я сделал, это изменил проверку (убрав !) и затем обернул всю секцию dynamic_sidebar с ней (используя альтернативный PHP формат с : и endif;)
Не имею понятия, в чем была проблема, но после удаления всего моего кода и создания новой боковой панели все заработало. Возможно, опечатка где-то или проблема кэширования?
Ответ или решение
Проблема с добавлением второго сайдбара (sidebar-2) в тему Underscores, судя по вашему описанию, может быть связана с тем, что код для проверки активности сайдбара был реализован неправильно. Как вы указали, в вашем случае контент sidebar-2 отображается дважды, а класс ‘no-sidebar’ отсутствует у тега body. Это может произойти, если WordPress не правильно обрабатывает логику проверки наличия сайдбара.
Давайте рассмотрим изменения, которые помогут вам решить эту проблему.
- Использование правильной проверки для сайдбара: Вам нужно убедиться, что контент sidebar-1 отображается только если он активен. Измените ваш код в
sidebar.php
, чтобы он выглядел следующим образом:
<?php if ( is_active_sidebar( 'sidebar-1' ) ) : ?>
<aside id="secondary" class="widget-area">
<?php dynamic_sidebar( 'sidebar-1' ); ?>
</aside><!-- #secondary -->
<?php endif; ?>
Так вы предотвратите вывод контента sidebar-1, если он неактивен.
-
Убедитесь в отсутствии конфликта с кэшированием: Иногда, если на сайте включено кэширование, изменения могут не отображаться сразу. Попробуйте очистить кэш вашего сайта (если вы используете какой-либо плагин кэширования), а также кэш браузера.
-
Проверьте настройки виджетов: В панели управления WordPress зайдите в раздел «Виджеты» и посмотрите, какие виджеты находятся в sidebar-1 и sidebar-2. Убедитесь, что в sidebar-1 не добавлены те же виджеты, которые вы хотите видеть в sidebar-2.
-
Проверка в коде: Убедитесь также, что нигде в вашем шаблоне (например, в
footer.php
или в других файлах) не происходит вызовdynamic_sidebar( ‘sidebar-1’ );
вне его основного контейнера. Это может привести к нежелательному поведению. -
Проверка структуры HTML: Убедитесь, что даже если sidebar-1 не активен, остальная часть разметки страницы корректно формируется и не нарушается из-за отсутствия этого сайдбара. Иногда ошибки могут быть связаны со структурой HTML.
Следуя этим рекомендациям, вы сможете устранить проблему вывода контента sidebar-2 дважды. Если проблема все еще сохраняется, попробуйте временно отключить все плагины, чтобы выяснить, нет ли конфликта между ними.
Удачи в решении вашей проблемы! Если возникнут дополнительные вопросы, не стесняйтесь задавать их.