Opciones de widget No se guarda

4

Estoy intentando crear un widget personalizado de publicaciones recientes que acepta una categoría, para mostrar solo las publicaciones en esa categoría. Estoy teniendo problemas para guardar las opciones del widget. He realizado algunas tareas de depuración y he encontrado que en la función de actualización, $new_instance solo contiene las opciones de título y no via_cat. Aquí está el código para la forma y actualización:

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

Cualquier ayuda es apreciada.

    
pregunta joeljoeljoel 06.04.2012 - 23:14

1 respuesta

6

Su problema es que está llamando al método incorrecto para generar el atributo de nombre. Debería ser $this->get_field_name('via_cat')

Además, puedes usar wp_dropdown_categories() , no es necesario reinventar la rueda:

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

Lea otras preguntas en las etiquetas