Пример #1
0
 /**
  * Add or edit a single pod item
  *
  * $params['pod'] string The Pod name (pod or pod_id is required)
  * $params['pod_id'] string The Pod ID (pod or pod_id is required)
  * $params['id'] int The item ID
  * $params['data'] array (optional) Associative array of field names + values
  * $params['bypass_helpers'] bool Set to true to bypass running pre-save and post-save helpers
  * $params['track_changed_fields'] bool Set to true to enable tracking of saved fields via PodsAPI::get_changed_fields()
  *
  * @param array|object $params An associative array of parameters
  *
  * @return int The item ID
  *
  * @since 1.7.9
  */
 public function save_pod_item($params)
 {
     global $wpdb;
     $params = (object) pods_str_replace('@wp_', '{prefix}', $params);
     $tableless_field_types = PodsForm::tableless_field_types();
     $repeatable_field_types = PodsForm::repeatable_field_types();
     $simple_tableless_objects = PodsForm::simple_tableless_objects();
     // @deprecated 2.0
     if (isset($params->datatype)) {
         pods_deprecated('$params->pod instead of $params->datatype', '2.0');
         $params->pod = $params->datatype;
         unset($params->datatype);
         if (isset($params->pod_id)) {
             pods_deprecated('$params->id instead of $params->pod_id', '2.0');
             $params->id = $params->pod_id;
             unset($params->pod_id);
         }
         if (isset($params->data) && !empty($params->data) && is_array($params->data)) {
             $check = current($params->data);
             if (is_array($check)) {
                 pods_deprecated('PodsAPI::save_pod_items', '2.0');
                 return $this->save_pod_items($params, $params->data);
             }
         }
     }
     // @deprecated 2.0
     if (isset($params->tbl_row_id)) {
         pods_deprecated('$params->id instead of $params->tbl_row_id', '2.0');
         $params->id = $params->tbl_row_id;
         unset($params->tbl_row_id);
     }
     // @deprecated 2.0
     if (isset($params->columns)) {
         pods_deprecated('$params->data instead of $params->columns', '2.0');
         $params->data = $params->columns;
         unset($params->columns);
     }
     if (!isset($params->pod)) {
         $params->pod = false;
     }
     if (isset($params->pod_id)) {
         $params->pod_id = pods_absint($params->pod_id);
     } else {
         $params->pod_id = 0;
     }
     if (isset($params->id)) {
         $params->id = pods_absint($params->id);
     } else {
         $params->id = 0;
     }
     if (!isset($params->from)) {
         $params->from = 'save';
     }
     if (!isset($params->location)) {
         $params->location = null;
     }
     if (!isset($params->track_changed_fields)) {
         $params->track_changed_fields = false;
     }
     /**
      * Override $params['track_changed_fields']
      *
      * Use for globally setting field change tracking.
      *
      * @param bool
      *
      * @since 2.3.19
      */
     $track_changed_fields = apply_filters('pods_api_save_pod_item_track_changed_fields_' . $params->pod, (bool) $params->track_changed_fields, $params);
     $changed_fields = array();
     if (!isset($params->clear_slug_cache)) {
         $params->clear_slug_cache = true;
     }
     // Support for bulk edit
     if (isset($params->id) && !empty($params->id) && is_array($params->id)) {
         $ids = array();
         $new_params = $params;
         foreach ($params->id as $id) {
             $new_params->id = $id;
             $ids[] = $this->save_pod_item($new_params);
         }
         return $ids;
     }
     // Allow Helpers to know what's going on, are we adding or saving?
     $is_new_item = false;
     if (empty($params->id)) {
         $is_new_item = true;
     }
     if (isset($params->is_new_item)) {
         $is_new_item = (bool) $params->is_new_item;
     }
     // Allow Helpers to bypass subsequent helpers in recursive save_pod_item calls
     $bypass_helpers = false;
     if (isset($params->bypass_helpers) && false !== $params->bypass_helpers) {
         $bypass_helpers = true;
     }
     // Allow Custom Fields not defined by Pods to be saved
     $allow_custom_fields = false;
     if (isset($params->allow_custom_fields) && false !== $params->allow_custom_fields) {
         $allow_custom_fields = true;
     }
     // Get array of Pods
     $pod = $this->load_pod(array('id' => $params->pod_id, 'name' => $params->pod, 'table_info' => true));
     if (false === $pod) {
         return pods_error(__('Pod not found', 'pods'), $this);
     }
     $params->pod = $pod['name'];
     $params->pod_id = $pod['id'];
     if ('settings' == $pod['type']) {
         $params->id = $pod['id'];
     }
     $fields = $pod['fields'];
     $object_fields = (array) pods_var_raw('object_fields', $pod, array(), null, true);
     $fields_active = array();
     $custom_data = array();
     // Find the active fields (loop through $params->data to retain order)
     if (!empty($params->data) && is_array($params->data)) {
         $custom_fields = array();
         foreach ($params->data as $field => $value) {
             if (isset($object_fields[$field])) {
                 $object_fields[$field]['value'] = $value;
                 $fields_active[] = $field;
             } elseif (isset($fields[$field])) {
                 if ('save' == $params->from || true === PodsForm::permission($fields[$field]['type'], $field, $fields[$field], $fields, $pod, $params->id, $params)) {
                     $fields[$field]['value'] = $value;
                     $fields_active[] = $field;
                 } elseif (!pods_has_permissions($fields[$field]['options']) && pods_var('hidden', $fields[$field]['options'], false)) {
                     $fields[$field]['value'] = $value;
                     $fields_active[] = $field;
                 }
             } else {
                 $found = false;
                 foreach ($object_fields as $object_field => $object_field_opt) {
                     if (in_array($field, $object_field_opt['alias'])) {
                         $object_fields[$object_field]['value'] = $value;
                         $fields_active[] = $object_field;
                         $found = true;
                         break;
                     }
                 }
                 if ($allow_custom_fields && !$found) {
                     $custom_fields[] = $field;
                 }
             }
         }
         if ($allow_custom_fields && !empty($custom_fields)) {
             foreach ($custom_fields as $field) {
                 $custom_data[$field] = $params->data[$field];
             }
         }
         if ($pod['type'] === 'taxonomy' && isset($params->data) && !empty($params->data)) {
             $term_data = $params->data;
         }
         unset($params->data);
     }
     if (empty($params->id) && !in_array('created', $fields_active) && isset($fields['created']) && in_array($fields['created']['type'], array('date', 'datetime'))) {
         $fields['created']['value'] = current_time('mysql');
         $fields_active[] = 'created';
     }
     if (!in_array('modified', $fields_active) && isset($fields['modified']) && in_array($fields['modified']['type'], array('date', 'datetime'))) {
         $fields['modified']['value'] = current_time('mysql');
         $fields_active[] = 'modified';
     }
     if (in_array($pod['type'], array('pod', 'table')) && empty($params->id) && !empty($pod['pod_field_index']) && in_array($pod['pod_field_index'], $fields_active) && !in_array($pod['pod_field_slug'], $fields_active) && isset($fields[$pod['pod_field_slug']])) {
         $fields[$pod['pod_field_slug']]['value'] = '';
         // this will get picked up by slug pre_save method
         $fields_active[] = $pod['pod_field_slug'];
     }
     // Handle hidden fields
     if (empty($params->id)) {
         foreach ($fields as $field => $field_data) {
             if (in_array($field, $fields_active)) {
                 continue;
             }
             if (in_array($params->from, array('save', 'process_form')) || true === PodsForm::permission($fields[$field]['type'], $field, $fields[$field], $fields, $pod, $params->id, $params)) {
                 $value = PodsForm::default_value(pods_var_raw($field, 'post'), $field_data['type'], $field, pods_var_raw('options', $field_data, $field_data, null, true), $pod, $params->id);
                 if (null !== $value && '' !== $value && false !== $value) {
                     $fields[$field]['value'] = $value;
                     $fields_active[] = $field;
                 }
             }
         }
         // Set default field values for object fields
         if (!empty($object_fields)) {
             foreach ($object_fields as $field => $field_data) {
                 if (in_array($field, $fields_active)) {
                     continue;
                 } elseif (!isset($field_data['default']) || strlen($field_data['default']) < 1) {
                     continue;
                 }
                 $value = PodsForm::default_value(pods_var_raw($field, 'post'), $field_data['type'], $field, pods_var_raw('options', $field_data, $field_data, null, true), $pod, $params->id);
                 if (null !== $value && '' !== $value && false !== $value) {
                     $object_fields[$field]['value'] = $value;
                     $fields_active[] = $field;
                 }
             }
         }
         // Set default field values for Pod fields
         foreach ($fields as $field => $field_data) {
             if (in_array($field, $fields_active)) {
                 continue;
             } elseif (!isset($field_data['default']) || strlen($field_data['default']) < 1) {
                 continue;
             }
             $value = PodsForm::default_value(pods_var_raw($field, 'post'), $field_data['type'], $field, pods_var_raw('options', $field_data, $field_data, null, true), $pod, $params->id);
             if (null !== $value && '' !== $value && false !== $value) {
                 $fields[$field]['value'] = $value;
                 $fields_active[] = $field;
             }
         }
     }
     $columns =& $fields;
     // @deprecated 2.0
     $active_columns =& $fields_active;
     // @deprecated 2.0
     $params->tbl_row_id =& $params->id;
     // @deprecated 2.0
     $pre_save_helpers = $post_save_helpers = array();
     $pieces = array('fields', 'params', 'pod', 'fields_active', 'object_fields', 'custom_fields', 'custom_data', 'track_changed_fields', 'changed_fields');
     if (false === $bypass_helpers) {
         // Plugin hooks
         $hooked = $this->do_hook('pre_save_pod_item', compact($pieces), $is_new_item, $params->id);
         if (is_array($hooked) && !empty($hooked)) {
             extract($hooked);
         }
         $hooked = $this->do_hook("pre_save_pod_item_{$params->pod}", compact($pieces), $is_new_item, $params->id);
         if (is_array($hooked) && !empty($hooked)) {
             extract($hooked);
         }
         if ($is_new_item) {
             $hooked = $this->do_hook('pre_create_pod_item', compact($pieces));
             if (is_array($hooked) && !empty($hooked)) {
                 extract($hooked);
             }
             $hooked = $this->do_hook("pre_create_pod_item_{$params->pod}", compact($pieces));
             if (is_array($hooked) && !empty($hooked)) {
                 extract($hooked);
             }
         } else {
             $hooked = $this->do_hook('pre_edit_pod_item', compact($pieces), $params->id);
             if (is_array($hooked) && !empty($hooked)) {
                 extract($hooked);
             }
             $hooked = $this->do_hook("pre_edit_pod_item_{$params->pod}", compact($pieces), $params->id);
             if (is_array($hooked) && !empty($hooked)) {
                 extract($hooked);
             }
         }
         // Call any pre-save helpers (if not bypassed)
         if (!defined('PODS_DISABLE_EVAL') || !PODS_DISABLE_EVAL) {
             if (!empty($pod['options']) && is_array($pod['options'])) {
                 $helpers = array('pre_save_helpers', 'post_save_helpers');
                 foreach ($helpers as $helper) {
                     if (isset($pod['options'][$helper]) && !empty($pod['options'][$helper])) {
                         ${$helper} = explode(',', $pod['options'][$helper]);
                     }
                 }
             }
             if (!empty($pre_save_helpers)) {
                 pods_deprecated(sprintf(__('Pre-save helpers are deprecated, use the action pods_pre_save_pod_item_%s instead', 'pods'), $params->pod), '2.0');
                 foreach ($pre_save_helpers as $helper) {
                     $helper = $this->load_helper(array('name' => $helper));
                     if (false !== $helper) {
                         eval('?>' . $helper['code']);
                     }
                 }
             }
         }
     }
     if ($track_changed_fields) {
         $changed_fields = $this->get_changed_fields(compact($pieces));
     }
     $table_data = $table_formats = $update_values = $rel_fields = $rel_field_ids = array();
     $object_type = $pod['type'];
     $object_ID = 'ID';
     if ('comment' == $object_type) {
         $object_ID = 'comment_ID';
     }
     $object_data = $object_meta = $post_term_data = array();
     if ('settings' == $object_type) {
         $object_data['option_id'] = $pod['name'];
     } elseif (!empty($params->id)) {
         $object_data[$object_ID] = $params->id;
     }
     $fields_active = array_unique($fields_active);
     // Loop through each active field, validating and preparing the table data
     foreach ($fields_active as $field) {
         if (isset($object_fields[$field])) {
             $field_data = $object_fields[$field];
         } elseif (isset($fields[$field])) {
             $field_data = $fields[$field];
         } else {
             continue;
         }
         $value = $field_data['value'];
         $type = $field_data['type'];
         $options = pods_var('options', $field_data, array());
         // WPML AJAX compatibility
         if (is_admin() && isset($_GET['page']) && false !== strpos($_GET['page'], '/menu/languages.php') && isset($_POST['icl_ajx_action']) && isset($_POST['_icl_nonce']) && wp_verify_nonce($_POST['_icl_nonce'], $_POST['icl_ajx_action'] . '_nonce')) {
             $options['unique'] = $fields[$field]['options']['unique'] = $options['required'] = $fields[$field]['options']['required'] = 0;
         } else {
             // Validate value
             $validate = $this->handle_field_validation($value, $field, $object_fields, $fields, $pod, $params);
             if (false === $validate) {
                 $validate = sprintf(__('There was an issue validating the field %s', 'pods'), $field_data['label']);
             } elseif (true !== $validate) {
                 $validate = (array) $validate;
             }
             if (!is_bool($validate) && !empty($validate)) {
                 return pods_error($validate, $this);
             }
         }
         $value = PodsForm::pre_save($field_data['type'], $value, $params->id, $field, array_merge($field_data, $options), array_merge($fields, $object_fields), $pod, $params);
         $field_data['value'] = $value;
         if (isset($object_fields[$field])) {
             if ('taxonomy' == $object_fields[$field]['type']) {
                 $post_term_data[$field] = $value;
             } else {
                 $object_data[$field] = $value;
             }
         } else {
             $simple = 'pick' == $type && in_array(pods_var('pick_object', $field_data), $simple_tableless_objects);
             $simple = (bool) $this->do_hook('tableless_custom', $simple, $field_data, $field, $fields, $pod, $params);
             // Handle Simple Relationships
             if ($simple) {
                 if (!is_array($value)) {
                     $value = explode(',', $value);
                 }
                 $pick_limit = (int) pods_var_raw('pick_limit', $options, 0);
                 if ('single' == pods_var_raw('pick_format_type', $options)) {
                     $pick_limit = 1;
                 }
                 if ('custom-simple' == pods_var('pick_object', $field_data)) {
                     $custom = pods_var_raw('pick_custom', $options, '');
                     $custom = apply_filters('pods_form_ui_field_pick_custom_values', $custom, $field_data['name'], $value, array_merge($field_data, $options), $pod, $params->id);
                     if (empty($value) || empty($custom)) {
                         $value = '';
                     } elseif (!empty($custom)) {
                         if (!is_array($custom)) {
                             $custom = explode("\n", $custom);
                             $custom_values = array();
                             foreach ($custom as $c => $cv) {
                                 if (0 < strlen($cv)) {
                                     $custom_label = explode('|', $cv);
                                     if (!isset($custom_label[1])) {
                                         $custom_label[1] = $custom_label[0];
                                     }
                                     $custom_label[0] = trim((string) $custom_label[0]);
                                     $custom_label[1] = trim((string) $custom_label[1]);
                                     $custom_values[$custom_label[0]] = $custom_label[1];
                                 }
                             }
                         } else {
                             $custom_values = $custom;
                         }
                         $values = array();
                         foreach ($value as $k => $v) {
                             $v = pods_unsanitize($v);
                             if (isset($custom_values[$v])) {
                                 $values[$k] = $v;
                             }
                         }
                         $value = $values;
                     }
                 }
                 if (0 < $pick_limit && !empty($value)) {
                     $value = array_slice($value, 0, $pick_limit);
                 }
                 // Don't save an empty array, just make it an empty string
                 if (empty($value)) {
                     $value = '';
                 } elseif (is_array($value)) {
                     // If there's just one item, don't save as an array, save the string
                     if (1 == $pick_limit || 1 == count($value)) {
                         $value = implode('', $value);
                     } elseif ('table' == pods_var('storage', $pod)) {
                         $value = version_compare(PHP_VERSION, '5.4.0', '>=') ? json_encode($value, JSON_UNESCAPED_UNICODE) : json_encode($value);
                     }
                 }
             }
             // Prepare all table / meta data
             if (!in_array($type, $tableless_field_types) || $simple) {
                 if (in_array($type, $repeatable_field_types) && 1 == pods_var($type . '_repeatable', $field_data, 0)) {
                     // Don't save an empty array, just make it an empty string
                     if (empty($value)) {
                         $value = '';
                     } elseif (is_array($value)) {
                         // If there's just one item, don't save as an array, save the string
                         if (1 == count($value)) {
                             $value = implode('', $value);
                         } elseif ('table' == pods_var('storage', $pod)) {
                             $value = version_compare(PHP_VERSION, '5.4.0', '>=') ? json_encode($value, JSON_UNESCAPED_UNICODE) : json_encode($value);
                         }
                     }
                 }
                 $table_data[$field] = str_replace(array('{prefix}', '@wp_'), array('{/prefix/}', '{prefix}'), $value);
                 // Fix for pods_query
                 $table_formats[] = PodsForm::prepare($type, $options);
                 $object_meta[$field] = $value;
             } else {
                 // Convert values from a comma-separated string into an array
                 if (!is_array($value)) {
                     $value = explode(',', $value);
                 }
                 $rel_fields[$type][$field] = $value;
                 $rel_field_ids[] = $field_data['id'];
             }
         }
     }
     if ('post_type' == $pod['type']) {
         $post_type = $pod['name'];
         if (!empty($pod['object'])) {
             $post_type = $pod['object'];
         }
         $object_data['post_type'] = $post_type;
     }
     if (('meta' == $pod['storage'] || 'settings' == $pod['type']) && !in_array($pod['type'], array('taxonomy', 'pod', 'table', ''))) {
         if ($allow_custom_fields && !empty($custom_data)) {
             $object_meta = array_merge($custom_data, $object_meta);
         }
         $fields_to_send = array_flip(array_keys($object_meta));
         foreach ($fields_to_send as $field => $field_data) {
             if (isset($object_fields[$field])) {
                 $field_data = $object_fields[$field];
             } elseif (isset($fields[$field])) {
                 $field_data = $fields[$field];
             } else {
                 unset($fields_to_send[$field]);
             }
             $fields_to_send[$field] = $field_data;
         }
         $params->id = $this->save_wp_object($object_type, $object_data, $object_meta, false, true, $fields_to_send);
         if (!empty($params->id) && 'settings' == $object_type) {
             $params->id = $pod['id'];
         }
     } else {
         if (!in_array($pod['type'], array('taxonomy', 'pod', 'table', ''))) {
             $params->id = $this->save_wp_object($object_type, $object_data, array(), false, true);
         } elseif ('taxonomy' == $pod['type']) {
             $term = pods_v($object_fields['name']['name'], $object_data, '', null, true);
             if (!isset($term_data)) {
                 $term_data = array();
             }
             if (empty($params->id) || !empty($term_data)) {
                 $taxonomy = $pod['name'];
                 if (!empty($pod['object'])) {
                     $taxonomy = $pod['object'];
                 }
                 $params->id = $this->save_term($params->id, $term, $taxonomy, $term_data, true);
             }
         }
         if ('table' == $pod['storage']) {
             // Every row should have an id set here, otherwise Pods with nothing
             // but relationship fields won't get properly ID'd
             if (empty($params->id)) {
                 $params->id = 0;
             }
             $table_data = array('id' => $params->id) + $table_data;
             array_unshift($table_formats, '%d');
             if (!empty($table_data)) {
                 $sql = pods_data()->insert_on_duplicate("@wp_pods_{$params->pod}", $table_data, $table_formats);
                 $id = pods_query($sql, 'Cannot add/save table row');
                 if (empty($params->id)) {
                     $params->id = $id;
                 }
             }
         }
     }
     $params->id = (int) $params->id;
     // Save terms for taxonomies associated to a post type
     if (0 < $params->id && 'post_type' == $pod['type'] && !empty($post_term_data)) {
         foreach ($post_term_data as $post_taxonomy => $post_terms) {
             $post_terms = (array) $post_terms;
             foreach ($post_terms as $k => $v) {
                 if (!preg_match('/[^0-9]/', $v)) {
                     $v = (int) $v;
                 }
                 $post_terms[$k] = $v;
             }
             wp_set_object_terms($params->id, $post_terms, $post_taxonomy);
         }
     }
     $no_conflict = pods_no_conflict_check($pod['type']);
     if (!$no_conflict) {
         pods_no_conflict_on($pod['type']);
     }
     // Save relationship / file data
     if (!empty($rel_fields)) {
         foreach ($rel_fields as $type => $data) {
             // Only handle tableless fields
             if (!in_array($type, $tableless_field_types)) {
                 continue;
             }
             foreach ($data as $field => $values) {
                 $pick_val = pods_var('pick_val', $fields[$field]);
                 if ('table' == pods_var('pick_object', $fields[$field])) {
                     $pick_val = pods_var('pick_table', $fields[$field]['options'], $pick_val, null, true);
                 }
                 if ('__current__' == $pick_val) {
                     if (is_object($pod)) {
                         $pick_val = $pod->pod;
                     } elseif (is_array($pod)) {
                         $pick_val = $pod['name'];
                     } elseif (0 < strlen($pod)) {
                         $pick_val = $pod;
                     }
                 }
                 $fields[$field]['options']['table_info'] = pods_api()->get_table_info(pods_var('pick_object', $fields[$field]), $pick_val, null, null, $fields[$field]['options']);
                 if (isset($fields[$field]['options']['table_info']['pod']) && !empty($fields[$field]['options']['table_info']['pod']) && isset($fields[$field]['options']['table_info']['pod']['name'])) {
                     $search_data = pods($fields[$field]['options']['table_info']['pod']['name']);
                     $data_mode = 'pods';
                 } else {
                     $search_data = pods_data();
                     $search_data->table($fields[$field]['options']['table_info']);
                     $data_mode = 'data';
                 }
                 $find_rel_params = array('select' => "`t`.`{$search_data->field_id}`", 'where' => "`t`.`{$search_data->field_slug}` = %s OR `t`.`{$search_data->field_index}` = %s", 'limit' => 1, 'pagination' => false, 'search' => false);
                 if (empty($search_data->field_slug) && !empty($search_data->field_index)) {
                     $find_rel_params['where'] = "`t`.`{$search_data->field_index}` = %s";
                 } elseif (empty($search_data->field_slug) && empty($search_data->field_index)) {
                     $find_rel_params = false;
                 }
                 $related_limit = (int) pods_var_raw($type . '_limit', $fields[$field]['options'], 0);
                 if ('single' == pods_var_raw($type . '_format_type', $fields[$field]['options'])) {
                     $related_limit = 1;
                 }
                 // Enforce integers / unique values for IDs
                 $value_ids = array();
                 $is_file_field = in_array($type, PodsForm::file_field_types());
                 $is_taggable = in_array($type, PodsForm::tableless_field_types()) && 1 == pods_v($type . '_taggable', $fields[$field]['options']);
                 // @todo Handle simple relationships eventually
                 foreach ($values as $v) {
                     if (!empty($v)) {
                         if (!is_array($v)) {
                             if (!preg_match('/[^0-9]/', $v)) {
                                 $v = (int) $v;
                             } elseif ($is_file_field) {
                                 // Get ID from GUID
                                 $v = pods_image_id_from_field($v);
                                 // If file not found, add it
                                 if (empty($v)) {
                                     $v = pods_attachment_import($v);
                                 }
                             } else {
                                 $v_data = false;
                                 if (false !== $find_rel_params) {
                                     $rel_params = $find_rel_params;
                                     $rel_params['where'] = $wpdb->prepare($rel_params['where'], array($v, $v));
                                     $search_data->select($rel_params);
                                     $v_data = $search_data->fetch($v);
                                 }
                                 if (!empty($v_data) && isset($v_data[$search_data->field_id])) {
                                     $v = (int) $v_data[$search_data->field_id];
                                 } elseif ($is_taggable && 'pods' == $data_mode) {
                                     $tag_data = array($search_data->field_index => $v);
                                     if ('post_type' == $search_data->pod_data['type']) {
                                         $tag_data['post_status'] = 'publish';
                                     }
                                     /**
                                      * Filter for changing tag before adding new item.
                                      *
                                      * @param array $tag_data Fields for creating new item.
                                      * @param int $v Field ID of tag.
                                      * @param obj $search_data Search object for tag.
                                      * @param string $field Table info for field.
                                      * @param array	$pieces Field array.
                                      *
                                      * @since 2.3.19
                                      */
                                     $tag_data = apply_filters('pods_api_save_pod_item_taggable_data', $tag_data, $v, $search_data, $field, compact($pieces));
                                     // Save $v to a new item on related object
                                     $v = $search_data->add($tag_data);
                                     // @todo Support non-Pods for tagging
                                 }
                             }
                         } elseif ($is_file_field && isset($v['id'])) {
                             $v = (int) $v['id'];
                         } else {
                             continue;
                         }
                         if (!empty($v) && !in_array($v, $value_ids)) {
                             $value_ids[] = $v;
                         }
                     }
                 }
                 $value_ids = array_unique(array_filter($value_ids));
                 // Limit values
                 if (0 < $related_limit && !empty($value_ids)) {
                     $value_ids = array_slice($value_ids, 0, $related_limit);
                 }
                 // Get current values
                 if ('pick' == $type && isset(PodsField_Pick::$related_data[$fields[$field]['id']]) && isset(PodsField_Pick::$related_data[$fields[$field]['id']]['current_ids'])) {
                     $related_ids = PodsField_Pick::$related_data[$fields[$field]['id']]['current_ids'];
                 } else {
                     $related_ids = $this->lookup_related_items($fields[$field]['id'], $pod['id'], $params->id, $fields[$field], $pod);
                 }
                 // Get ids to remove
                 $remove_ids = array_diff($related_ids, $value_ids);
                 // Delete relationships
                 if (!empty($remove_ids)) {
                     $this->delete_relationships($params->id, $remove_ids, $pod, $fields[$field]);
                 }
                 // Save relationships
                 if (!empty($value_ids)) {
                     $this->save_relationships($params->id, $value_ids, $pod, $fields[$field]);
                 }
                 // Run save function for field type (where needed)
                 PodsForm::save($type, $values, $params->id, $field, array_merge($fields[$field], $fields[$field]['options']), array_merge($fields, $object_fields), $pod, $params);
             }
             // Unset data no longer needed
             if ('pick' == $type) {
                 foreach ($data as $field => $values) {
                     if (isset(PodsField_Pick::$related_data[$fields[$field]['id']])) {
                         unset(PodsField_Pick::$related_data[PodsField_Pick::$related_data[$fields[$field]['id']]['related_field']['id']]);
                         unset(PodsField_Pick::$related_data[$fields[$field]['id']]);
                     }
                 }
             }
         }
     }
     if (!$no_conflict) {
         pods_no_conflict_off($pod['type']);
     }
     if (false === $bypass_helpers) {
         $pieces = compact($pieces);
         // Plugin hooks
         $this->do_hook('post_save_pod_item', $pieces, $is_new_item, $params->id);
         $this->do_hook("post_save_pod_item_{$params->pod}", $pieces, $is_new_item, $params->id);
         if ($is_new_item) {
             $this->do_hook('post_create_pod_item', $pieces, $params->id);
             $this->do_hook("post_create_pod_item_{$params->pod}", $pieces, $params->id);
         } else {
             $this->do_hook('post_edit_pod_item', $pieces, $params->id);
             $this->do_hook("post_edit_pod_item_{$params->pod}", $pieces, $params->id);
         }
         // Call any post-save helpers (if not bypassed)
         if (!defined('PODS_DISABLE_EVAL') || !PODS_DISABLE_EVAL) {
             if (!empty($post_save_helpers)) {
                 pods_deprecated(sprintf(__('Post-save helpers are deprecated, use the action pods_post_save_pod_item_%s instead', 'pods'), $params->pod), '2.0');
                 foreach ($post_save_helpers as $helper) {
                     $helper = $this->load_helper(array('name' => $helper));
                     if (false !== $helper && (!defined('PODS_DISABLE_EVAL') || !PODS_DISABLE_EVAL)) {
                         eval('?>' . $helper['code']);
                     }
                 }
             }
         }
     }
     // Clear cache
     pods_cache_clear($params->id, 'pods_items_' . $pod['name']);
     if ($params->clear_slug_cache && !empty($pod['field_slug'])) {
         $slug = pods($pod['name'], $params->id)->field($pod['field_slug']);
         if (0 < strlen($slug)) {
             pods_cache_clear($slug, 'pods_items_' . $pod['name']);
         }
     }
     // Clear WP meta cache
     if (in_array($pod['type'], array('post_type', 'taxonomy', 'user', 'comment'))) {
         $meta_type = $pod['type'];
         if ('post_type' == $meta_type) {
             $meta_type = 'post';
         }
         wp_cache_delete($params->id, $meta_type . '_meta');
         wp_cache_delete($params->id, 'pods_' . $meta_type . '_meta');
     }
     // Success! Return the id
     return $params->id;
 }
/**
 * Get the Image URL for a specific image field
 *
 * @param array|int|string $image The image field array, ID, or guid
 * @param string|array $size Image size to use
 * @param int $default Default image to show if image not found, can be field array, ID, or guid
 * @param boolean $force Force generation of image (if custom size array provided)
 *
 * @return string Image URL or empty if image not found
 *
 * @since 2.0.5
 */
function pods_image_url($image, $size = 'thumbnail', $default = 0, $force = false)
{
    $url = '';
    $id = pods_image_id_from_field($image);
    $default = pods_image_id_from_field($default);
    if (0 < $id) {
        if ($force) {
            $full = wp_get_attachment_image_src($id, 'full');
            $src = wp_get_attachment_image_src($id, $size);
            if ('full' != $size && $full[0] == $src[0]) {
                pods_image_resize($id, $size);
            }
        }
        $src = wp_get_attachment_image_src($id, $size);
        if (!empty($src)) {
            $url = $src[0];
        } else {
            $attachment = get_post($id);
            if (!preg_match('!^image/!', get_post_mime_type($attachment))) {
                $url = wp_get_attachment_url($id);
            }
        }
    }
    if (empty($url) && 0 < $default) {
        if ($force) {
            $full = wp_get_attachment_image_src($default, 'full');
            $src = wp_get_attachment_image_src($default, $size);
            if ('full' != $size && $full[0] == $src[0]) {
                pods_image_resize($default, $size);
            }
        }
        $src = wp_get_attachment_image_src($default, $size);
        if (!empty($src)) {
            $url = $src[0];
        } else {
            $attachment = get_post($default);
            if (!preg_match('!^image/!', get_post_mime_type($attachment))) {
                $url = wp_get_attachment_url($default);
            }
        }
    }
    return $url;
}