Opções de Widget Não está salvando

4

Estou tentando criar um widget de Postagens Recentes personalizado que aceita uma categoria, para mostrar apenas postagens nessa categoria. Estou tendo problemas para salvar as opções do widget. Fiz algumas depurações e descobri que na função de atualização, $new_instance contém apenas as opções de título e não via_cat. Aqui está o código para formulário e atualização:

    /**
     * Back-end widget form.
     *
     * @see WP_Widget::form()
     *
     * @param array $instance Previously saved values from database.
     */
    public function form($instance) {
        /* Set up some default widget settings. */
        $defaults = array( 'title' => '', 'via_cat' => 1);
        $instance = wp_parse_args( (array) $instance, $defaults );


        $cats = get_terms('category');
        $category_data = array();
        foreach ($cats as $cat) {
            $category_data[$cat->term_id] = $cat->name;
        }
?>
<p>
    <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
    <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>" />
</p>
<p>
    <label for="<?php echo $this->get_field_id('via_cat'); ?>"><?php _e( 'Category:' ); ?></label>
    <select id="<?php echo $this->get_field_id('via_cat'); ?>" name="<?php echo $this->get_field_id('via_cat'); ?>">
<?php
        foreach ($category_data as $id => $name) {
?>
        <option value="<?php echo $id; ?>"<?php echo $instance['via_cat'] == $id ? ' selected="selected"' : ''; ?>><?php echo $name; ?></option>
<?php
        }
?>
    </select>
</p>
<?php
    }



/**
 * Sanitize widget form values as they are saved.
 *
 * @see WP_Widget::update()
 *
 * @param array $new_instance Values just sent to be saved.
 * @param array $old_instance Previously saved values from database.
 *
 * @return array Updated safe values to be saved.
 */
function update( $new_instance, $old_instance ) {
    $instance = $old_instance;
    $instance['title'] = strip_tags( $new_instance['title'] );
    $instance['via_cat'] = $new_instance['via_cat'];

    return $instance;
}

Qualquer ajuda é apreciada.

    
por joeljoeljoel 06.04.2012 / 23:14

1 resposta

6

Seu problema é que você está chamando o método errado para gerar o atributo name. Deve ser $this->get_field_name('via_cat')

Além disso, você pode usar wp_dropdown_categories() , sem necessidade de reinventar a roda:

wp_dropdown_categories(array(
  'name'      => $this->get_field_name('via_cat'),
  'selected'  => (int)$instance['via_cat'],
));
    
por onetrickpony 06.04.2012 / 23:20