it-swarm.com.de

Fügen Sie before_widget eine Klasse für alle Widgets mit einem Dropdown und einem Zähler hinzu

Einige vordefinierte Widgets bieten die Möglichkeit, nach jedem Eintrag ein select -Element (Dropdown) und/oder einen Zähler zu verwenden. Wie kann ich diesen Widgets die CSS-Klassen widget-with-dropdown oder widget-with-counters hinzufügen?

Es gibt bereits Lösungen für benutzerdefinierte Widgets , bekannte Seitenleisten-IDs oder Positionen , aber ich muss die Parameter für die aktuelle Instanz überprüfen und möchte alle möglichen Positionen oder Widgets erfassen (sofern vorhanden) Sie folgen dem WordPress-Benennungsschema.

3
fuxia

Die CSS-Klassen werden in der Funktion dynamic_sidebar() angewendet. Dafür gibt es keinen speziellen Filter:

// 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_);

Es gibt jedoch einen Filter für $params direkt nach diesem Codeblock:

$params = apply_filters( 'dynamic_sidebar_params', $params );

Um die Einstellungen für das aktuelle Widget zu erhalten, müssen wir in der globalen Variablen $wp_registered_widgets nach einem Eintrag mit dem Schlüssel $params[ 0 ][ 'widget_id' ] suchen.
Wenn es existiert, hat es eine Klasseninstanz als Rückruf und wir können die Methode get_settings() dieses Objekts verwenden, um… nun… die Einstellungen abzurufen.
Das zurückgegebene Array hat wahrscheinlich einen Schlüssel, der $params[1][ 'number' ] entspricht.
Mit diesem Schlüssel ist wieder ein Array verknüpft, und hier finden wir möglicherweise einen anderen Schlüssel dropdown (oder count) mit dem Wert 0 oder 1.
Wenn es sich um 1 handelt, fügen wir die neuen Klassen der Zeichenfolge in $params[0]['before_widget'] hinzu.

Ich denke, das ist einfacher als Code zu lesen:

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

Oder Sie können einfach ein Plugin verwenden:

Beide Plugins verhalten sich ähnlich wie @toscho in seiner Antwort.

Widget CSS Classes Plugin

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

Quelllink zu v1.2.1

Plugin für benutzerdefinierte Widget-Klassen

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

Quelllink zu v1.1

Nur um zu beweisen, dass @toscho richtig ist und es keine andere Option zu geben scheint.

0
divydovy

fügen Sie zunächst im Konstruktor eine benutzerdefinierte Platzhalterklasse hinzu

<?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 );
}
?>

Ersetzen Sie es dann durch die Klasse (n) Ihrer Wahl, basierend auf den Widget-Optionen wie diesen

<?php
if ( $instance['no_padding'] ) {
   $args['before_widget'] = str_replace( '__eaa__', 'eaa-clean', $args['before_widget'] );
}
?>

Wir verwenden den Platzhalter, um die Art und Weise zu begrenzen, in der der HTML-Code von before_widget unsere Plug-in-Funktionalität beeinflusst

Sie finden die Details mit Beispiel unter http://satishgandham.com/2017/03/adding-dynamic-classes-custom-wordpress-widgets/

0
Satish Gandham