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