it-swarm.com.de

Verwenden von wp_category_checklist in einem Widget

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 es nicht spart (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 brauchen.

Vielen Dank :)

8
Rhys Wynne

Das Problem besteht darin, dass die Namenseingaben für die update-Methode der Widgetklasse über $this->get_get_field_name('name_of_the_field'); festgelegt werden sollten, aber wp_category_checklist kein Argument zum Einrichten des Namens der Eingaben (Kontrollkästchen) hat, damit die form-Methode funktioniert.

wp_category_checklist verwendet jedoch eine Walker-Klasse, um die Kontrollkästchen zu drucken und deren Anpassung zu ermöglichen. Standardmäßig wird die Klasse Walker_Category_Checklist verwendet, und die Methode, mit der die Kontrollkästchen gedruckt werden, ist start_el.

Diese Methode hat keinen Filter, mit dem die Eingabenamen bearbeitet werden können, aber wir können einen benutzerdefinierten Walker erstellen, der Parameter zum Einrichten des Namens akzeptiert. Wenn dieser Walker Walker_Category_Checklist erweitert, müssen wir nur die start_el-Methode überschreiben (meistens das Kopieren vom Original).

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

}

Zum Schluss registrieren Sie das Widget:

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

add_action( 'widgets_init', 'TestCategoryWidgetInit' );
9
gmazzap