2012-09-10 29 views
7

Trong Wordpress, mục tiêu của tôi là có thể đưa ra một lớp tùy chỉnh cho mọi tiện ích mà tôi đặt vào thanh bên. Tốt hơn là tôi muốn thêm lớp này vào cài đặt tiện ích của từng tiện ích con. CSONG widget bên thứ 3.Wordpress: Thêm tùy chọn cấu hình vào tất cả các cài đặt widget

Tôi đã nghĩ đến việc thay đổi classname, vì classname đã được thông qua với register_sidebar function (% 2 $ s):

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

Ofcourse tôi không nên thay đổi mã WP lõi hoặc bên thứ 3 bổ sung. Điều này có nghĩa rằng tôi cần phải viết một plugin mà sẽ móc vào quá trình cấu hình widget.

Tôi đã phát hiện ra rằng nó có thể thay đổi tất cả các dạng widget, bằng cách gắn vào hành động '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 
} 
?> 

Những thông tin này sẽ được lưu bởi siêu lớp Widget, nhưng làm thế nào để bạn lấy dữ liệu này (vì vậy khi mở cài đặt tiện ích con sau này hiển thị những gì bạn đã điền trước đó)

Và, dữ liệu đã lưu này sẽ được đặt trong trường hợp tiện ích con- đây là cách thực hiện? Tôi đoán bằng cách sử dụng một cái gì đó như:

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

Vì vậy, về cơ bản tôi có 2 câu hỏi:

  • Tôi có sử dụng một cách thích hợp để giải quyết vấn đề này (phong cách của widget cá nhân)
  • Nếu vậy, làm thế nào tôi có thể sửa đổi một cá thể widget để lưu và truy xuất các cài đặt bổ sung mà không phải sửa đổi mã nguồn của Plugin của Wordpress hoặc bên thứ ba.

Trả lời

8
  1. Theo mặc định, mỗi trường hợp tiện ích con có một ID duy nhất có thể được sử dụng để tạo kiểu.

  2. Để lưu dữ liệu từ các trường được thêm vào trong hành động in_widget_form, bạn cũng cần có bộ lọc widget_update_callback.

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

    Để hiển thị giá trị đã lưu trong biểu mẫu, trước tiên bạn cần truy lục cài đặt cá thể.

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

    Cuối cùng, tôi nghĩ cách đơn giản nhất để thêm lớp tùy chỉnh của bạn là trong bộ lọc widget_display_callback, chạy trước khi tiện ích được hiển thị. Bạn phải tự mình hiển thị tiện ích vì bạn chỉ có thể trả về một cá thể từ bộ lọc này và các cá thể không kiểm soát các lớp CSS của tiện ích.

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

Xem bài viết này để biết thêm về các móc có sẵn liên quan đến các widget: http://shibashake.com/wordpress-theme/wordpress-widget-system

+0

Brilliant! Trong khi đó, tôi đã có thể lưu các thiết lập mới và tôi đã đi xa như sử dụng móc "widget_display_callback". Nhưng đã không nhận ra rằng bạn có thể trả về false và tự gọi $ widget-> widget(). Cảm ơn nhiều! – publicJorn

Các vấn đề liên quan