Verwenden von wp_category_checklist in einem Widget


8

Ich versuche, wp_category_checklist in einem Widget zu verwenden, um eine Liste von Kontrollkästchen anzuzeigen, die beim Speichern aktiviert bleiben. Ich habe im Moment schreckliche Probleme, sie zum Speichern zu bringen, soweit ich weiß, dass sie nicht gespeichert werden (die Kontrollkästchen bleiben deaktiviert): -

Hier ist der bearbeitete Code, den ich gerade habe.

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
}

Irgendwelche Ideen? Bitte lassen Sie mich wissen, wenn Sie noch etwas benötigen.

Vielen Dank :)

Antworten:


9

Das Problem ist, dass updatedie Namenseingaben für die formMethode über festgelegt werden sollten , damit die Methode der Widget-Klasse funktioniert, $this->get_get_field_name('name_of_the_field');aber wp_category_checklistkein Argument zum Einrichten des Namens der Eingaben (Kontrollkästchen) enthält.

Verwendet wp_category_checklistjedoch eine Walker-Klasse, um die Kontrollkästchen zu drucken und anzupassen. Standardmäßig wird die Klasse verwendet Walker_Category_Checklistund die Methode, mit der die Kontrollkästchen gedruckt werden, lautet start_el.

Diese Methode hat keinen Filter zum Bearbeiten der Eingabenamen, aber wir können einen benutzerdefinierten Walker erstellen, der Parameter zum Einrichten des Namens akzeptiert. Wenn dieser Walker erweitert wird Walker_Category_Checklist, müssen wir nur die start_elMethode überschreiben (meistens vom Original kopieren).

Der 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>';
      }
}

Jetzt können wir wahrscheinlich in derselben Datei die Widget-Klasse schreiben:

/**
 * 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>';
    }

}

Registrieren Sie abschließend das Widget:

function TestCategoryWidgetInit() {
    register_widget( 'TestCategoryWidget' );
}

add_action( 'widgets_init', 'TestCategoryWidgetInit' );
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.