2012-09-10 10 views
7

In Wordpress, il mio obiettivo è essere in grado di assegnare una classe personalizzata a ogni widget che inserisco nella barra laterale. Preferibilmente vorrei aggiungere questa classe nelle impostazioni del widget di ciascun widget. ANCHE widget di terze parti.Wordpress: aggiungi l'opzione di configurazione a tutte le impostazioni del widget

stavo pensando di cambiare il nome di classe, perché il nome della classe è già passato alla funzione diregister_sidebar (% 2 $ s):

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

Naturalmente non dovrebbe cambiare codice di base WP o 3a parte plugins. Ciò significa che ho bisogno di scrivere un plugin che si agganci al processo di configurazione del widget.

ho già scoperto che è possibile modificare tutti i widget forme, agganciando in azione 'in_widget_form':

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

Questi dati devono essere salvati dalla classe super-Widget, ma come si fa a recuperare questi dati (quindi, quando si aprono le impostazioni del widget in seguito viene mostrato ciò che è stato compilato in precedenza)

E, questi dati salvati devono essere inseriti nell'istanza del widget -come è fatto? Credo che usando qualcosa come:

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

Quindi, fondamentalmente ho 2 domande:

  • Sto usando il modo corretto di affrontare questo problema (lo stile dei singoli widget)
  • Se sì, come posso modificare un'istanza widget per salvare e recuperare impostazioni aggiuntive, senza dover modificare Wordpress o codice sorgente Plugin di terze parti.

risposta

8
  1. Per impostazione predefinita ogni istanza widget ha un ID univoco che può essere utilizzato per lo stile di esso.

  2. Per salvare i dati dai campi aggiunti in un'azione in_widget_form, è necessario disporre anche di un filtro widget_update_callback.

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

    Per visualizzare il valore salvato nel modulo, è necessario innanzitutto recuperare le impostazioni dell'istanza.

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

    Infine, penso che il modo più semplice per aggiungere i tuoi classi personalizzate è in un filtro widget_display_callback, che corre prima che venga visualizzato un widget. Devi visualizzare il widget da solo perché puoi restituire un'istanza da questo filtro e le istanze non controllano le classi CSS del widget.

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

Vedi questo articolo per ulteriori informazioni sui ganci disponibili relativi ai widget: http://shibashake.com/wordpress-theme/wordpress-widget-system

+0

Brilliant! Nel frattempo sono riuscito a salvare le nuove impostazioni e sono arrivato fino all'utilizzo del hook "widget_display_callback". Ma non ti rendi conto che sei in grado di restituire false e chiamare $ widget-> widget() te stesso. Grazie mille! – publicJorn

Problemi correlati