Отображение виджетов определенного динамического сайдбара на конкретной странице
Мне передали сайт на WordPress в процессе разработки. Прошел как минимум год с тех пор, как я в последний раз использовал WordPress, и я замечаю много изменений. Раньше я привык отображать разное содержимое на разных страницах, создавая шаблоны страниц для каждой страницы, требующей уникального контента.
Я пытаюсь отобразить другой сайдбар на одной конкретной странице, отличный от остального сайта. Год назад я бы создал шаблон страницы и новый файл сайдбара, а затем включил бы файл сайдбара в шаблон страницы. Я обнаружил, что это не работает. Основные проблемные файлы, которые я вижу - это loop.php
и loop-page.php
, которых не было в упрощенной теме, которую я обычно использовал при создании сайта раньше. Однако, похоже, что тот, кто работал над этим до меня, скопировал тему 'twenty ten' и внес в нее изменения под новым именем.
Я зарегистрировал новый динамический сайдбар в файле functions.php
темы, и я вижу его в разделе Виджеты в Панели управления и могу добавлять в него виджеты.
Но я никак не могу заставить его отображаться на нужной странице. Я пробовал следующее:
1.) Создал для страницы пользовательский шаблон template_news.php
и разместил следующий код там, где должен вызываться сайдбар:
include ('sidebar-news.php');
Файл sidebar-news.php
содержит код, скопированный из sidebar.php
с ID сайдбара "News", который я указал в functions.php
:
<?php if ( is_active_sidebar( 'sidebar-news' ) ) : ?>
<div id="secondary" class="widget-area" role="complementary">
<ul class="xoxo">
<?php dynamic_sidebar( 'sidebar-news' ); ?>
</ul>
</div>
<?php endif; ?>
Шаблон страницы применен к правильной странице.
2.) Изменил в page.php
:
<?php get_sidebar(); ?>
на:
<?php
if(is_page('18')) {
include ('sidebar-news.php');
}
else {
get_sidebar();
} ?>
Я также несколько раз проверил правильность ID страницы и пробовал использовать вместо него слаг, но безрезультатно.
3.) Попробовал предыдущий вариант в loop-page.php
4.) Разместил следующее условное выражение в sidebar.php
:
<?php
if ( is_active_sidebar( 'sidebar-news' ) && is_page('18') ) : ?>
<div id="sidebarnews" class="widget-area" role="complementary">
<ul class="xoxo">
<?php dynamic_sidebar( 'sidebar-news' ); ?>
</ul>
</div>
<?php endif; ?>
Также после некоторого исследования и выяснения, что правильный способ расширить или изменить функциональность темы - это создать дочернюю тему, я попытался сделать это, но это привело к поломке некоторых вещей, на исправление которых у меня нет времени.
Я обнаружил, что на странице вызывается и отображается стандартный 'sidebar.php', однако, даже при наличии моего условного выражения с ID страницы, пользовательские виджеты сайдбара не отображаются.
Я также не могу найти, как вызывается стандартный сайдбар на странице, потому что удаление get_sidebar();
полностью в моем пользовательском шаблоне template_news.php
, page.php
или loop-page.php
, похоже, ничего не меняет.
Пожалуйста, подскажите, как добавить этот сайдбар на страницу.

Думаю, вам просто нужно запустить register_sidebar()
в хуке 'widgets_init'
. В теме TwentyTen есть примеры использования register_sidebar()
в файле functions.php
, но вот как это может выглядеть:
add_action( 'widgets_init', 'twentyten_widgets_init' );
function twentyten_widgets_init() {
register_sidebar( array(
'name' => __( 'Боковая панель новостей', 'yoursite' ),
'id' => 'sidebar-news',
'description' => __( 'Область боковой панели для новостей', 'yoursite' ),
'before_widget' => '<li id="%1$s" class="widget-container %2$s">',
'after_widget' => '</li>',
'before_title' => '<h3 class="widget-title">',
'after_title' => '</h3>',
));
/*
* ОСТАЛЬНОЙ КОД РЕГИСТРАЦИИ БОКОВОЙ ПАНЕЛИ ИЗ twentyten_widgets_init() ДОБАВЛЯЕТСЯ ЗДЕСЬ
*/
}
Также в вашем шаблоне страницы template_news.php
используйте следующий код для вызова боковой панели, который загрузит созданный вами файл sidebar-news.php
:
<?php get_sidebar( 'news' ); ?>
Вам не понадобятся другие методы, которые вы пробовали, и уж точно не нужны никакие операторы include
.

Я уже это сделал. Это была первая вещь, которую я попробовал в точности, как вы описали. Однако это не работает. Код в моем пользовательском шаблоне для контента и боковой панели переопределяется стандартными настройками в loop.php
и loop-page.php
.

@jlego - Хм. Я протестировал свой исходный вариант с TwentyEleven и только что перепроверил с TwentyTen, и он работает. loop.php
и loop-page.php
не имеют никакого отношения к генерации боковой панели, если, конечно, другой разработчик не сделал что-то совсем странное. Не могли бы вы обновить ваш вопрос и также опубликовать эти два файла вместе с содержимым вашего файла template_news.php
?

@jlego - Также, если у вас нет PhpStorm + Zend Debugger в вашем наборе инструментов, вы можете рассмотреть возможность его приобретения. С ним вы могли бы построчно отслеживать работу вашего сайта и точно видеть, почему что-то работает или не работает.

Меня это действительно раздражало, потому что я знал, что это должно работать, и я проверил все переменные, чтобы убедиться, что шаблон установлен правильно и в моем коде нет ошибок. Оказалось, что тот, кто работал с этим до меня, добился отображения блога на странице, установив эту конкретную страницу как страницу "записей" в админке WordPress. Поэтому, когда я попытался создать пользовательский шаблон, эта настройка переопределяла мой шаблон и заставляла страницу выполнять код из тех файлов. Но всё равно спасибо за помощь. Я обязательно попробую PHPStorm и Zend Debugger.

Хотя это не решило конкретную проблему, с которой я столкнулся, это правильный способ добавления сайдбара на страницу. Я считаю, что фактическое решение моей проблемы было специфичным для моего случая, поэтому помечаю ваш ответ как решение этого вопроса, учитывая количество просмотров.

Для отображения виджета только на определенных страницах, когда все ваши страницы используют один и тот же сайдбар, вы можете воспользоваться одним из следующих плагинов:
Просто скрывает виджеты на указанных страницах. Добавляет флажки к каждому виджету для отображения или скрытия его на каждой странице сайта.
Widget Logic позволяет управлять отображением виджетов на страницах с использованием условных тегов WordPress. Также добавляет фильтр 'widget_content'.

Также отличный плагин для этого - https://wordpress.org/plugins/dynamic-widgets/
