2012-09-10 18 views
7

In Wordpress ist mein Ziel, in der Lage zu geben, eine benutzerdefinierte Klasse zu jedem Widget, das ich in der Sidebar gesetzt. Vorzugsweise möchte ich diese Klasse in den Widget-Einstellungen jedes Widget hinzufügen. ALSO 3rd Party Widgets.Wordpress: Hinzufügen Konfigurationsoption zu allen Widget-Einstellungen

Ich dachte an den Klassennamen zu ändern, weil der Klassenname bereits auf die register_sidebar Funktion (% 2 $ s) übergeben wird:

<?php 
register_sidebar(array('before_widget' => '<aside id="%1$s" class="widget %2$s blue">')); 
?> 

Ofcourse sollte ich nicht WP Kern-Code oder 3rd-Party ändern Plugins. Das bedeutet, dass ich ein Plugin schreiben muss, das sich in den Widget-Konfigurationsprozess einklinkt.

ich bereits herausgefunden, dass es möglich ist, alle Widgets Formen ändern, indem sie in Aktion ‚in_widget_form‘ Einhaken:

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

Diese Daten werden von der Widget Superklasse gespeichert werden sollen, sondern wie man diese Daten ruft (also beim Öffnen der Widget-Einstellungen zeigt später, was Sie früher ausgefüllt)

Und diese gespeicherten Daten sollten in die Widget-Instanz-wie ist das getan? Ich denke, durch so etwas wie mit: Also im Grunde

<?php 
$wp_registered_widgets[<widget_id>]['callback'][0]['widget_options']['classname'] = <chosen_class>; 
?> 

Ich habe 2 Fragen:

  • Bin ich den richtigen Weg, mit diesem Problem zu begegnen (Styling der einzelnen Widgets)
  • Wenn ja, wie kann ich eine Widget-Instanz ändern, um zusätzliche Einstellungen zu speichern und abzurufen, ohne den Quellcode von Wordpress oder Drittanbieter-Plugins ändern zu müssen.

Antwort

8
  1. standardmäßig jede Widget-Instanz hat eine eindeutige ID, die verwendet werden kann, um Stil.

  2. Um Daten aus Feldern zu speichern, die in einer in_widget_form Aktion hinzugefügt wurden, müssen Sie auch einen widget_update_callback Filter haben.

    function my_widget_update_callback($instance, $new_instance) { 
        $instance['my_classnames'] = $new_instance['my_classnames']; 
        return $instance; 
    } 
    

    Um den gespeicherten Wert im Formular anzuzeigen, müssen Sie zuerst die Instanzeinstellungen abrufen.

    function my_in_widget_form($instance) { 
        $settings = $instance->get_settings(); 
        … 
    

    Schließlich glaube ich, die einfachste Art und Weise Ihre benutzerdefinierten Klassen hinzufügen in einem widget_display_callback Filter ist, die ausgeführt wird, bevor ein Widget angezeigt wird. Sie müssen das Widget selbst anzeigen, da Sie nur eine Instanz aus diesem Filter zurückgeben können und Instanzen die Widget-CSS-Klassen nicht steuern.

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

Lesen Sie diesen Artikel für weitere Informationen zu den verfügbaren Haken Widgets bezogen werden: http://shibashake.com/wordpress-theme/wordpress-widget-system

+0

Brilliant! In der Zwischenzeit konnte ich die neuen Einstellungen speichern und ich kam so weit wie den "widget_display_callback" Hook. Aber du hast nicht erkannt, dass du in der Lage bist, false zurückzugeben und $ widget-> widget() selbst aufzurufen. Vielen Dank! – publicJorn

Verwandte Themen