Sử dụng wp_carget_checklist trong một widget


8

Tôi đang cố gắng sử dụng wp_carget_checklist trong một tiện ích để hiển thị danh sách các hộp kiểm mà khi lưu, vẫn được đánh dấu. Tôi đang gặp rắc rối khủng khiếp tại thời điểm khiến họ phải tiết kiệm, theo như tôi biết là nó không tiết kiệm (các hộp kiểm vẫn chưa được sử dụng): -

Đây là mã chỉnh sửa tôi có tại thời điểm này.

function update($new_instance, $old_instance) {
    $instance = $old_instance;
    $instance['widget_categories'] = $new_instance['post_category'];
return $instance;
}


function form($instance) {
    $instance = wp_parse_args( (array) $instance, $default );
    $categories = get_categories();     

    $category_array = $instance['widget_categories'];

    if (!$category_array)
    {
        $category_array = array();
    }
    ?>
    <ul class="categorychecklist">
    <?php wp_category_checklist(0,0, $category_array,false, NULL , false);?>
    </ul>
    <?php
}

Có ý kiến ​​gì không? Xin vui lòng cho tôi biết nếu bạn cần bất cứ điều gì khác.

Cảm ơn :)

Câu trả lời:


9

Vấn đề là để làm cho updatephương thức của lớp widget hoạt động, các đầu vào tên trên formphương thức phải được đặt qua $this->get_get_field_name('name_of_the_field');nhưng wp_category_checklistkhông có đối số để thiết lập tên của các đầu vào (hộp kiểm).

Tuy nhiên, wp_category_checklistsử dụng lớp walker để in các hộp kiểm và cho phép tùy chỉnh nó. Theo mặc định, lớp được sử dụng là Walker_Category_Checklistvà phương thức in các hộp kiểm là start_el.

Phương pháp đó không có bộ lọc để cho phép chỉnh sửa tên đầu vào, nhưng chúng ta có thể tạo một trình đi bộ tùy chỉnh, chấp nhận thông số để thiết lập tên. Nếu walker này mở rộng Walker_Category_Checklist, chúng ta chỉ cần ghi đè start_elphương thức (chủ yếu là sao chép từ bản gốc).

Mật mã:

// This is required to be sure Walker_Category_Checklist class is available
require_once ABSPATH . 'wp-admin/includes/template.php';
/**
 * Custom walker to print category checkboxes for widget forms
 */
class Walker_Category_Checklist_Widget extends Walker_Category_Checklist {

    private $name;
    private $id;

    function __construct( $name = '', $id = '' ) {
        $this->name = $name;
        $this->id = $id;
    }

    function start_el( &$output, $cat, $depth = 0, $args = array(), $id = 0 ) {
        extract( $args );
        if ( empty( $taxonomy ) ) $taxonomy = 'category';
        $class = in_array( $cat->term_id, $popular_cats ) ? ' class="popular-category"' : '';
        $id = $this->id . '-' . $cat->term_id;
        $checked = checked( in_array( $cat->term_id, $selected_cats ), true, false );
        $output .= "\n<li id='{$taxonomy}-{$cat->term_id}'$class>" 
            . '<label class="selectit"><input value="' 
            . $cat->term_id . '" type="checkbox" name="' . $this->name 
            . '[]" id="in-'. $id . '"' . $checked 
            . disabled( empty( $args['disabled'] ), false, false ) . ' /> ' 
            . esc_html( apply_filters( 'the_category', $cat->name ) ) 
            . '</label>';
      }
}

Bây giờ, có lẽ trong cùng một tệp chúng ta có thể viết lớp widget:

/**
 * An example of widget using wp_category_checklist on form
 */
class TestCategoryWidget extends WP_Widget {

    function __construct(){
        parent::__construct( false, 'TestWidget');
    }

    function widget( $args, $instance ) { 
        // Displays the widget on frontend 
    }

    function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance['widget_categories'] = $new_instance['widget_categories'];
        return $instance;
    }

    function form( $instance ) {
        $defaults = array( 'widget_categories' => array() );
        $instance = wp_parse_args( (array) $instance, $defaults );    
        // Instantiate the walker passing name and id as arguments to constructor
        $walker = new Walker_Category_Checklist_Widget(
            $this->get_field_name( 'widget_categories' ), 
            $this->get_field_id( 'widget_categories' )
        );
        echo '<ul class="categorychecklist">';
        wp_category_checklist( 0, 0, $instance['widget_categories'], FALSE, $walker, FALSE );
        echo '</ul>';
    }

}

Cuối cùng, đăng ký widget:

function TestCategoryWidgetInit() {
    register_widget( 'TestCategoryWidget' );
}

add_action( 'widgets_init', 'TestCategoryWidgetInit' );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.