nmystic
  • 0
Новичок

Контекстно-зависимые виджеты. Моя работа в процессе

  • 0

Я работаю над простым дополнением к параметрам виджета, позволяющим пользователю устанавливать «контекст», в котором отображаются виджеты.

Вот что у меня есть на данный момент, с моими вопросами в комментариях…

1) Добавить форму виджета ко всем виджетам…

add_filter('in_widget_form', 'wse_widget_context_form');

function wse_widget_context_form($widget){
//echo 'the widget id is: '.$widget->id;
//do we need to reference the widget->id to avoid variable overwrites on multiple widgets?
?>
<div class="wse_context">
    <ul>
        <li>Hide this widget on: </li>
        <li id='home'><label><input value="on" type="checkbox" name="noHome" id="noHome"<?php if(isset($noHome)) echo $noHome ?> /> home</label></li> 
        <li id='posts'><label><input value="on" type="checkbox" name="noPosts" id="noPosts"<?php if(isset($noPosts)) echo $noPosts ?> /> posts</label></li>
        <li id='pages'><label><input value="on" type="checkbox" name="noPages" id="noPages"<?php if(isset($noPages)) echo $noPages ?> /> pages</label></li>
        <li id='cats'><label><input value="on" type="checkbox" name="noCats" id="noCats"<?php if(isset($noCats)) echo $noCats ?> /> categories</label></li>
    </ul>
</div>

2) Создайте функцию обратного вызова для обработки при сохранении виджетов… (пока что это та часть, на которой я застрял)

<?php
add_filter('widget_update_callback', 'wse_widget_context_callback');

add_filter('widget_update_callback', 'wse_widget_context_callback');
function wse_widget_context_callback($instance, $new_instance, $old_instance){
    echo 'instance: '.$instance.'<br/>'; // returns array
    echo 'new_instance: '.$new_instance.'<br/>'; //returns ''
    echo 'old_instance: '.$old_instance.'<br/>'; //returns ''
}

3) Показать/скрыть виджет в зависимости от настроек виджета

add_filter('widget_display_callback', 'wse_widget_display_callback');

function wse_widget_display_callback()
{
//how do I read the values and unset widgets as appopriate?

}
Share
  1. Найдите плагин контекста виджета, я знаю, что у Semiologic есть один и еще один. Возможно, у вас есть интересующий вас код.

    • 0
    • Хакре спасибо. У меня есть последняя версия sem-reloaded, но там нет контекста виджета. Плагин «контекст виджета» — это мое первоначальное вдохновение, но он делает гораздо больше, чем мне нужно, и мне очень трудно его разобрать. Он даже не использует фильтры (in_widget_form, widget_update_callback или widget_display_callback), что меня сбивает.

      • 0
    • Спасибо! Особенно для кода примера display_callback — имеет смысл. Я действительно застрял в обратном вызове обновления.

      • 0
    • вам не нужно проверять $_POST. Просто передайте 3 аргумента вашей функции обновления: instance, $new_instance, $old_instance. $new_instance действует как $_POST и $instance является вашими текущими параметрами виджета, которые вам нужно обновить $new_instance значениями, а затем вернуть их (WP обновит параметры в базе данных)…

      • 0
    • Хорошо, нужно немного помедлить. Как/где определить экземпляры? Внутри wse_widget_context_form() или в качестве аргументов wse_widget_context_callback($instance, $new_instance, $old_instance)?

      • 0
  2. Точно так же, как в методе widget():

    function wse_widget_display_callback($instance)
    {
    
       $show_it = true;
       if(isset($instance['noHome']) && $instance['noHome'] && is_home()) $show_it = false;
       if(isset($instance['noPages']) && $instance['noPages'] && is_page()) $show_it = false;
       ...
    
       if($show_it)
         return $instance;
    
       else
         return false;
    
    }
    

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

    • 0

Оставить ответ

You must login to add an answer.