いくつかの定義済みウィジェットは、各エントリの後にselect
要素(ドロップダウン)やカウンタを使用するオプションを提供します。これらのウィジェットにCSSクラスwidget-with-dropdown
またはwidget-with-counters
を追加する方法を教えてください。
カスタムウィジェット 、 既知のサイドバーID 、または 位置 に対する解決策はすでにあります。しかし、私は現在のインスタンスのパラメータを調べなければなりません、そして私はすべての可能な位置やウィジェットをキャッチしたいのです(それらがWordPress命名体系に従っているなら)。
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' ]
と等しいキーを持っています。
このキーに関連付けられているのもまた配列です。ここでは、値が0
または1
の別のキーdropdown
(またはcount
)が見つかります。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;
}
あるいは、単にプラグインを使うこともできます。
両方のプラグインは@toschoが彼の答えで示したのとほとんど同じことをしています。
$this_id = $params[0]['id']; // Get the id for the current sidebar we're processing
$widget_id = $params[0]['widget_id'];
$widget_obj = $wp_registered_widgets[$widget_id];
$widget_num = $widget_obj['params'][0]['number'];
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'];
@toschoが正しいことを証明するためだけに他に選択肢がないようです
まずコンストラクタにカスタムプレースホルダクラスを追加します。
<?php
public function __construct() {
$widget_ops = array(
'classname' =>; 'widget_text eaa __eaa__', //__eaa__ is my placeholder css class
'description' =>; __( 'AdSense ads, arbitrary text, HTML or JS.','eaa' ),
'customize_selective_refresh' =>; true,
);
$control_ops = array( 'width' =>; 400, 'height' =>; 350 );
parent::__construct( 'eaa', __( 'Easy AdSense Ads & Scripts', 'eaa' ), $widget_ops, $control_ops );
}
?>
それから、このようなウィジェットオプションに基づいて、あなたが選んだクラスに置き換えてください。
<?php
if ( $instance['no_padding'] ) {
$args['before_widget'] = str_replace( '__eaa__', 'eaa-clean', $args['before_widget'] );
}
?>
プレースホルダーを使用して、before_widgetのHTMLがプラグイン機能に影響を与える可能性がある方法を制限しています
例で詳細を見つけることができます http://satishgandham.com/2017/03/adding-dynamic-classes-custom-wordpress-widgets/