在Wordpress中,我的目标是能够为我放在侧边栏中的每个小部件提供一个自定义类。 我希望在每个小部件的小部件设置中添加此类。还有第三方小部件。
我正在考虑更改类名,因为类名已经传递给 register_sidebar 函数(%2 $ s):
<?php
register_sidebar(array('before_widget' => '<aside id="%1$s" class="widget %2$s blue">'));
?>
当然我不应该更改WP核心代码或第三方插件。这意味着我需要编写一个将挂钩到小部件配置过程的插件。
我已经发现可以通过挂钩动作'in_widget_form'来修改所有小部件表单:
<?php
add_action('in_widget_form', 'teaserWidgetAddToForm');
function teaserWidgetAddToForm($widget_instance) {
?>
<label for="<?php echo $widget_instance->get_field_id('teaser-classname'); ?>">Custom classname(s):</label>
<input type="text" id="<?php echo $widget_instance->get_field_id('teaser-classname'); ?>" name="<?php echo $widget_instance->get_field_name('teaser-classname'); ?>">
<?php
}
?>
这个数据应该由Widget超级类保存,但是你如何检索这些数据(所以当打开小部件设置以后会显示你之前填写的内容)
而且,这个保存的数据应该放在小部件实例中 - 这样做了吗?我想通过使用类似的东西:
<?php
$wp_registered_widgets[<widget_id>]['callback'][0]['widget_options']['classname'] = <chosen_class>;
?>
基本上我有两个问题:
答案 0 :(得分:10)
默认情况下,每个窗口小部件实例都有一个唯一的ID,可用于设置样式。
为了保存in_widget_form
操作中添加的字段中的数据,您还需要widget_update_callback
过滤器。
function my_widget_update_callback($instance, $new_instance) {
$instance['my_classnames'] = $new_instance['my_classnames'];
return $instance;
}
要在表格中显示保存的值,您需要先检索实例设置。
function my_in_widget_form($instance) {
$settings = $instance->get_settings();
…
最后,我认为添加自定义类的最简单方法是在widget_display_callback
过滤器中,该过滤器在显示窗口小部件之前运行。您必须自己显示窗口小部件,因为您只能从此过滤器返回实例,并且实例不控制窗口小部件CSS类。
function my_widget_display_callback($instance, $widget, $args) {
if (!isset($instance['my_classnames'])) {
return $instance;
}
$widget_classname = $widget->widget_options['classname'];
$my_classnames = $instance['my_classnames'];
$args['before_widget'] = str_replace($widget_classname, "{$widget_classname} {$my_classnames}", $args['before_widget']);
$widget->widget($args, $instance);
return false;
}
有关与小部件相关的可用挂钩的更多信息,请参阅此文章:http://shibashake.com/wordpress-theme/wordpress-widget-system