web-dev-qa-db-fra.com

Utiliser wp_category_checklist dans un widget

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 économiser, pour autant que je sache, ce n'est pas une sauvegarde (les cases à cocher ne sont pas cochées): -

Voici le code édité que j'ai pour le 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? S'il vous plaît laissez-moi savoir si vous avez besoin de quelque chose d'autre.

Merci :)

8
Rhys Wynne

Le problème est que pour que la méthode update de la classe de widget fonctionne, les entrées de nom de la méthode form doivent être définies via $this->get_get_field_name('name_of_the_field');, mais wp_category_checklist ne dispose d'aucun argument pour configurer le nom des entrées (cases à cocher).

Cependant, wp_category_checklist utilise une classe de marcheur pour imprimer les cases à cocher et permettre sa personnalisation. Par défaut, la classe utilisée est Walker_Category_Checklist et la méthode qui affiche les cases à cocher est start_el.

Cette méthode n'a pas de filtre pour permettre l'édition des noms d'entrée, mais nous pouvons créer un programme personnalisé qui accepte les paramètres pour configurer le nom. Si ce programme étend Walker_Category_Checklist, il suffit de remplacer la méthode start_el (principalement en copiant à partir 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 widgets:

/**
 * 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' );
9
gmazzap