/** * Evaluate IPTC/EXIF mapping updates for a post * * @since 1.00 * * @param object post object with current values * @param string category to evaluate against, e.g., iptc_exif_standard_mapping or iptc_exif_mapping * @param array (optional) iptc_exif_mapping values, default - current option value * @param array (optional) _wp_attachment_metadata, for MLAOptions::mla_update_attachment_metadata_filter * @param boolean (optional) true if uploading a new item else false (default) * * @return array Updates suitable for MLAData::mla_update_single_item, if any */ public static function mla_evaluate_iptc_exif_mapping($post, $category, $settings = NULL, $attachment_metadata = NULL, $is_upload = false) { $image_metadata = MLAData::mla_fetch_attachment_image_metadata($post->ID); /* * Make the PDF/XMP metadata available as EXIF values so simple rules like "EXIF:Keywords" will work */ if (empty($image_metadata['mla_exif_metadata'])) { if (!empty($image_metadata['mla_xmp_metadata'])) { $image_metadata['mla_exif_metadata'] = $image_metadata['mla_xmp_metadata']; } elseif (!empty($image_metadata['mla_pdf_metadata'])) { $image_metadata['mla_exif_metadata'] = $image_metadata['mla_pdf_metadata']; } } $updates = array(); $update_all = 'iptc_exif_mapping' == $category; $data_source_category = $update_all ? 'single_attachment_mapping' : 'custom_field_mapping'; if (NULL == $settings) { $settings = MLACore::mla_get_option('iptc_exif_mapping'); } $settings = apply_filters('mla_mapping_settings', $settings, $post->ID, $category, $attachment_metadata); if ($update_all || 'iptc_exif_standard_mapping' == $category) { foreach ($settings['standard'] as $setting_key => $setting_value) { $setting_value = apply_filters('mla_mapping_rule', $setting_value, $post->ID, 'iptc_exif_standard_mapping', $attachment_metadata); if (NULL === $setting_value) { continue; } if ('none' == $setting_value['iptc_value']) { $iptc_value = ''; } else { $iptc_value = MLAData::mla_iptc_metadata_value($setting_value['iptc_value'], $image_metadata); } $iptc_value = apply_filters('mla_mapping_iptc_value', $iptc_value, $setting_key, $post->ID, 'iptc_exif_standard_mapping', $attachment_metadata); if ('template:[+empty+]' == $setting_value['exif_value']) { $exif_value = NULL; } elseif ('template:' == substr($setting_value['exif_value'], 0, 9)) { $data_value = array('name' => $setting_key, 'data_source' => 'template', 'meta_name' => substr($setting_value['exif_value'], 9), 'keep_existing' => $setting_value['keep_existing'], 'format' => 'native', 'option' => 'text'); $exif_value = MLAOptions::mla_get_data_source($post->ID, $data_source_category, $data_value, $attachment_metadata); if (' ' == $exif_value) { $exif_value = ''; } } else { $exif_value = MLAData::mla_exif_metadata_value($setting_value['exif_value'], $image_metadata); } $exif_value = apply_filters('mla_mapping_exif_value', $exif_value, $setting_key, $post->ID, 'iptc_exif_standard_mapping', $attachment_metadata); $keep_existing = (bool) $setting_value['keep_existing']; if ($setting_value['iptc_first']) { if (!empty($iptc_value)) { $new_text = $iptc_value; } else { $new_text = $exif_value; } } else { if (!empty($exif_value) || is_null($exif_value)) { $new_text = $exif_value; } else { $new_text = $iptc_value; } } $new_text = apply_filters('mla_mapping_new_text', $new_text, $setting_key, $post->ID, 'iptc_exif_standard_mapping', $attachment_metadata); if (is_array($new_text)) { $new_text = implode(',', $new_text); } // Handle 'template:[+empty+]' if (is_null($new_text)) { $updates[$setting_key] = ''; continue; } /* * See /wp-includes/formatting.php, function convert_chars() * * Metadata tags <<title>> and <<category>> are removed, <<br>> and <<hr>> are * converted into correct XHTML and Unicode characters are converted to the * valid range. */ $new_text = trim(convert_chars($new_text)); if (!empty($new_text)) { switch ($setting_key) { case 'post_title': if ((empty($post->post_title) || !$keep_existing) && (trim($new_text) && !is_numeric(sanitize_title($new_text)))) { $updates[$setting_key] = $new_text; } break; case 'post_name': $updates[$setting_key] = wp_unique_post_slug(sanitize_title($new_text), $post->ID, $post->post_status, $post->post_type, $post->post_parent); break; case 'image_alt': $old_text = get_metadata('post', $post->ID, '_wp_attachment_image_alt', true); if (empty($old_text) || !$keep_existing) { $updates[$setting_key] = $new_text; } break; case 'post_excerpt': if (empty($post->post_excerpt) || !$keep_existing) { $updates[$setting_key] = $new_text; } break; case 'post_content': if (empty($post->post_content) || !$keep_existing) { $updates[$setting_key] = $new_text; } break; default: // ignore anything else } // $setting_key } } // foreach new setting } // update standard field mappings if ($update_all || 'iptc_exif_taxonomy_mapping' == $category) { $tax_inputs = array(); $tax_actions = array(); foreach ($settings['taxonomy'] as $setting_key => $setting_value) { if (!MLACore::mla_taxonomy_support($setting_key, 'support')) { continue; } /* * Convert checkbox value(s) */ $hierarchical = $setting_value['hierarchical'] = (bool) $setting_value['hierarchical']; $setting_value = apply_filters('mla_mapping_rule', $setting_value, $post->ID, 'iptc_exif_taxonomy_mapping', $attachment_metadata); if (NULL === $setting_value) { continue; } if ('none' == $setting_value['iptc_value']) { $iptc_value = ''; } else { $iptc_value = MLAData::mla_iptc_metadata_value($setting_value['iptc_value'], $image_metadata); } $iptc_value = apply_filters('mla_mapping_iptc_value', $iptc_value, $setting_key, $post->ID, 'iptc_exif_taxonomy_mapping', $attachment_metadata); if ('template:' == substr($setting_value['exif_value'], 0, 9)) { $data_value = array('name' => $setting_key, 'data_source' => 'template', 'meta_name' => substr($setting_value['exif_value'], 9), 'keep_existing' => $setting_value['keep_existing'], 'format' => 'native', 'option' => 'array'); $exif_value = MLAOptions::mla_get_data_source($post->ID, $data_source_category, $data_value, $attachment_metadata); if (' ' == $exif_value) { $exif_value = ''; } } else { $exif_value = MLAData::mla_exif_metadata_value($setting_value['exif_value'], $image_metadata); } $exif_value = apply_filters('mla_mapping_exif_value', $exif_value, $setting_key, $post->ID, 'iptc_exif_taxonomy_mapping', $attachment_metadata); $tax_action = $setting_value['keep_existing'] ? 'add' : 'replace'; $tax_parent = isset($setting_value['parent']) && 0 != (int) $setting_value['parent'] ? (int) $setting_value['parent'] : 0; if ($setting_value['iptc_first']) { if (!empty($iptc_value)) { $new_text = $iptc_value; } else { $new_text = $exif_value; } } else { if (!empty($exif_value)) { $new_text = $exif_value; } else { $new_text = $iptc_value; } } /* * Parse out individual terms */ if (!empty($setting_value['delimiters'])) { $text = $setting_value['delimiters']; $delimiters = array(); while (!empty($text)) { $delimiters[] = $text[0]; $text = substr($text, 1); } } else { $delimiters = array(_x(',', 'tag_delimiter', 'media-library-assistant')); } if (is_scalar($new_text)) { $new_text = array($new_text); } foreach ($delimiters as $delimiter) { $new_terms = array(); foreach ($new_text as $text) { $fragments = explode($delimiter, $text); foreach ($fragments as $fragment) { if (MLATest::$wp_3dot5) { $fragment = trim(stripslashes_deep($fragment)); } else { $fragment = trim(wp_unslash($fragment)); } if (!empty($fragment)) { $new_terms[] = $fragment; } } // foreach fragment } // foreach $text $new_text = array_unique($new_terms); } // foreach $delimiter $new_text = apply_filters('mla_mapping_new_text', $new_text, $setting_key, $post->ID, 'iptc_exif_taxonomy_mapping', $attachment_metadata); if (empty($new_text)) { continue; } $current_terms = array(); if (!$is_upload) { $post_terms = get_object_term_cache($post->ID, $setting_key); if (false === $post_terms) { $post_terms = wp_get_object_terms($post->ID, $setting_key); wp_cache_add($post->ID, $post_terms, $setting_key . '_relationships'); } foreach ($post_terms as $new_term) { if ($hierarchical) { $current_terms[$new_term->term_id] = $new_term->term_id; } else { $current_terms[$new_term->name] = $new_term->name; } } } /* * Hierarchical taxonomies require term_id, flat require term names */ if ($hierarchical) { /* * Convert text to term_id */ $new_terms = array(); foreach ($new_text as $new_term) { if (0 < ($new_term = MLAOptions::_get_term_id($new_term, $tax_parent, $setting_key, $post_terms))) { $new_terms[] = $new_term; } } // foreach new_term } else { $new_terms = $new_text; } if ('replace' == $tax_action) { /* * If the new terms match the term cache, we can skip the update */ foreach ($new_terms as $new_term) { if (isset($current_terms[$new_term])) { unset($current_terms[$new_term]); } else { $current_terms[$new_term] = $new_term; break; // not a match; stop checking } } $do_update = !empty($current_terms); } else { /* * We are adding terms; remove existing terms */ foreach ($new_terms as $index => $new_term) { if (isset($current_terms[esc_attr($new_term)])) { unset($new_terms[$index]); } } $do_update = !empty($new_terms); } if ($do_update) { $tax_inputs[$setting_key] = $new_terms; $tax_actions[$setting_key] = $tax_action; } } // foreach new setting if (!empty($tax_inputs)) { $updates['taxonomy_updates'] = array('inputs' => $tax_inputs, 'actions' => $tax_actions); } } // update taxonomy term mappings if ($update_all || 'iptc_exif_custom_mapping' == $category) { $custom_updates = array(); foreach ($settings['custom'] as $setting_key => $setting_value) { /* * Convert checkbox value(s) */ $setting_value['no_null'] = isset($setting_value['no_null']); $setting_name = $setting_value['name']; $setting_value = apply_filters('mla_mapping_rule', $setting_value, $post->ID, 'iptc_exif_custom_mapping', $attachment_metadata); if (NULL === $setting_value) { continue; } if ('none' == $setting_value['iptc_value']) { $iptc_value = ''; } else { $data_value = array('name' => $setting_key, 'data_source' => 'template', 'meta_name' => '([+iptc:' . $setting_value['iptc_value'] . '+])', 'keep_existing' => $setting_value['keep_existing'], 'format' => $setting_value['format'], 'option' => $setting_value['option']); $iptc_value = MLAOptions::mla_get_data_source($post->ID, $data_source_category, $data_value, $attachment_metadata); if (' ' == $iptc_value) { $iptc_value = ''; } } $iptc_value = apply_filters('mla_mapping_iptc_value', $iptc_value, $setting_key, $post->ID, 'iptc_exif_custom_mapping', $attachment_metadata); $exif_value = trim($setting_value['exif_value']); if (!empty($exif_value)) { $data_value = array('name' => $setting_key, 'data_source' => 'template', 'keep_existing' => $setting_value['keep_existing'], 'format' => $setting_value['format'], 'option' => $setting_value['option']); if ('template:' == substr($exif_value, 0, 9)) { $data_value['meta_name'] = substr($exif_value, 9); } else { $data_value['meta_name'] = '([+exif:' . $exif_value . '+])'; } $exif_value = MLAOptions::mla_get_data_source($post->ID, $data_source_category, $data_value, $attachment_metadata); if (' ' == $exif_value) { $exif_value = ''; } } $exif_value = apply_filters('mla_mapping_exif_value', $exif_value, $setting_key, $post->ID, 'iptc_exif_custom_mapping', $attachment_metadata); if ($setting_value['iptc_first']) { if (!empty($iptc_value)) { $new_text = $iptc_value; } else { $new_text = $exif_value; } } else { if (!empty($exif_value)) { $new_text = $exif_value; } else { $new_text = $iptc_value; } } $new_text = apply_filters('mla_mapping_new_text', $new_text, $setting_key, $post->ID, 'iptc_exif_custom_mapping', $attachment_metadata); if ($setting_value['keep_existing']) { if ('meta:' == substr($setting_name, 0, 5)) { $meta_key = substr($setting_name, 5); if (NULL === $attachment_metadata) { $attachment_metadata = maybe_unserialize(get_metadata('post', $post->ID, '_wp_attachment_metadata', true)); } if (array($attachment_metadata)) { $old_value = MLAData::mla_find_array_element($meta_key, $attachment_metadata, 'array'); } else { $old_value = ''; } } else { if (is_string($old_value = get_metadata('post', $post->ID, $setting_name, true))) { $old_value = trim($old_value); } } if (!empty($new_text) && empty($old_value)) { $custom_updates[$setting_name] = $new_text; } } else { // } keep_existing if (empty($new_text) && $setting_value['no_null']) { $new_text = NULL; } $custom_updates[$setting_name] = $new_text; } } // foreach new setting if (!empty($custom_updates)) { $updates['custom_updates'] = $custom_updates; } } // update custom field mappings $updates = apply_filters('mla_mapping_updates', $updates, $post->ID, $category, $settings, $attachment_metadata); return $updates; }
/** * 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; }
/** * Evaluate IPTC/EXIF mapping updates for a post * * @since 1.00 * * @param object post object with current values * @param string category to evaluate against, e.g., iptc_exif_standard_mapping or iptc_exif_mapping * @param array (optional) iptc_exif_mapping values, default - current option value * * @return array Updates suitable for MLAData::mla_update_single_item, if any */ public static function mla_evaluate_iptc_exif_mapping($post, $category, $settings = NULL) { $metadata = MLAData::mla_fetch_attachment_image_metadata($post->ID); $updates = array(); $update_all = 'iptc_exif_mapping' == $category; if (NULL == $settings) { $settings = self::mla_get_option('iptc_exif_mapping'); } if ($update_all || 'iptc_exif_standard_mapping' == $category) { foreach ($settings['standard'] as $new_key => $new_value) { if ('none' == $new_value['iptc_value']) { $iptc_value = ''; } else { $iptc_value = MLAData::mla_iptc_metadata_value($new_value['iptc_value'], $metadata); } if ('template:' == substr($new_value['exif_value'], 0, 9)) { $data_value = array('name' => $new_key, 'data_source' => 'template', 'meta_name' => substr($new_value['exif_value'], 9), 'keep_existing' => $new_value['keep_existing'], 'format' => 'native', 'option' => 'text'); $exif_value = self::_evaluate_data_source($post->ID, 'single_attachment_mapping', $data_value, $metadata); } else { $exif_value = MLAData::mla_exif_metadata_value($new_value['exif_value'], $metadata); } $keep_existing = (bool) $new_value['keep_existing']; if ($new_value['iptc_first']) { if (!empty($iptc_value)) { $new_text = $iptc_value; } else { $new_text = $exif_value; } } else { if (!empty($exif_value)) { $new_text = $exif_value; } else { $new_text = $iptc_value; } } if (is_array($new_text)) { $new_text = implode(',', $new_text); } $new_text = trim(convert_chars($new_text)); if (!empty($new_text)) { switch ($new_key) { case 'post_title': if ((empty($post->post_title) || !$keep_existing) && (trim($new_text) && !is_numeric(sanitize_title($new_text)))) { $updates[$new_key] = $new_text; } break; case 'post_name': $updates[$new_key] = wp_unique_post_slug(sanitize_title($new_text), $post->ID, $post->post_status, $post->post_type, $post->post_parent); break; case 'image_alt': $old_text = get_metadata('post', $post->ID, '_wp_attachment_image_alt', true); if (empty($old_text) || !$keep_existing) { $updates[$new_key] = $new_text; } break; case 'post_excerpt': if (empty($post->post_excerpt) || !$keep_existing) { $updates[$new_key] = $new_text; } break; case 'post_content': if (empty($post->post_content) || !$keep_existing) { $updates[$new_key] = $new_text; } break; default: // ignore anything else } } // $new_key } // foreach new setting } // update standard field mappings if ($update_all || 'iptc_exif_taxonomy_mapping' == $category) { $tax_inputs = array(); $tax_actions = array(); foreach ($settings['taxonomy'] as $new_key => $new_value) { if ('none' == $new_value['iptc_value']) { $iptc_value = ''; } else { $iptc_value = MLAData::mla_iptc_metadata_value($new_value['iptc_value'], $metadata); } if ('template:' == substr($new_value['exif_value'], 0, 9)) { $data_value = array('name' => $new_key, 'data_source' => 'template', 'meta_name' => substr($new_value['exif_value'], 9), 'keep_existing' => $new_value['keep_existing'], 'format' => 'native', 'option' => 'array'); $exif_value = self::_evaluate_data_source($post->ID, 'single_attachment_mapping', $data_value, $metadata); } else { $exif_value = MLAData::mla_exif_metadata_value($new_value['exif_value'], $metadata); } $tax_action = $new_value['keep_existing'] ? 'add' : 'replace'; $tax_parent = isset($new_value['parent']) && 0 != (int) $new_value['parent'] ? (int) $new_value['parent'] : 0; if ($new_value['iptc_first']) { if (!empty($iptc_value)) { $new_text = $iptc_value; } else { $new_text = $exif_value; } } else { if (!empty($exif_value)) { $new_text = $exif_value; } else { $new_text = $iptc_value; } } if (!empty($new_text)) { if ($new_value['hierarchical']) { if (is_string($new_text)) { $new_text = array($new_text); } $new_terms = array(); foreach ($new_text as $new_term) { $term_object = term_exists($new_term, $new_key); if ($term_object !== 0 && $term_object !== null) { $new_terms[] = $term_object['term_id']; } else { $term_object = wp_insert_term($new_term, $new_key, array('parent' => $tax_parent)); if (isset($term_object['term_id'])) { $new_terms[] = $term_object['term_id']; } } } // foreach new_term $tax_inputs[$new_key] = $new_terms; } else { $tax_inputs[$new_key] = $new_text; } $tax_actions[$new_key] = $tax_action; } // new_text } // foreach new setting if (!empty($tax_inputs)) { $updates['taxonomy_updates'] = array('inputs' => $tax_inputs, 'actions' => $tax_actions); } } // update taxonomy term mappings if ($update_all || 'iptc_exif_custom_mapping' == $category) { $custom_updates = array(); foreach ($settings['custom'] as $new_key => $new_value) { if ('none' == $new_value['iptc_value']) { $iptc_value = ''; } else { $iptc_value = MLAData::mla_iptc_metadata_value($new_value['iptc_value'], $metadata); } if ('template:' == substr($new_value['exif_value'], 0, 9)) { $data_value = array('name' => $new_key, 'data_source' => 'template', 'meta_name' => substr($new_value['exif_value'], 9), 'keep_existing' => $new_value['keep_existing'], 'format' => 'native', 'option' => 'text'); $exif_value = self::_evaluate_data_source($post->ID, 'single_attachment_mapping', $data_value, $metadata); } else { $exif_value = MLAData::mla_exif_metadata_value($new_value['exif_value'], $metadata); } if ($new_value['iptc_first']) { if (!empty($iptc_value)) { $new_text = $iptc_value; } else { $new_text = $exif_value; } } else { if (!empty($exif_value)) { $new_text = $exif_value; } else { $new_text = $iptc_value; } } if (is_array($new_text)) { $new_text = implode(',', $new_text); } if ($new_value['keep_existing']) { if ('meta:' == substr($new_key, 0, 5)) { $meta_key = substr($new_key, 5); $attachment_metadata = maybe_unserialize(get_metadata('post', $post->ID, '_wp_attachment_metadata', true)); if (array($attachment_metadata)) { $old_value = MLAData::mla_find_array_element($meta_key, $attachment_metadata, 'array'); } else { $old_value = ''; } } else { if (is_string($old_value = get_metadata('post', $post->ID, $new_key, true))) { $old_value = trim($old_value); } } if (!empty($new_text) && empty($old_value)) { $custom_updates[$new_key] = $new_text; } } else { $custom_updates[$new_key] = $new_text; } } // foreach new setting if (!empty($custom_updates)) { $updates['custom_updates'] = $custom_updates; } } // update custom field mappings return $updates; }