2012-09-10 9 views
7

En Wordpress, mi objetivo es poder dar una clase personalizada a cada widget que coloque en la barra lateral. Preferiblemente me gustaría agregar esta clase en la configuración del widget de cada widget. TAMBIÉN widgets de terceros.Wordpress: agregue la opción de configuración a todas las configuraciones de widgets

estaba pensando en cambiar el nombre de la clase, ya que el nombre de clase ya se pasa a la función deregister_sidebar (% 2 $ s):

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

Por supuesto que no hay que cambiar el código del núcleo WP o tercera parte complementos Esto significa que necesito escribir un complemento que se enganche en el proceso de configuración del widget.

ya me di cuenta que es posible modificar todas las formas de widgets, enganchando a la acción '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 
} 
?> 

Estos datos deben ser salvados por la super clase Widget, pero ¿cómo puede recuperar estos datos (por lo tanto, al abrir la configuración del widget más adelante se muestra lo que completó antes)

Y, estos datos guardados deben colocarse en la instancia del widget: ¿cómo se hace? Creo que mediante el uso de algo como:

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

Así que, básicamente, tengo 2 preguntas:

  • ¿Estoy usando la forma correcta de abordar este problema (el estilo de los widgets individuales)
  • Si es así, ¿cómo ¿Puedo modificar una instancia de widget para guardar y recuperar configuraciones adicionales, sin tener que modificar el código fuente de Wordpress o del complemento de terceros?

Respuesta

8
  1. Por defecto cada instancia de control tiene un identificador único que se puede utilizar para diseñarlo.

  2. Para guardar los datos de los campos agregados en una acción in_widget_form, también necesita tener un filtro widget_update_callback.

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

    Para mostrar el valor guardado en el formulario, primero deberá recuperar la configuración de la instancia.

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

    Por último, creo que la forma más sencilla de añadir sus clases personalizadas se encuentra en un filtro widget_display_callback, que se ejecuta antes de que aparezca un widget. Debe mostrar el widget usted mismo porque solo puede devolver una instancia de este filtro y las instancias no controlan las clases 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; 
    } 
    

Consulte este artículo para obtener más información sobre los ganchos disponibles relacionados con widgets: http://shibashake.com/wordpress-theme/wordpress-widget-system

+0

Brilliant! Mientras tanto, pude guardar la nueva configuración y llegué hasta el punto de utilizar el enlace "widget_display_callback". Pero no se dio cuenta de que puede devolver false y llamar $ widget-> widget() usted mismo. ¡Muchas gracias! – publicJorn

Cuestiones relacionadas