2012-09-10 13 views
7

WordPress'de, amacım kenar çubuğuna koyduğum her widget'a özel bir sınıf verebilmek. Tercihen, bu sınıfı her bir widget'ın widget ayarlarına eklemek istiyorum. Ayrıca 3. parti widget'ları.WordPress: Tüm widget ayarlarına config seçeneği ekle

sınıfadı zaten register_sidebar fonksiyonu (% 2 $ s) geçirilir çünkü sınıfadı değişen düşünüyordum:

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

Tabii ben WP çekirdek kodu veya 3. taraf değişmemelidir eklentileri. Bu, widget yapılandırma sürecine girecek bir eklenti yazmam gerektiği anlamına gelir.

Zaten o in_widget_form 'eyleme çengel, tüm widget'ları formları değiştirmek mümkün olduğunu öğrendim:

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

Bu veriler Widget süper sınıfı tarafından kaydedilmelidir, ancak bu verileri almak nasıl (Widget ayarlarını açarken daha sonra ne doldurduğunuzu gösterir.)

Ve bu kaydedilen veriler widget örneğine yerleştirilmelidir - bu işlem bitti mi? Ben böyle bir şey kullanarak tahmin: Yani temelde

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

ben 2 soru var:

  • Ben Öyleyse, nasıl bu sorunu (bireysel widget stil)
  • adrese doğru yol kullanıyor muyum Wordpress veya 3. parti Eklenti kaynak kodunu değiştirmek zorunda kalmadan ek ayarları kaydetmek ve almak için bir widget örneğini değiştirebilir miyim. Varsayılan olarak

cevap

8
  1. her widget örneği stilini için kullanılabilecek benzersiz bir kimliği vardır.

  2. Bir in_widget_form eyleminde eklenmiş alanlardan veri kaydetmek için, bir widget_update_callback filtresine de sahip olmanız gerekir.

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

    ilk örneği ayarlarını almak gerekir şeklinde kaydedilmiş değeri görüntülemek için.

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

    Son olarak, özel sınıflar eklemek için en basit yolu bir widget görüntülenmeden önce çalışan bir widget_display_callback filtresinde olduğunu düşünüyorum. Widget'ı kendiniz görüntülemeniz gerekir çünkü bir örneği yalnızca bu filtreden döndürebilir ve örnekler, widget CSS sınıflarını kontrol etmez.

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

widget'lar ile ilgili mevcut kanca hakkında daha fazla bilgi için bu makaleye bakın: http://shibashake.com/wordpress-theme/wordpress-widget-system

+0

Parlak! Bu arada yeni ayarları kaydedebildim ve "widget_display_callback" kancasını kullanarak geldim. Ancak, yanlış bir şekilde geri döndürebileceğinizi ve $ widget-> widget'ını() kendiniz de çağırabileceğinizi anlayamadınız. Çok teşekkürler! – publicJorn