Utilisation de wp_category_checklist dans un widget

8

J'essaie d'utiliser wp_category_checklist dans un widget pour afficher une liste de cases à cocher qui, une fois enregistrées, restent cochées. J'ai actuellement beaucoup de mal à les faire enregistrer, pour autant que je sache que ce n'est pas le cas (les cases à cocher ne sont pas cochées): -

Voici le code édité que j'ai en ce moment.

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
}

Des idées? Veuillez me faire savoir si vous avez besoin d'autre chose.

Merci :)

Rhys Wynne
la source

Réponses:

9

Le problème est que pour que la updateméthode de la classe de widget fonctionne, les entrées de nom sur la formméthode doivent être définies via $this->get_get_field_name('name_of_the_field');mais wp_category_checklistn'ont pas d'argument pour configurer le nom des entrées (cases à cocher).

Cependant, wp_category_checklistutilise une classe walker pour imprimer les cases à cocher et autoriser sa personnalisation. Par défaut, la classe utilisée est Walker_Category_Checklistet 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_elmé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' );
gmazzap
la source