/**
  * Evaluate custom field mapping data source
  *
  * @since 2.20
  *
  * @param	integer	post->ID of attachment
  * @param	string 	category/scope to evaluate against: custom_field_mapping or single_attachment_mapping
  * @param	array	data source specification ( name, *data_source, *keep_existing, *format, mla_column, quick_edit, bulk_edit, *meta_name, *option, no_null )
  * @param	array 	(optional) _wp_attachment_metadata, default NULL (use current postmeta database value)
  *
  * @return	string|array	data source value
  */
 private static function _evaluate_data_source($post_id, $category, $data_value, $attachment_metadata = NULL)
 {
     global $wpdb;
     static $upload_dir, $intermediate_sizes = NULL, $wp_attached_files = NULL, $wp_attachment_metadata = NULL;
     static $current_id = 0, $file_info = NULL, $parent_info = NULL, $references = NULL, $alt_text = NULL;
     if ('none' == $data_value['data_source']) {
         return '';
     }
     $data_source = $data_value['data_source'];
     /*
      * Do this once per page load; cache attachment metadata if mapping all attachments
      */
     if (NULL == $intermediate_sizes) {
         $upload_dir = wp_upload_dir();
         $upload_dir = $upload_dir['basedir'] . '/';
         $intermediate_sizes = get_intermediate_image_sizes();
         if ('custom_field_mapping' == $category) {
             if (!($table = _get_meta_table('post'))) {
                 $wp_attached_files = array();
                 $wp_attachment_metadata = array();
             } else {
                 $wp_attachment_metadata = $wpdb->get_results("SELECT post_id, meta_value FROM {$table} WHERE meta_key = '_wp_attachment_metadata'", OBJECT_K);
                 $wp_attached_files = $wpdb->get_results("SELECT post_id, meta_value FROM {$table} WHERE meta_key = '_wp_attached_file'", OBJECT_K);
             }
         }
         // custom_field_mapping, i.e., mapping all attachments
     }
     // first call after page load
     /*
      * Do this once per post. Simulate SQL results for $wp_attached_files and $wp_attachment_metadata.
      */
     if ($current_id != $post_id) {
         $current_id = $post_id;
         $parent_info = NULL;
         $references = NULL;
         $alt_text = NULL;
         if ('single_attachment_mapping' == $category) {
             $metadata = get_metadata('post', $post_id, '_wp_attached_file');
             if (isset($metadata[0])) {
                 $wp_attached_files = array($post_id => (object) array('post_id' => $post_id, 'meta_value' => $metadata[0]));
             } else {
                 $wp_attached_files = array();
             }
             if (NULL == $attachment_metadata) {
                 $metadata = get_metadata('post', $post_id, '_wp_attachment_metadata');
                 if (isset($metadata[0])) {
                     $attachment_metadata = $metadata[0];
                 }
             }
             if (empty($attachment_metadata)) {
                 $attachment_metadata = array();
             }
             $wp_attachment_metadata = array($post_id => (object) array('post_id' => $post_id, 'meta_value' => serialize($attachment_metadata)));
         }
         $file_info = MLAData_Source::_evaluate_file_information($upload_dir, $wp_attached_files, $wp_attachment_metadata, $post_id);
     }
     $size_info = array('file' => '', 'width' => '', 'height' => '');
     $match_count = preg_match('/(.+)\\[(.+)\\]/', $data_source, $matches);
     if (1 == $match_count) {
         $data_source = $matches[1] . '[size]';
         if (isset($file_info['sizes'][$matches[2]])) {
             $size_info = $file_info['sizes'][$matches[2]];
         }
     }
     $result = '';
     switch ($data_source) {
         case 'meta':
             $attachment_metadata = isset($wp_attachment_metadata[$post_id]->meta_value) ? maybe_unserialize($wp_attachment_metadata[$post_id]->meta_value) : array();
             $result = MLAData::mla_find_array_element($data_value['meta_name'], $attachment_metadata, $data_value['option'], $data_value['keep_existing']);
             break;
         case 'template':
             if (in_array($data_value['option'], array('single', 'export', 'array', 'multi'))) {
                 $default_option = 'array';
             } else {
                 $default_option = 'text';
             }
             /*
              * Go through the template and expand the non-prefixed elements
              * as Data Sources
              */
             $item_values = array();
             $placeholders = MLAData::mla_get_template_placeholders($data_value['meta_name'], $default_option);
             foreach ($placeholders as $key => $placeholder) {
                 if (empty($placeholder['prefix'])) {
                     $field_value = $data_value;
                     $field_value['data_source'] = $placeholder['value'];
                     $field_value['meta_name'] = '';
                     $field_value['option'] = $placeholder['option'];
                     $field_value['format'] = $placeholder['format'];
                     if (isset($placeholder['args'])) {
                         $field_value['args'] = $placeholder['args'];
                     }
                     $field_value = MLAData_Source::_evaluate_data_source($post_id, $category, $field_value, $attachment_metadata);
                     $item_values[$key] = MLAData::mla_apply_field_level_format($field_value, $placeholder);
                 }
                 // Data Source
             }
             // foreach placeholder
             /*
              * Now expand the template using the above Data Source values
              */
             $template = '[+template:' . $data_value['meta_name'] . '+]';
             $item_values = MLAData::mla_expand_field_level_parameters($template, NULL, $item_values, $post_id, $data_value['keep_existing'], $default_option);
             if ('array' == $default_option) {
                 $result = MLAData::mla_parse_array_template($template, $item_values);
                 $result = MLAData_Source::_evaluate_array_result($result, $data_value['option'], $data_value['keep_existing']);
             } else {
                 $result = MLAData::mla_parse_template($template, $item_values);
             }
             break;
         case 'parent':
             $data_source = 'post_parent';
             /* fallthru */
         /* fallthru */
         case 'ID':
         case 'post_id':
         case 'post_author':
         case 'post_parent':
         case 'menu_order':
         case 'comment_count':
             $result = absint(MLAData_Source::_evaluate_post_information($post_id, $category, $data_source));
             break;
         case 'alt_text':
             if (NULL == $alt_text) {
                 $metadata = get_metadata('post', $post_id, '_wp_attachment_image_alt');
                 if (is_array($metadata)) {
                     if (count($metadata) == 1) {
                         $alt_text = maybe_unserialize($metadata[0]);
                     } else {
                         $alt_text = array();
                         foreach ($metadata as $single_key => $single_value) {
                             $alt_text[$single_key] = maybe_unserialize($single_value);
                         }
                     }
                 }
             }
             if (!empty($alt_text)) {
                 $result = MLAData_Source::_evaluate_array_result($alt_text, $data_value['option'], $data_value['keep_existing']);
             }
             break;
         case 'mime_type':
             $data_source = 'post_mime_type';
             /* fallthru */
         /* fallthru */
         case 'post_date':
         case 'post_date_gmt':
         case 'post_content':
         case 'post_title':
         case 'post_excerpt':
         case 'post_status':
         case 'comment_status':
         case 'ping_status':
         case 'post_name':
         case 'post_modified':
         case 'post_modified_gmt':
         case 'post_content_filtered':
         case 'guid':
         case 'post_mime_type':
             $result = MLAData_Source::_evaluate_post_information($post_id, $category, $data_source);
             break;
         case 'absolute_path':
         case 'absolute_file_name':
         case 'base_file':
         case 'path':
         case 'file_name':
         case 'name_only':
         case 'extension':
         case 'width':
         case 'height':
         case 'orientation':
         case 'hwstring_small':
         case 'aperture':
         case 'credit':
         case 'camera':
         case 'caption':
         case 'created_timestamp':
         case 'copyright':
         case 'focal_length':
         case 'iso':
         case 'shutter_speed':
         case 'title':
             if (isset($file_info[$data_source])) {
                 $result = $file_info[$data_source];
             }
             break;
         case 'file_size':
             $filesize = @filesize($file_info['absolute_file_name_raw']);
             if (!(false === $filesize)) {
                 $result = $filesize;
             }
             break;
         case 'upload_date':
             $result = MLAData_Source::_evaluate_post_information($post_id, $category, 'post_date');
             break;
         case 'dimensions':
             $result = $file_info['width'] . 'x' . $file_info['height'];
             if ('x' == $result) {
                 $result = '';
             }
             break;
         case 'pixels':
             $result = absint((int) $file_info['width'] * (int) $file_info['height']);
             if (0 == $result) {
                 $result = '';
             } else {
                 $result = (string) $result;
             }
             break;
         case 'size_keys':
             $result = array();
             foreach ($file_info['sizes'] as $key => $value) {
                 $result[] = $key;
             }
             $result = MLAData_Source::_evaluate_array_result($result, $data_value['option'], $data_value['keep_existing']);
             break;
         case 'size_names':
             $result = array();
             foreach ($file_info['sizes'] as $key => $value) {
                 $result[] = $value['file'];
             }
             $result = MLAData_Source::_evaluate_array_result($result, $data_value['option'], $data_value['keep_existing']);
             break;
         case 'size_bytes':
             $result = array();
             foreach ($file_info['sizes'] as $key => $value) {
                 $filesize = @filesize($file_info['absolute_path_raw'] . $value['file']);
                 if (false === $filesize) {
                     $result[] = '?';
                 } else {
                     switch ($data_value['format']) {
                         case 'commas':
                             if (is_numeric($filesize)) {
                                 $filesize = number_format((double) $filesize);
                             }
                             break;
                         default:
                             // no change
                     }
                     // format
                     $result[] = $filesize;
                 }
             }
             $result = MLAData_Source::_evaluate_array_result($result, $data_value['option'], $data_value['keep_existing']);
             break;
         case 'size_pixels':
             $result = array();
             foreach ($file_info['sizes'] as $key => $value) {
                 $pixels = absint((int) $value['width'] * (int) $value['height']);
                 switch ($data_value['format']) {
                     case 'commas':
                         if (is_numeric($pixels)) {
                             $pixels = number_format((double) $pixels);
                         }
                         break;
                     default:
                         // no change
                 }
                 // format
                 $result[] = $pixels;
             }
             $result = MLAData_Source::_evaluate_array_result($result, $data_value['option'], $data_value['keep_existing']);
             break;
         case 'size_dimensions':
             $result = array();
             foreach ($file_info['sizes'] as $key => $value) {
                 $result[] = $value['width'] . 'x' . $value['height'];
             }
             $result = MLAData_Source::_evaluate_array_result($result, $data_value['option'], $data_value['keep_existing']);
             break;
         case 'size_name[size]':
             $result = $size_info['file'];
             break;
         case 'size_bytes[size]':
             $result = @filesize($file_info['absolute_path_raw'] . $size_info['file']);
             if (false === $result) {
                 $result = '?';
             }
             break;
         case 'size_pixels[size]':
             $result = absint((int) $size_info['width'] * (int) $size_info['height']);
             break;
         case 'size_dimensions[size]':
             $result = $size_info['width'] . 'x' . $size_info['height'];
             if ('x' == $result) {
                 $result = '';
             }
             break;
         case 'parent_date':
         case 'parent_type':
         case 'parent_title':
             if (is_null($parent_info)) {
                 $parent_info = MLAQuery::mla_fetch_attachment_parent_data(MLAData_Source::_evaluate_post_information($post_id, $category, 'post_parent'));
             }
             if (isset($parent_info[$data_source])) {
                 $result = $parent_info[$data_source];
             }
             break;
         case 'parent_issues':
             if (is_null($references)) {
                 $references = MLAQuery::mla_fetch_attachment_references($post_id, MLAData_Source::_evaluate_post_information($post_id, $category, 'post_parent'));
             }
             if (!empty($references['parent_errors'])) {
                 $result = $references['parent_errors'];
                 /*
                  * Remove (ORPHAN...
                  */
                 $orphan_certain = '(' . __('ORPHAN', 'media-library-assistant') . ')';
                 $orphan_possible = '(' . __('ORPHAN', 'media-library-assistant') . '?)';
                 if (false !== strpos($result, $orphan_certain)) {
                     $result = trim(substr($result, strlen($orphan_certain)));
                 } elseif (false !== strpos($result, $orphan_possible)) {
                     $result = trim(substr($result, strlen($orphan_possible)));
                 }
             }
             break;
         case 'reference_issues':
             if (is_null($references)) {
                 $references = MLAQuery::mla_fetch_attachment_references($post_id, MLAData_Source::_evaluate_post_information($post_id, $category, 'post_parent'));
             }
             if (!empty($references['parent_errors'])) {
                 $result = $references['parent_errors'];
             }
             break;
         case 'featured_in':
         case 'featured_in_title':
             if (is_null($references)) {
                 $references = MLAQuery::mla_fetch_attachment_references($post_id, MLAData_Source::_evaluate_post_information($post_id, $category, 'post_parent'));
             }
             if (!empty($references['features'])) {
                 $result = array();
                 foreach ($references['features'] as $ID => $value) {
                     if ('featured_in' == $data_source) {
                         $result[] = sprintf('%1$s (%2$s %3$d)', $value->post_title, $value->post_type, $ID);
                     } else {
                         $result[] = $value->post_title;
                     }
                 }
                 $result = MLAData_Source::_evaluate_array_result($result, $data_value['option'], $data_value['keep_existing']);
             } else {
                 $result = '';
             }
             break;
         case 'inserted_in':
         case 'inserted_in_title':
             if (is_null($references)) {
                 $references = MLAQuery::mla_fetch_attachment_references($post_id, MLAData_Source::_evaluate_post_information($post_id, $category, 'post_parent'));
             }
             if (!empty($references['inserts'])) {
                 $result = array();
                 foreach ($references['inserts'] as $base_file => $inserts) {
                     foreach ($inserts as $value) {
                         if ('inserted_in' == $data_source) {
                             $result[] = sprintf('%1$s (%2$s %3$d)', $value->post_title, $value->post_type, $value->ID);
                         } else {
                             $result[] = $value->post_title;
                         }
                     }
                 }
                 ksort($result);
                 $result = MLAData_Source::_evaluate_array_result($result, $data_value['option'], $data_value['keep_existing']);
             } else {
                 $result = '';
             }
             break;
         case 'gallery_in':
         case 'gallery_in_title':
             if (is_null($references)) {
                 $references = MLAQuery::mla_fetch_attachment_references($post_id, MLAData_Source::_evaluate_post_information($post_id, $category, 'post_parent'));
             }
             if (!empty($references['galleries'])) {
                 $result = array();
                 foreach ($references['galleries'] as $ID => $value) {
                     if ('gallery_in' == $data_source) {
                         $result[] = sprintf('%1$s (%2$s %3$d)', $value['post_title'], $value['post_type'], $ID);
                     } else {
                         $result[] = $value['post_title'];
                     }
                 }
                 $result = MLAData_Source::_evaluate_array_result($result, $data_value['option'], $data_value['keep_existing']);
             } else {
                 $result = '';
             }
             break;
         case 'mla_gallery_in':
         case 'mla_gallery_in_title':
             if (is_null($references)) {
                 $references = MLAQuery::mla_fetch_attachment_references($post_id, MLAData_Source::_evaluate_post_information($post_id, $category, 'post_parent'));
             }
             if (!empty($references['mla_galleries'])) {
                 $result = array();
                 foreach ($references['mla_galleries'] as $ID => $value) {
                     if ('mla_gallery_in' == $data_source) {
                         $result[] = sprintf('%1$s (%2$s %3$d)', $value['post_title'], $value['post_type'], $ID);
                     } else {
                         $result[] = $value['post_title'];
                     }
                 }
                 $result = MLAData_Source::_evaluate_array_result($result, $data_value['option'], $data_value['keep_existing']);
             } else {
                 $result = '';
             }
             break;
         default:
             $custom_value = apply_filters('mla_evaluate_custom_data_source', NULL, $post_id, $category, $data_value, $attachment_metadata);
             if (!is_null($custom_value)) {
                 return $custom_value;
             }
             return '';
     }
     // switch $data_source
     switch ($data_value['format']) {
         case 'raw':
             return $result;
         case 'commas':
             if (is_numeric($result)) {
                 $result = str_pad(number_format((double) $result), 15, ' ', STR_PAD_LEFT);
             }
             break;
         case 'native':
         default:
             /*
              * Make some numeric values sortable as strings, make all value non-empty
              */
             if (in_array($data_source, array('file_size', 'pixels', 'width', 'height'))) {
                 $result = str_pad($result, 15, ' ', STR_PAD_LEFT);
             } elseif (empty($result)) {
                 $result = ' ';
             }
     }
     // format
     return $result;
 }
 /**
  * Renders the MLA Gallery in meta box on the Edit Media page.
  * Declared public because it is a callback function.
  *
  * @since 0.80
  *
  * @param	object	current post
  *
  * @return	void	echoes the HTML markup for the meta box content
  */
 public static function mla_mla_gallery_in_handler($post)
 {
     if (is_null(self::$mla_references)) {
         self::$mla_references = MLAQuery::mla_fetch_attachment_references($post->ID, $post->post_parent);
     }
     $galleries = '';
     if (is_array(self::$mla_references)) {
         foreach (self::$mla_references['mla_galleries'] as $gallery_id => $gallery) {
             if ($gallery_id == $post->post_parent) {
                 $parent = __('PARENT', 'media-library-assistant') . ' ';
             } else {
                 $parent = '';
             }
             $galleries .= sprintf('%1$s (%2$s %3$s), %4$s', $parent, $gallery['post_type'], $gallery_id, $gallery['post_title']) . "\n";
         }
         // foreach $feature
     }
     $galleries = apply_filters('mla_mla_gallery_in_meta_box', array('galleries' => $galleries, 'rows' => 5, 'cols' => 80), self::$mla_references, $post);
     $html = '<label class="screen-reader-text" for="mla_mla_gallery_in">' . __('MLA Gallery in', 'media-library-assistant') . '</label><textarea class="readonly" id="mla_mla_gallery_in" rows="' . absint($galleries['rows']) . '" cols="' . absint($galleries['cols']) . '" readonly="readonly" name="mla_mla_gallery_in" >' . esc_textarea($galleries['galleries']) . "</textarea>\n";
     echo apply_filters('mla_mla_gallery_in_meta_box_html', $html, $galleries, self::$mla_references, $post);
 }
Beispiel #3
0
 /**
  * Update a single item; change the "post" data, taxonomy terms 
  * and meta data for a single attachment
  * 
  * @since 0.1
  * 
  * @param	int		The ID of the attachment to be updated
  * @param	array	Field name => value pairs
  * @param	array	Optional taxonomy term values, default null
  * @param	array	Optional taxonomy actions (add, remove, replace), default null
  *
  * @return	array	success/failure message and NULL content
  */
 public static function mla_update_single_item($post_id, $new_data, $tax_input = NULL, $tax_actions = NULL)
 {
     $post_data = self::mla_get_attachment_by_id($post_id, false);
     if (!isset($post_data)) {
         return array('message' => __('ERROR', 'media-library-assistant') . ': ' . __('Could not retrieve Attachment.', 'media-library-assistant'), 'body' => '');
     }
     $updates = apply_filters('mla_update_single_item', compact(array('new_data', 'tax_input', 'tax_actions')), $post_id, $post_data);
     $new_data = isset($updates['new_data']) ? $updates['new_data'] : array();
     $tax_input = isset($updates['tax_input']) ? $updates['tax_input'] : NULL;
     $tax_actions = isset($updates['tax_actions']) ? $updates['tax_actions'] : NULL;
     $message = '';
     $updates = array('ID' => $post_id);
     $new_data = stripslashes_deep($new_data);
     $new_meta = NULL;
     foreach ($new_data as $key => $value) {
         switch ($key) {
             case 'post_title':
                 if ($value == $post_data[$key]) {
                     break;
                 }
                 /* translators: 1: element name 2: old_value 3: new_value */
                 $message .= sprintf(__('Changing %1$s from "%2$s" to "%3$s"', 'media-library-assistant') . '<br>', __('Title', 'media-library-assistant'), esc_attr($post_data[$key]), esc_attr($value));
                 $updates[$key] = $value;
                 break;
             case 'post_name':
                 if ($value == $post_data[$key]) {
                     break;
                 }
                 $value = sanitize_title($value);
                 /*
                  * Make sure new slug is unique
                  */
                 $args = array('name' => $value, 'post_type' => 'attachment', 'post_status' => 'inherit', 'showposts' => 1);
                 $my_posts = get_posts($args);
                 if ($my_posts) {
                     /* translators: 1: ERROR tag 2: old_value */
                     $message .= sprintf(__('%1$s: Could not change Name/Slug "%2$s"; name already exists', 'media-library-assistant') . '<br>', __('ERROR', 'media-library-assistant'), $value);
                 } else {
                     /* translators: 1: element name 2: old_value 3: new_value */
                     $message .= sprintf(__('Changing %1$s from "%2$s" to "%3$s"', 'media-library-assistant') . '<br>', __('Name/Slug', 'media-library-assistant'), esc_attr($post_data[$key]), esc_attr($value));
                     $updates[$key] = $value;
                 }
                 break;
                 /*
                  * bulk_image_alt requires a separate key because some attachment types
                  * should not get a value, e.g., text or PDF documents
                  */
             /*
              * bulk_image_alt requires a separate key because some attachment types
              * should not get a value, e.g., text or PDF documents
              */
             case 'bulk_image_alt':
                 if ('image/' !== substr($post_data['post_mime_type'], 0, 6)) {
                     break;
                 }
                 // fallthru
             // fallthru
             case 'image_alt':
                 $key = 'mla_wp_attachment_image_alt';
                 if (!isset($post_data[$key])) {
                     $post_data[$key] = NULL;
                 }
                 if ($value == $post_data[$key]) {
                     break;
                 }
                 if (empty($value)) {
                     if (delete_post_meta($post_id, '_wp_attachment_image_alt')) {
                         /* translators: 1: old_value */
                         $message .= sprintf(__('Deleting ALT Text, was "%1$s"', 'media-library-assistant') . '<br>', esc_attr($post_data[$key]));
                     } else {
                         /* translators: 1: ERROR tag 2: old_value */
                         $message .= sprintf(__('%1$s: Could not delete ALT Text, remains "%2$s"', 'media-library-assistant') . '<br>', __('ERROR', 'media-library-assistant'), esc_attr($post_data[$key]));
                     }
                 } else {
                     /*
                      * ALT Text isn't supposed to have multiple values, but it happens.
                      * Delete multiple values and start over.
                      */
                     if (is_array($post_data[$key])) {
                         delete_post_meta($post_id, '_wp_attachment_image_alt');
                     }
                     if (update_post_meta($post_id, '_wp_attachment_image_alt', $value)) {
                         /* translators: 1: element name 2: old_value 3: new_value */
                         $message .= sprintf(__('Changing %1$s from "%2$s" to "%3$s"', 'media-library-assistant') . '<br>', __('ALT Text', 'media-library-assistant'), esc_attr($post_data[$key]), esc_attr($value));
                     } else {
                         /* translators: 1: ERROR tag 2: old_value 3: new_value */
                         $message .= sprintf(__('%1$s: Could not change ALT Text from "%2$s" to "%3$s"', 'media-library-assistant') . '<br>', __('ERROR', 'media-library-assistant'), esc_attr($post_data[$key]), esc_attr($value));
                     }
                 }
                 break;
             case 'post_excerpt':
                 if ($value == $post_data[$key]) {
                     break;
                 }
                 /* translators: 1: element name 2: old_value 3: new_value */
                 $message .= sprintf(__('Changing %1$s from "%2$s" to "%3$s"', 'media-library-assistant') . '<br>', __('Caption', 'media-library-assistant'), esc_attr($post_data[$key]), esc_attr($value));
                 $updates[$key] = $value;
                 break;
             case 'post_content':
                 if ($value == $post_data[$key]) {
                     break;
                 }
                 /* translators: 1: element name 2: old_value 3: new_value */
                 $message .= sprintf(__('Changing %1$s from "%2$s" to "%3$s"', 'media-library-assistant') . '<br>', __('Description', 'media-library-assistant'), esc_textarea($post_data[$key]), esc_textarea($value));
                 $updates[$key] = $value;
                 break;
             case 'post_parent':
                 if ($value == $post_data[$key]) {
                     break;
                 }
                 $value = absint($value);
                 /* translators: 1: element name 2: old_value 3: new_value */
                 $message .= sprintf(__('Changing %1$s from "%2$s" to "%3$s"', 'media-library-assistant') . '<br>', __('Parent', 'media-library-assistant'), $post_data[$key], $value);
                 $updates[$key] = $value;
                 break;
             case 'menu_order':
                 if ($value == $post_data[$key]) {
                     break;
                 }
                 $value = absint($value);
                 /* translators: 1: element name 2: old_value 3: new_value */
                 $message .= sprintf(__('Changing %1$s from "%2$s" to "%3$s"', 'media-library-assistant') . '<br>', __('Menu Order', 'media-library-assistant'), $post_data[$key], $value);
                 $updates[$key] = $value;
                 break;
             case 'post_author':
                 if ($value == $post_data[$key]) {
                     break;
                 }
                 $value = absint($value);
                 $from_user = get_userdata($post_data[$key]);
                 $to_user = get_userdata($value);
                 /* translators: 1: element name 2: old_value 3: new_value */
                 $message .= sprintf(__('Changing %1$s from "%2$s" to "%3$s"', 'media-library-assistant') . '<br>', __('Author', 'media-library-assistant'), $from_user->display_name, $to_user->display_name);
                 $updates[$key] = $value;
                 break;
             case 'comment_status':
                 if ($value == $post_data[$key]) {
                     break;
                 }
                 /* translators: 1: element name 2: old_value 3: new_value */
                 $message .= sprintf(__('Changing %1$s from "%2$s" to "%3$s"', 'media-library-assistant') . '<br>', __('Comments', 'media-library-assistant'), esc_attr($post_data[$key]), esc_attr($value));
                 $updates[$key] = $value;
                 break;
             case 'ping_status':
                 if ($value == $post_data[$key]) {
                     break;
                 }
                 /* translators: 1: element name 2: old_value 3: new_value */
                 $message .= sprintf(__('Changing %1$s from "%2$s" to "%3$s"', 'media-library-assistant') . '<br>', __('Pings', 'media-library-assistant'), esc_attr($post_data[$key]), esc_attr($value));
                 $updates[$key] = $value;
                 break;
             case 'taxonomy_updates':
                 $tax_input = $value['inputs'];
                 $tax_actions = $value['actions'];
                 break;
             case 'custom_updates':
                 $new_meta = $value;
                 break;
             default:
                 // Ignore anything else
         }
         // switch $key
     }
     // foreach $new_data
     if (!empty($tax_input)) {
         foreach ($tax_input as $taxonomy => $tags) {
             if (!empty($tax_actions)) {
                 $tax_action = $tax_actions[$taxonomy];
             } else {
                 $tax_action = 'replace';
             }
             $taxonomy_obj = get_taxonomy($taxonomy);
             if (current_user_can($taxonomy_obj->cap->assign_terms)) {
                 if (is_array($tags)) {
                     // array of int = hierarchical, comma-delimited string = non-hierarchical.
                     $tags = array_filter($tags);
                 }
                 switch ($tax_action) {
                     case 'add':
                         if (!empty($tags)) {
                             $action_name = __('Adding', 'media-library-assistant');
                             $result = wp_set_post_terms($post_id, $tags, $taxonomy, true);
                         }
                         break;
                     case 'remove':
                         $action_name = __('Removing', 'media-library-assistant');
                         $tags = self::_remove_terms($post_id, $tags, $taxonomy_obj);
                         $result = wp_set_post_terms($post_id, $tags, $taxonomy);
                         if (empty($tags)) {
                             $result = true;
                         }
                         break;
                     case 'replace':
                         $action_name = __('Replacing', 'media-library-assistant');
                         $result = wp_set_post_terms($post_id, $tags, $taxonomy);
                         if (empty($tags)) {
                             $result = true;
                         }
                         break;
                     default:
                         $action_name = __('Ignoring', 'media-library-assistant');
                         $result = NULL;
                         // ignore anything else
                 }
                 /*
                  * Definitive results check would use:
                  * do_action( 'set_object_terms', $object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids );
                  * in /wp_includes/taxonomy.php function wp_set_object_terms()
                  */
                 if (!empty($result)) {
                     delete_transient(MLA_OPTION_PREFIX . 't_term_counts_' . $taxonomy);
                     /* translators: 1: action_name, 2: taxonomy */
                     $message .= sprintf(__('%1$s "%2$s" terms', 'media-library-assistant') . '<br>', $action_name, $taxonomy);
                 }
             } else {
                 // current_user_can
                 /* translators: 1: taxonomy */
                 $message .= sprintf(__('You cannot assign "%1$s" terms', 'media-library-assistant') . '<br>', $taxonomy);
             }
         }
         // foreach $tax_input
     }
     // ! empty $tax_input
     if (is_array($new_meta)) {
         $message .= self::mla_update_item_postmeta($post_id, $new_meta);
     }
     if (empty($message)) {
         return array('message' => sprintf(__('Item %1$d, no changes detected.', 'media-library-assistant'), $post_id), 'body' => '');
     } else {
         // invalidate the cached item
         self::mla_get_attachment_by_id(-1);
         MLAQuery::mla_fetch_attachment_parent_data(-1);
         MLAQuery::mla_fetch_attachment_metadata(-1);
         MLAQuery::mla_fetch_attachment_references(-1, 0);
         // See if anything else has changed
         if (1 < count($updates)) {
             $result = wp_update_post($updates);
         } else {
             $result = $post_id;
         }
         do_action('mla_updated_single_item', $post_id, $result);
         if ($result) {
             /* translators: 1: post ID */
             $final_message = sprintf(__('Item %1$d updated.', 'media-library-assistant'), $post_id);
             /*
              * Uncomment this for debugging.
              */
             // $final_message .= '<br>' . $message;
             //error_log( 'DEBUG: mla_update_single_item message = ' . var_export( $message, true ), 0 );
             return array('message' => $final_message, 'body' => '');
         } else {
             return array('message' => sprintf(__('%1$s: Item %2$d update failed.', 'media-library-assistant'), __('ERROR', 'media-library-assistant'), $post_id), 'body' => '');
         }
     }
 }