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 */ public static function mla_get_data_source( $post_id, $category, $data_value, $attachment_metadata = NULL ) { if ( !class_exists( 'MLAQuery' ) ) { require_once( MLA_PLUGIN_PATH . 'includes/class-mla-data-query.php' ); MLAQuery::initialize(); } if ( !class_exists( 'MLAData' ) ) { require_once( MLA_PLUGIN_PATH . 'includes/class-mla-data.php' ); MLAData::initialize(); } $default_arguments = array( 'data_source' => 'none', 'keep_existing' => true, 'format' => 'native', 'meta_name' => '', 'option' => 'text', ); $data_value = shortcode_atts( $default_arguments, $data_value ); return MLAData_Source::_evaluate_data_source( $post_id, $category, $data_value, $attachment_metadata ); } // mla_get_data_source /** * Evaluate file information for custom field mapping * * @since 2.20 * * @param string absolute path the the uploads base directory * @param array _wp_attached_file meta_value array, indexed by post_id * @param array _wp_attachment_metadata meta_value array, indexed by post_id * @param integer post->ID of attachment * * @return array absolute_path_raw, absolute_path, absolute_file_name_raw, absolute_file_name, absolute_file, base_file, path, file_name, extension, dimensions, width, height, hwstring_small, array of intermediate sizes */ private static function _evaluate_file_information( $upload_dir, &$wp_attached_files, &$wp_attachment_metadata, $post_id ) { $results = array( 'absolute_path_raw' => '', 'absolute_path' => '', 'absolute_file_name_raw' => '', 'absolute_file_name' => '', 'base_file' => '', 'path' => '', 'file_name' => '', 'name_only' => '', 'extension' => '', 'width' => '', 'height' => '', 'orientation' => '', 'hwstring_small' => '', 'sizes' => array() ); $base_file = isset( $wp_attached_files[ $post_id ]->meta_value ) ? $wp_attached_files[ $post_id ]->meta_value : ''; $sizes = array(); if ( isset( $wp_attachment_metadata[ $post_id ]->meta_value ) ) { $attachment_metadata = @unserialize( $wp_attachment_metadata[ $post_id ]->meta_value ); if ( ! is_array( $attachment_metadata ) ) { $attachment_metadata = array(); } } else { $attachment_metadata = array(); } if ( !empty( $attachment_metadata ) ) { if ( isset( $attachment_metadata['image_meta'] ) ) { foreach ( $attachment_metadata['image_meta'] as $key => $value ) $results[ $key ] = $value; } $sizes = isset( $attachment_metadata['sizes'] ) ? $attachment_metadata['sizes'] : array(); if ( isset( $attachment_metadata['width'] ) ) { $results['width'] = $attachment_metadata['width']; $width = absint( $results['width'] ); } else { $width = 0; } if ( isset( $attachment_metadata['height'] ) ) { $results['height'] = $attachment_metadata['height']; $height = absint( $results['height'] ); } else { $height = 0; } if ( $width && $height ) { $results['orientation'] = ( $height > $width ) ? 'portrait' : 'landscape'; } $results['hwstring_small'] = isset( $attachment_metadata['hwstring_small'] ) ? $attachment_metadata['hwstring_small'] : ''; } if ( ! empty( $base_file ) ) { $pathinfo = pathinfo( $base_file ); $results['base_file'] = $base_file; if ( '.' == $pathinfo['dirname'] ) { $results['absolute_path_raw'] = $upload_dir; $results['absolute_path'] = wptexturize( str_replace( '\\', '/', $upload_dir ) ); $results['path'] = ''; } else { $results['absolute_path_raw'] = $upload_dir . $pathinfo['dirname'] . '/'; $results['absolute_path'] = wptexturize( str_replace( '\\', '/', $results['absolute_path_raw'] ) ); $results['path'] = wptexturize( $pathinfo['dirname'] . '/' ); } $results['absolute_file_name_raw'] = $results['absolute_path_raw'] . $pathinfo['basename']; $results['absolute_file_name'] = wptexturize( str_replace( '\\', '/', $results['absolute_file_name_raw'] ) ); $results['file_name'] = wptexturize( $pathinfo['basename'] ); $results['name_only'] = wptexturize( $pathinfo['filename'] ); $results['extension'] = wptexturize( $pathinfo['extension'] ); } $results['sizes'] = $sizes; return $results; } // _evaluate_file_information /** * Evaluate post information for custom field mapping * * @since 2.20 * * @param integer post->ID of attachment * @param string category/scope to evaluate against: custom_field_mapping or single_attachment_mapping * @param string data source name ( post_date or post_parent ) * * @return mixed (string)/'' or (integer)/0 depending on $data_source type */ private static function _evaluate_post_information( $post_id, $category, $data_source ) { global $wpdb; static $post_info = NULL; if ( 0 == $post_id ) { $value = NULL; } else { /* * Check for $post_id match */ if ( 'single_attachment_mapping' == $category && ! isset( $post_info[$post_id] ) ) { $post_info = NULL; } if ( NULL == $post_info ) { if ( 'custom_field_mapping' == $category ) { $post_info = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} WHERE post_type = 'attachment'", OBJECT_K ); } else { $post_info = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} WHERE ID = '{$post_id}'", OBJECT_K ); } } if ( 'post_id' == $data_source ) { $data_source = 'ID'; } if ( isset( $post_info[$post_id] ) && property_exists( $post_info[$post_id], $data_source ) ) { $post_array = (array) $post_info[$post_id]; $value = $post_array[ $data_source ]; } else { $value = NULL; } } switch ( $data_source ) { case 'ID': case 'post_id': case 'post_author': case 'post_parent': case 'menu_order': case 'comment_count': return ( NULL !== $value ) ? $value : 0; default: return ( NULL !== $value ) ? $value : ''; } return false; } // _evaluate_post_information /** * Evaluate post information for custom field mapping * * @since 2.20 * * @param array field value(s) * @param string format option text|single|export|array|multi * @param boolean keep existing value(s) - for 'multi' option * * @return mixed array for option = array|multi else string */ private static function _evaluate_array_result( $value, $option, $keep_existing ) { if ( empty( $value ) ) { return ''; } if ( is_array( $value ) ) { if ( 'single' == $option || 1 == count( $value ) ) { return current( $value ); } elseif ( 'export' == $option ) { return var_export( $value, true ); } elseif ( 'text' == $option ) { return implode( ',', $value ); } elseif ( 'multi' == $option ) { $value[0x80000000] = $option; $value[0x80000001] = $keep_existing; return $value; } } /* * $option = array returns the array */ return $value; } // _evaluate_array_result /** * 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; MLAData::mla_reset_regex_matches( $post_id ); 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, $attachment_metadata ); 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 */ 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 */ 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( (float)$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( (float)$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; case 'index': if ( class_exists( 'MLA' ) && !empty( MLA::$bulk_edit_data_source['cb_index'] ) ) { $result = MLA::$bulk_edit_data_source['cb_index']; if ( !empty( $data_value['format'] ) ) { $result += absint( $data_value['format'] ); } } break; case 'found_rows': if ( class_exists( 'MLA' ) && !empty( MLA::$bulk_edit_data_source['cb_count'] ) ) { $result = MLA::$bulk_edit_data_source['cb_count']; } 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( (float)$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_data_source } // class MLAData_Source ?>