protected function step_save()
 {
     $listing = $this->state->editing ? WPBDP_Listing::get($this->state->listing_id) : WPBDP_Listing::create($this->state);
     $listing->set_field_values($this->state->fields);
     $listing->set_images($this->state->images);
     $listing->set_thumbnail_id($this->state->thumbnail_id);
     if (!$this->state->editing) {
         // Generate payment for the listing.
         $payment = new WPBDP_Payment(array('listing_id' => $listing->get_id()));
         if (!$this->state->editing) {
             $payment->tag('initial');
         }
         foreach ($this->state->categories as $cat_id => $fee_id) {
             $category_info = $listing->get_category_info($cat_id);
             if (!$category_info) {
                 $fee = wpbdp_get_fee($fee_id);
                 if (!$fee) {
                     continue;
                 }
                 $payment->add_item($this->state->autorenew_fees ? 'recurring_fee' : 'fee', $fee->amount, sprintf(_x('Fee "%s" for category "%s"%s', 'listings', 'WPBDM'), $fee->label, wpbdp_get_term_name($cat_id), $this->state->autorenew_fees ? ' ' . _x('(recurring)', 'listings', 'WPBDM') : ''), array('fee_id' => $fee_id, 'fee_days' => $fee->days, 'fee_images' => $fee->images), $cat_id, $fee_id);
             }
         }
         if ($this->state->upgrade_to_sticky) {
             $payment->add_item('upgrade', wpbdp_get_option('featured-price'), _x('Listing upgrade to featured', 'submit', 'WPBDM'));
         }
         $payment->set_submit_state_id($this->state->id);
         if (current_user_can('administrator')) {
             $payment->set_status(WPBDP_Payment::STATUS_COMPLETED);
         }
         $payment->save();
         $this->state->listing_id = $listing->get_id();
         $this->state->payment_id = $payment->get_id();
     }
     do_action_ref_array('wpbdp_listing_form_extra_sections_save', array(&$this->state));
     $listing->save();
     $listing->set_post_status($this->state->editing ? wpbdp_get_option('edit-post-status') : wpbdp_get_option('new-post-status'));
     $this->state->advance(false);
     // This step is 'invisible'.
     return $this->dispatch();
 }
 private function import_row($data)
 {
     global $wpdb;
     global $wpbdp;
     if ($this->settings['test-import']) {
         return;
     }
     extract($data);
     $state = (object) array('fields' => array(), 'images' => array(), 'categories' => array());
     $errors = array();
     // Create categories.
     foreach ($categories as &$c) {
         if ($c['term_id']) {
             $state->categories[] = intval($c['term_id']);
             continue;
         }
         if ($t = term_exists(str_replace('&', '&', $c['name']), WPBDP_CATEGORY_TAX)) {
             $c['term_id'] = $t['term_id'];
         } else {
             if ($t = wp_insert_term(str_replace('&', '&', $c['name']), WPBDP_CATEGORY_TAX)) {
                 $c['term_id'] = $t['term_id'];
             } else {
                 $errors[] = sprintf(_x('Could not create listing category "%s"', 'admin csv-import', 'WPBDM'), $c['name']);
             }
         }
         if ($c['term_id']) {
             $state->categories[] = intval($c['term_id']);
         }
     }
     $listing_id = 0;
     // Support sequence_id.
     if ($meta['sequence_id']) {
         $listing_id = intval($wpdb->get_var($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = %s AND meta_value = %s LIMIT 1", '_wpbdp[import_sequence_id]', $meta['sequence_id'])));
         if (WPBDP_POST_TYPE != get_post_type($listing_id)) {
             $listing_id = 0;
         }
     }
     // Handle fields.
     foreach ($fields as $field_id => $field_data) {
         $f = wpbdp_get_form_field($field_id);
         if ('image' != $f->get_field_type_id()) {
             continue;
         }
         $img = trim($field_data);
         if (!$img) {
             continue;
         }
         $media_id = $this->upload_image($img);
         $fields[$field_id] = $media_id ? $media_id : '';
     }
     $state->fields = $fields;
     // Handle images.
     foreach ($data['images'] as $filename) {
         if ($img_id = $this->upload_image($filename)) {
             $state->images[] = $img_id;
         }
     }
     // Insert or update listing.
     if ($listing_id) {
         $listing = WPBDP_Listing::get($listing_id);
         $listing->update($state);
         $listing->set_post_status(wpbdp_get_option('edit-post-status'));
     } else {
         $listing = WPBDP_Listing::create($state);
         $listing->set_field_values($state->fields);
         $listing->set_images($state->images);
         $listing->set_categories($state->categories);
         $listing->set_post_status($this->settings['post-status']);
         $listing->save();
     }
     // Set username.
     if ($u = get_user_by('login', $meta['username'])) {
         wp_update_post(array('ID' => $listing->get_id(), 'post_author' => $u->ID));
     }
     // Set featured level.
     if ($meta['featured_level']) {
         if ($l = $wpbdp->listings->upgrades->get($meta['featured_level'])) {
             $wpbdp->listings->upgrades->set_sticky($listing->get_id(), $l->id);
         }
     }
     // Create permalink.
     $post = get_post($listing->get_id());
     wp_update_post(array('ID' => $post->ID, 'post_name' => wp_unique_post_slug(sanitize_title($post->post_title), $post->ID, $post->post_status, $post->post_type, $post->post_parent)));
     // Update expiration dates.
     foreach ($categories as $c) {
         if (!$c['expires_on']) {
             continue;
         }
         $wpdb->update($wpdb->prefix . 'wpbdp_listing_fees', array('expires_on' => $c['expires_on']), array('category_id' => $c['term_id'], 'listing_id' => $listing->get_id()));
     }
     // Update sequence_id.
     if ($meta['sequence_id']) {
         update_post_meta($listing->get_id(), '_wpbdp[import_sequence_id]', $meta['sequence_id']);
     }
     if ($errors) {
         $error = new WP_Error();
         foreach ($errors as $e) {
             $error->add('listing-add-error', $e);
         }
         return $error;
     }
     return $listing->get_id();
 }