Menggunakan wp_category_checklist di widget

8

Saya mencoba menggunakan wp_category_checklist di widget untuk menampilkan daftar kotak centang yang, ketika disimpan, tetap dicentang. Saya mengalami masalah besar saat ini untuk menyelamatkan mereka, sejauh yang saya tahu tidak menyimpan (kotak centang tetap tidak digunakan): -

Inilah kode yang saya edit saat ini.

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
}

Ada ide? Tolong beritahu saya jika Anda butuh sesuatu yang lain.

Terima kasih :)

Rhys Wynne
sumber

Jawaban:

9

Masalahnya adalah bahwa untuk membuat updatemetode kelas widget berfungsi, input nama pada formmetode harus ditetapkan melalui $this->get_get_field_name('name_of_the_field');tetapi wp_category_checklisttidak memiliki argumen untuk mengatur nama input (kotak centang).

Namun, wp_category_checklistgunakan kelas walker untuk mencetak kotak centang dan mengizinkannya. Secara default kelas yang digunakan adalah Walker_Category_Checklist, dan metode yang mencetak kotak centang adalah start_el.

Metode itu tidak memiliki filter untuk memungkinkan pengeditan nama input, tetapi kita bisa membuat custom walker, yang menerima params untuk mengatur nama. Jika walker ini diperluas Walker_Category_Checklist, kita hanya perlu mengganti start_elmetode (kebanyakan menyalin dari aslinya).

Kode:

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

Sekarang, mungkin dalam file yang sama kita dapat menulis kelas 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>';
    }

}

Akhirnya, daftarkan widget:

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

add_action( 'widgets_init', 'TestCategoryWidgetInit' );
gmazzap
sumber