Vấn đề là để làm cho update
phương thức của lớp widget hoạt động, các đầu vào tên trên form
phương thức phải được đặt qua $this->get_get_field_name('name_of_the_field');
nhưng wp_category_checklist
khô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_checklist
sử 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_Checklist
và 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_el
phươ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' );