Il problema è che per far funzionare il update
metodo della classe widget, gli input dei nomi sul form
metodo devono essere impostati tramite $this->get_get_field_name('name_of_the_field');
ma wp_category_checklist
non ha alcun argomento per impostare il nome degli input (caselle di controllo).
Tuttavia, wp_category_checklist
utilizza una classe walker per stampare le caselle di controllo e consentire la personalizzazione. Per impostazione predefinita, la classe utilizzata è Walker_Category_Checklist
e il metodo che stampa le caselle di controllo è start_el
.
Questo metodo non ha filtri per consentire la modifica dei nomi di input, ma possiamo creare un walker personalizzato, che accetta parametri per impostare il nome. Se questo walker si estende Walker_Category_Checklist
, dobbiamo solo sostituire il start_el
metodo (principalmente copiando dall'originale).
Il codice:
// 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>';
}
}
Ora, probabilmente nello stesso file, possiamo scrivere la classe del 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>';
}
}
Infine, registra il widget:
function TestCategoryWidgetInit() {
register_widget( 'TestCategoryWidget' );
}
add_action( 'widgets_init', 'TestCategoryWidgetInit' );