Usando wp_category_checklist em um widget

8

Estou tentando usar wp_category_checklist em um widget para exibir uma lista de caixas de seleção que, quando salvas, permanecem marcadas. No momento, estou tendo um problema terrível para que eles salvem, tanto quanto sei que não está salvando (as caixas de seleção permanecem desmarcadas): -

Aqui está o código editado que tenho no 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
}

Alguma ideia? Entre em contato se precisar de mais alguma coisa.

Obrigado :)

Rhys Wynne
fonte

Respostas:

9

O problema é que, para que o updatemétodo da classe de widget funcione, as entradas de nome no formmétodo devem ser definidas via, $this->get_get_field_name('name_of_the_field');mas wp_category_checklistnão têm argumento para configurar o nome das entradas (caixas de seleção).

No entanto, wp_category_checklistusa uma classe walker para imprimir as caixas de seleção e permitir personalizá-las. Por padrão, a classe usada é Walker_Category_Checkliste o método que imprime as caixas de seleção é start_el.

Esse método não possui filtro para permitir a edição dos nomes de entrada, mas podemos criar um andador personalizado, que aceita parâmetros para configurar o nome. Se esse caminhante se estender Walker_Category_Checklist, precisamos substituir o start_elmétodo (principalmente a cópia do original).

O código:

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

Agora, provavelmente no mesmo arquivo, podemos escrever a classe do 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>';
    }

}

Por fim, registre o widget:

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

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