Kriuchko
1/8/2019 - 2:08 PM

Widget fields добавление полей ко всем виджетам

Wordpress widget fields



Иногда в проектах встречается задача, когда нужно ко всем виджетам одного сайдбара добавить признак какой-то, например линку в тайтл задавать для всех виджетов. Для того, чтобы не хардкодить все типы виджетов, это можно решить более глобальным методом – добавлением дополнительного поля ко всем виджетам.
Для этого необходимо:

   1. Добавить поля в настройки виджетов.

      add_action('in_widget_form', 'add_widget_link', 5,3);

      function add_widget_link($widget_instance, $return, $instance) {
      $instance = wp_parse_args( (array) $instance, array( 'title' => '', 'text' => '') );
      if ( !isset($instance['header_image_link']) )
      $instance['header_link'] = null;

      ?>
      <label for="<?php echo $widget_instance->get_field_id('header_link'); ?>">Header Link:
      <input type="text" id="<?php echo $widget_instance->get_field_id('header_link'); ?>" class="widefat" name="<?php echo $widget_instance->get_field_name('header_link'); ?>" value="<?php echo $instance['header_link']?>">
      </label>
      <?php
      $return = null;
      return array($widget_instance,$return,$instance);
      }
   2. Добавить фильтр для сохранения дополнительного поля для виджетов.

      add_filter('widget_update_callback', 'add_widget_link_callback', 10, 4);
      function add_widget_link_callback($instance, $new_instance, $old_instance, $widget) {
      $instance['header_link'] = $new_instance['header_link'];
      return $instance;
      }
   3. Вывести новые поля на frontend.

      add_filter('dynamic_sidebar_params', 'add_widget_image_and_link_sidebar_params');

      function add_widget_image_and_link_sidebar_params($params){
      global $wp_registered_widgets;
      $widget_id = $params[0]['widget_id'];
      $widget_obj = $wp_registered_widgets[$widget_id];
      $widget_opt = get_option($widget_obj['callback'][0]->option_name);
      $widget_num = $widget_obj['params'][0]['number'];
      if (isset($widget_opt[$widget_num]['header_link'])){
      $header_link = $widget_opt[$widget_num]['header_link'];
      }
      if($header_link){
      $params[0]['before_title'] = $params[0]['before_title'].'<a href="'.$header_link.'">';
      $params[0]['after_title'] = '</a>'.$params[0]['after_title'];
      }
      return $params;
      }

      Таким образом можно изменять параметры before_title, after_title, before_widget, after_widget и по такому же принципу работает плагин Widget Classes.