Utilizzo di wp_category_checklist in un widget


8

Sto cercando di utilizzare wp_category_checklist in un widget per visualizzare un elenco di caselle di controllo che, se salvate, rimangono spuntate. Al momento sto avendo dei problemi terribili nel farli salvare, per quanto ne so non sta salvando (le caselle di controllo rimangono deselezionate): -

Ecco il codice modificato che ho al momento.

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
}

Qualche idea? Per favore fatemi sapere se avete bisogno di qualsiasi altra cosa.

Grazie :)

Risposte:


9

Il problema è che per far funzionare il updatemetodo della classe widget, gli input dei nomi sul formmetodo devono essere impostati tramite $this->get_get_field_name('name_of_the_field');ma wp_category_checklistnon ha alcun argomento per impostare il nome degli input (caselle di controllo).

Tuttavia, wp_category_checklistutilizza una classe walker per stampare le caselle di controllo e consentire la personalizzazione. Per impostazione predefinita, la classe utilizzata è Walker_Category_Checkliste 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_elmetodo (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' );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.