CSS类应用于函数中dynamic_sidebar()
. 没有特定的过滤器:
// Substitute HTML id and class attributes into before_widget
$classname_ = \'\';
foreach ( (array) $wp_registered_widgets[$id][\'classname\'] as $cn ) {
if ( is_string($cn) )
$classname_ .= \'_\' . $cn;
elseif ( is_object($cn) )
$classname_ .= \'_\' . get_class($cn);
}
$classname_ = ltrim($classname_, \'_\');
$params[0][\'before_widget\'] = sprintf($params[0][\'before_widget\'], $id, $classname_);
但有一个过滤器
$params
在此代码块之后:
$params = apply_filters( \'dynamic_sidebar_params\', $params );
要获取当前小部件的设置,我们必须搜索全局变量
$wp_registered_widgets
使用键输入
$params[ 0 ][ \'widget_id\' ]
.
如果它存在,它有一个类实例作为回调,我们可以使用该对象的方法
get_settings()
获取设置
返回的数组可能有一个等于
$params[1][ \'number\' ]
.
与此键关联的又是一个数组,在这里我们可能会找到另一个键
dropdown
(或
count
) 值为
0
或
1
.
如果是
1
, 我们将新类添加到
$params[0][\'before_widget\']
.
我认为这更容易理解为代码:
is_admin() || add_filter( \'dynamic_sidebar_params\', \'wpse_widget_classes\' );
/**
* Add classes for widgets with counters or dropdowns.
*
* @param array $params
* @return array
*/
function wpse_widget_classes( $params ) {
global $wp_registered_widgets;
$classes = array();
$instance_id = $params[1][ \'number\' ];
$widget_id = $params[ 0 ][ \'widget_id\' ];
$settings = $wp_registered_widgets[ $widget_id ][ \'callback\' ][ 0 ]->get_settings();
if ( empty ( $settings[ $instance_id ] ) )
return $params;
if ( ! empty ( $settings[ $instance_id ][ \'dropdown\' ] ) )
$classes[] = \'widget-with-dropdown\';
if ( ! empty ( $settings[ $instance_id ][ \'count\' ] ) )
$classes[] = \'widget-with-counters\';
if ( empty ( $classes ) )
return $params;
$params[0][\'before_widget\'] = str_replace(
\'class="\',
\'class="\' . join( \' \', $classes ) . \' \',
$params[0][\'before_widget\']
);
return $params;
}