Le problème est que pour que la update
méthode de la classe de widget fonctionne, les entrées de nom sur la form
méthode doivent être définies via $this->get_get_field_name('name_of_the_field');
mais wp_category_checklist
n'ont pas d'argument pour configurer le nom des entrées (cases à cocher).
Cependant, wp_category_checklist
utilise une classe walker pour imprimer les cases à cocher et autoriser sa personnalisation. Par défaut, la classe utilisée est Walker_Category_Checklist
et la méthode qui imprime les cases à cocher est start_el
.
Cette méthode n'a pas de filtre pour permettre la modification des noms d'entrée, mais nous pouvons créer un marcheur personnalisé, qui accepte les paramètres pour configurer le nom. Si ce marcheur s'étend Walker_Category_Checklist
, nous n'avons besoin que de remplacer la start_el
méthode (principalement la copie de l'original).
Le code:
// 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>';
}
}
Maintenant, probablement dans le même fichier, nous pouvons écrire la classe de 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>';
}
}
Enfin, enregistrez le widget:
function TestCategoryWidgetInit() {
register_widget( 'TestCategoryWidget' );
}
add_action( 'widgets_init', 'TestCategoryWidgetInit' );