Отображение виджетов определенного динамического сайдбара на конкретной странице

16 сент. 2011 г., 08:14:05
Просмотры: 34.7K
Голосов: 1

Мне передали сайт на 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, похоже, ничего не меняет.

Пожалуйста, подскажите, как добавить этот сайдбар на страницу.

1
Комментарии

Еще один плагин — Widget Display Options

User User
4 мая 2013 г. 17:34:35
Все ответы на вопрос 2
6

Думаю, вам просто нужно запустить 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.

16 сент. 2011 г. 09:35:58
Комментарии

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

biggles biggles
16 сент. 2011 г. 18:03:56

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

MikeSchinkel MikeSchinkel
16 сент. 2011 г. 18:27:23

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

MikeSchinkel MikeSchinkel
16 сент. 2011 г. 18:32:07

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

biggles biggles
17 сент. 2011 г. 06:38:53

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

biggles biggles
4 сент. 2013 г. 00:49:51

@jlego - Ого, спасибо, что вернулись к этому спустя столько времени. В любом случае, жаль, что я не смог помочь с вашим конкретным случаем.

MikeSchinkel MikeSchinkel
5 сент. 2013 г. 17:34:12
Показать остальные 1 комментариев
1

Для отображения виджета только на определенных страницах, когда все ваши страницы используют один и тот же сайдбар, вы можете воспользоваться одним из следующих плагинов:

Display Widgets

Просто скрывает виджеты на указанных страницах. Добавляет флажки к каждому виджету для отображения или скрытия его на каждой странице сайта.

Widget Logic

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

16 сент. 2011 г. 19:08:56
Комментарии

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

NickFMC NickFMC
16 янв. 2015 г. 04:15:36