web-dev-qa-db-ja.com

ドロップダウンとカウンターですべてのウィジェットのbefore_widgetにクラスを追加します

いくつかの定義済みウィジェットは、各エントリの後にselect要素(ドロップダウン)やカウンタを使用するオプションを提供します。これらのウィジェットにCSSクラスwidget-with-dropdownまたはwidget-with-countersを追加する方法を教えてください。

カスタムウィジェット既知のサイドバーID 、または 位置 に対する解決策はすでにあります。しかし、私は現在のインスタンスのパラメータを調べなければなりません、そして私はすべての可能な位置やウィジェットをキャッチしたいのです(それらがWordPress命名体系に従っているなら)。

3
fuxia

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;
}
4
fuxia

あるいは、単にプラグインを使うこともできます。

両方のプラグインは@toschoが彼の答えで示したのとほとんど同じことをしています。

ウィジェットCSSクラスプラグイン

$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'];

v1.2.1へのソースリンク

カスタムウィジェットクラスプラグイン

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'];

v1.1へのソースリンク

@toschoが正しいことを証明するためだけに他に選択肢がないようです

0
divydovy

まずコンストラクタにカスタムプレースホルダクラスを追加します。

<?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 &amp; 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/

0
Satish Gandham