Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I am trying to create a custom Recent Posts widget that accepts a category, to show only posts in that category. I'm having trouble saving the widget options. I've done some debugging and found that in the update function, $new_instance only contains the title options and not via_cat. Here's the code for form and update:

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

Any help is appreciated.

share|improve this question
add comment

1 Answer

up vote 3 down vote accepted

Your problem is that you're calling the wrong method for generating the name attribute. It should be $this->get_field_name('via_cat')

Also, you can use wp_dropdown_categories(), no need to reinvent the wheel:

wp_dropdown_categories(array(
  'name'      => $this->get_field_name('via_cat'),
  'selected'  => (int)$instance['via_cat'],
));
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.