/**
  * MLA_List_Table inline edit parse
  *
  * @since 2.13
  *
  * Adds Bulk Translate form and the Language dropdown
  * markup used for the Quick and Bulk Edit forms.
  *
  * @param	string	HTML markup returned by the template parser
  * @param	string	template used to generate the HTML markup
  * @param	array	parameter_name => parameter_value pairs
  *
  * @return	array	updated HTML markup for the Quick and Bulk Edit forms
  */
 public static function mla_list_table_inline_parse($html_markup, $item_template, $item_values)
 {
     /*
      * Add the Thumbnail Generation Markup
      */
     $page_template_array = MLAData::mla_load_template('mla-thumbnail-generation.tpl');
     if (!is_array($page_template_array)) {
         error_log('ERROR: mla-thumbnail-generation.tpl path = ' . var_export(plugin_dir_path(__FILE__) . 'mla-thumbnail-generation.tpl', true), 0);
         error_log('ERROR: mla-thumbnail-generation.tpl non-array result = ' . var_export($page_template_array, true), 0);
         return $html_markup;
     }
     $page_values = array('colspan' => $item_values['colspan'], 'Generate Thumbnails' => __('Generate Thumbnails', 'media-library-assistant'), 'See Documentation' => __('Pull down the Help menu and select Thumbnail Generation for setting details', 'media-library-assistant'), 'Width' => __('Width', 'media-library-assistant'), 'Height' => __('Height', 'media-library-assistant'), 'Best Fit' => __('Best Fit', 'media-library-assistant'), 'Page' => __('Page', 'media-library-assistant'), 'Resolution' => __('Resolution', 'media-library-assistant'), 'Quality' => __('Quality', 'media-library-assistant'), 'Type' => __('Type', 'media-library-assistant'), 'Existing Items' => __('Existing Items', 'media-library-assistant'), 'Keep' => __('Keep', 'media-library-assistant'), 'Ignore' => __('Ignore', 'media-library-assistant'), 'Trash' => __('Trash', 'media-library-assistant'), 'Delete' => __('Delete', 'media-library-assistant'), 'Suffix' => __('Suffix', 'media-library-assistant'), 'default_suffix' => '-' . __('Thumbnail', 'media-library-assistant'), 'Options' => __('Options', 'media-library-assistant'), 'Clear Filter-by' => __('Clear Filter-by', 'media-library-assistant'), 'Cancel' => __('Cancel', 'media-library-assistant'));
     $parse_value = MLAData::mla_parse_template($page_template_array['page'], $page_values);
     return $html_markup . "\n" . $parse_value;
 }
Example #2
0
 /**
  * Build the hidden row templates for inline editing (quick and bulk edit)
  *
  * inspired by inline_edit() in wp-admin\includes\class-wp-posts-list-table.php.
  *
  * @since 0.20
  *
  * @param	object	MLA List Table object
  *
  * @return	string	HTML <form> markup for hidden rows
  */
 private static function _build_inline_edit_form($MLAListTable)
 {
     $taxonomies = get_object_taxonomies('attachment', 'objects');
     $hierarchical_taxonomies = array();
     $flat_taxonomies = array();
     foreach ($taxonomies as $tax_name => $tax_object) {
         if ($tax_object->hierarchical && $tax_object->show_ui && MLAOptions::mla_taxonomy_support($tax_name, 'quick-edit')) {
             $hierarchical_taxonomies[$tax_name] = $tax_object;
         } elseif ($tax_object->show_ui && MLAOptions::mla_taxonomy_support($tax_name, 'quick-edit')) {
             $flat_taxonomies[$tax_name] = $tax_object;
         }
     }
     $page_template_array = MLAData::mla_load_template('admin-inline-edit-form.tpl');
     if (!is_array($page_template_array)) {
         /* translators: 1: ERROR tag 2: function name 3: non-array value */
         error_log(sprintf(_x('%1$s: %2$s non-array "%3$s"', 'error_log', 'media-library-assistant'), __('ERROR', 'media-library-assistant'), 'MLA::_build_inline_edit_form', var_export($page_template_array, true)), 0);
         return '';
     }
     if ($authors = self::mla_authors_dropdown()) {
         $authors_dropdown = '              <label class="inline-edit-author">' . "\n";
         $authors_dropdown .= '                <span class="title">' . __('Author', 'media-library-assistant') . '</span>' . "\n";
         $authors_dropdown .= $authors . "\n";
         $authors_dropdown .= '              </label>' . "\n";
     } else {
         $authors_dropdown = '';
     }
     $custom_fields = '';
     foreach (MLAOptions::mla_custom_field_support('quick_edit') as $slug => $details) {
         $page_values = array('slug' => $slug, 'label' => esc_attr($details['name']));
         $custom_fields .= MLAData::mla_parse_template($page_template_array['custom_field'], $page_values);
     }
     /*
      * The middle column contains the hierarchical taxonomies, e.g., Attachment Category
      */
     $quick_middle_column = '';
     $bulk_middle_column = '';
     if (count($hierarchical_taxonomies)) {
         $quick_category_blocks = '';
         $bulk_category_blocks = '';
         foreach ($hierarchical_taxonomies as $tax_name => $tax_object) {
             if (current_user_can($tax_object->cap->assign_terms)) {
                 ob_start();
                 wp_terms_checklist(NULL, array('taxonomy' => $tax_name));
                 $tax_checklist = ob_get_contents();
                 ob_end_clean();
                 $page_values = array('tax_html' => esc_html($tax_object->labels->name), 'more' => __('more', 'media-library-assistant'), 'less' => __('less', 'media-library-assistant'), 'tax_attr' => esc_attr($tax_name), 'tax_checklist' => $tax_checklist, 'Add' => __('Add', 'media-library-assistant'), 'Remove' => __('Remove', 'media-library-assistant'), 'Replace' => __('Replace', 'media-library-assistant'));
                 $category_block = MLAData::mla_parse_template($page_template_array['category_block'], $page_values);
                 $taxonomy_options = MLAData::mla_parse_template($page_template_array['taxonomy_options'], $page_values);
                 $quick_category_blocks .= $category_block;
                 $bulk_category_blocks .= $category_block . $taxonomy_options;
             }
             // current_user_can
         }
         // foreach $hierarchical_taxonomies
         $page_values = array('category_blocks' => $quick_category_blocks);
         $quick_middle_column = MLAData::mla_parse_template($page_template_array['category_fieldset'], $page_values);
         $page_values = array('category_blocks' => $bulk_category_blocks);
         $bulk_middle_column = MLAData::mla_parse_template($page_template_array['category_fieldset'], $page_values);
     }
     // count( $hierarchical_taxonomies )
     /*
      * The right-hand column contains the flat taxonomies, e.g., Attachment Tag
      */
     $quick_right_column = '';
     $bulk_right_column = '';
     if (count($flat_taxonomies)) {
         $quick_tag_blocks = '';
         $bulk_tag_blocks = '';
         foreach ($flat_taxonomies as $tax_name => $tax_object) {
             if (current_user_can($tax_object->cap->assign_terms)) {
                 $page_values = array('tax_html' => esc_html($tax_object->labels->name), 'tax_attr' => esc_attr($tax_name), 'Add' => __('Add', 'media-library-assistant'), 'Remove' => __('Remove', 'media-library-assistant'), 'Replace' => __('Replace', 'media-library-assistant'));
                 $tag_block = MLAData::mla_parse_template($page_template_array['tag_block'], $page_values);
                 $taxonomy_options = MLAData::mla_parse_template($page_template_array['taxonomy_options'], $page_values);
                 $quick_tag_blocks .= $tag_block;
                 $bulk_tag_blocks .= $tag_block . $taxonomy_options;
             }
             // current_user_can
         }
         // foreach $flat_taxonomies
         $page_values = array('tag_blocks' => $quick_tag_blocks);
         $quick_right_column = MLAData::mla_parse_template($page_template_array['tag_fieldset'], $page_values);
         $page_values = array('tag_blocks' => $bulk_tag_blocks);
         $bulk_right_column = MLAData::mla_parse_template($page_template_array['tag_fieldset'], $page_values);
     }
     // count( $flat_taxonomies )
     if ($authors = self::mla_authors_dropdown(-1)) {
         $bulk_authors_dropdown = '              <label class="inline-edit-author alignright">' . "\n";
         $bulk_authors_dropdown .= '                <span class="title">' . __('Author', 'media-library-assistant') . '</span>' . "\n";
         $bulk_authors_dropdown .= $authors . "\n";
         $bulk_authors_dropdown .= '              </label>' . "\n";
     } else {
         $bulk_authors_dropdown = '';
     }
     $bulk_custom_fields = '';
     foreach (MLAOptions::mla_custom_field_support('bulk_edit') as $slug => $details) {
         $page_values = array('slug' => $slug, 'label' => esc_attr($details['name']));
         $bulk_custom_fields .= MLAData::mla_parse_template($page_template_array['custom_field'], $page_values);
     }
     $set_parent_form = MLA::mla_set_parent_form();
     $page_values = array('colspan' => $MLAListTable->get_column_count(), 'Quick Edit' => __('Quick Edit', 'media-library-assistant'), 'Title' => __('Title', 'media-library-assistant'), 'Name/Slug' => __('Name/Slug', 'media-library-assistant'), 'Caption' => __('Caption', 'media-library-assistant'), 'Description' => __('Description', 'media-library-assistant'), 'ALT Text' => __('ALT Text', 'media-library-assistant'), 'Parent ID' => __('Parent ID', 'media-library-assistant'), 'Select' => __('Select', 'media-library-assistant'), 'Menu Order' => __('Menu Order', 'media-library-assistant'), 'authors' => $authors_dropdown, 'custom_fields' => $custom_fields, 'quick_middle_column' => $quick_middle_column, 'quick_right_column' => $quick_right_column, 'Cancel' => __('Cancel', 'media-library-assistant'), 'Reset' => __('Reset', 'media-library-assistant'), 'Update' => __('Update', 'media-library-assistant'), 'Bulk Edit' => __('Bulk Edit', 'media-library-assistant'), 'bulk_middle_column' => $bulk_middle_column, 'bulk_right_column' => $bulk_right_column, 'bulk_authors' => $bulk_authors_dropdown, 'Comments' => __('Comments', 'media-library-assistant'), 'Pings' => __('Pings', 'media-library-assistant'), 'No Change' => __('No Change', 'media-library-assistant'), 'Allow' => __('Allow', 'media-library-assistant'), 'Do not allow' => __('Do not allow', 'media-library-assistant'), 'bulk_custom_fields' => $bulk_custom_fields, 'Map IPTC/EXIF metadata' => __('Map IPTC/EXIF metadata', 'media-library-assistant'), 'Map Custom Field metadata' => __('Map Custom Field metadata', 'media-library-assistant'), 'Bulk Waiting' => __('Waiting', 'media-library-assistant'), 'Bulk Running' => __('In-process', 'media-library-assistant'), 'Bulk Complete' => __('Complete', 'media-library-assistant'), 'Refresh' => __('Refresh', 'media-library-assistant'), 'set_parent_form' => $set_parent_form);
     $page_values = apply_filters('mla_list_table_inline_values', $page_values);
     $page_template = apply_filters('mla_list_table_inline_template', $page_template_array['page']);
     $parse_value = MLAData::mla_parse_template($page_template, $page_values);
     return apply_filters('mla_list_table_inline_parse', $parse_value, $page_template, $page_values);
 }
 /**
  * Build the hidden form for the "Search Terms" popup modal window
  *
  * @since 1.90
  *
  * @return	string	HTML <form> markup for hidden form
  */
 public static function mla_terms_search_form()
 {
     $page_template_array = MLACore::mla_load_template('admin-terms-search-form.tpl');
     if (!is_array($page_template_array)) {
         /* translators: 1: ERROR tag 2: function name 3: non-array value */
         error_log(sprintf(_x('%1$s: %2$s non-array "%3$s"', 'error_log', 'media-library-assistant'), __('ERROR', 'media-library-assistant'), 'MLA::_build_terms_search_form', var_export($page_template_array, true)), 0);
         return '';
     }
     $taxonomies = array();
     foreach (get_object_taxonomies('attachment', 'objects') as $taxonomy) {
         if (MLACore::mla_taxonomy_support($taxonomy->name, 'support')) {
             $taxonomies[] = $taxonomy;
         }
     }
     if (empty($taxonomies)) {
         $page_values = array('Search Terms' => __('Search Terms', 'media-library-assistant'), 'message' => __('There are no taxonomies to search', 'media-library-assistant'));
         $terms_search_tpl = MLAData::mla_parse_template($page_template_array['mla-terms-search-empty-div'], $page_values);
     } else {
         $taxonomy_list = '';
         foreach ($taxonomies as $taxonomy) {
             $page_values = array('taxonomy_checked' => MLACore::mla_taxonomy_support($taxonomy->name, 'term-search') ? 'checked="checked"' : '', 'taxonomy_slug' => $taxonomy->name, 'taxonomy_label' => esc_attr($taxonomy->label));
             $taxonomy_list .= MLAData::mla_parse_template($page_template_array['mla-terms-search-taxonomy'], $page_values);
         }
         $page_values = array('Search Terms' => __('Search Terms', 'media-library-assistant'), 'Search' => __('Search', 'media-library-assistant'), 'phrases_and_checked' => 'checked="checked"', 'All phrases' => __('All phrases', 'media-library-assistant'), 'phrases_or_checked' => '', 'Any phrase' => __('Any phrase', 'media-library-assistant'), 'terms_and_checked' => '', 'All terms' => __('All terms', 'media-library-assistant'), 'terms_or_checked' => 'checked="checked"', 'Any term' => __('Any term', 'media-library-assistant'), 'exact_checked' => '', 'Exact' => __('Exact', 'media-library-assistant'), 'mla_terms_search_taxonomies' => $taxonomy_list);
         $terms_search_tpl = MLAData::mla_parse_template($page_template_array['mla-terms-search-div'], $page_values);
     }
     $page_values = array('mla_terms_search_url' => esc_url(add_query_arg(array_merge(MLA_List_Table::mla_submenu_arguments(false), array('page' => MLACore::ADMIN_PAGE_SLUG)), admin_url('upload.php'))), 'mla_terms_search_action' => MLA::MLA_ADMIN_TERMS_SEARCH, 'wpnonce' => wp_nonce_field(MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME, true, false), 'mla_terms_search_div' => $terms_search_tpl);
     $terms_search_tpl = MLAData::mla_parse_template($page_template_array['mla-terms-search-form'], $page_values);
     return $terms_search_tpl;
 }
 /**
  * Parses shortcode parameters and returns the gallery objects
  *
  * @since .50
  *
  * @param int Post ID of the parent
  * @param array Attributes of the shortcode
  * @param boolean true to calculate and return ['found_posts'] as an array element
  *
  * @return array List of attachments returned from WP_Query
  */
 public static function mla_get_shortcode_attachments($post_parent, $attr, $return_found_rows = NULL)
 {
     global $wp_query;
     /*
      * Parameters passed to the where and orderby filter functions
      */
     self::$query_parameters = array();
     /*
      * Parameters passed to the posts_search filter function in MLAData
      */
     MLAData::$search_parameters = array('debug' => 'none');
     /*
      * Make sure $attr is an array, even if it's empty
      */
     if (empty($attr)) {
         $attr = array();
     } elseif (is_string($attr)) {
         $attr = shortcode_parse_atts($attr);
     }
     /*
      * The "where used" queries have no $_REQUEST context available to them,
      * so tax_, date_ and meta_query evaluation will fail if they contain "{+request:"
      * parameters. Ignore these errors.
      */
     if (isset($attr['where_used_query']) && 'this-is-a-where-used-query' == $attr['where_used_query']) {
         $where_used_query = true;
         unset($attr['where_used_query']);
     } else {
         $where_used_query = false;
     }
     /*
      * Merge input arguments with defaults, then extract the query arguments.
      *
      * $return_found_rows is used to indicate that the call comes from gallery_shortcode(),
      * which is the only call that supplies it.
      */
     if (!is_null($return_found_rows)) {
         $attr = apply_filters('mla_gallery_query_attributes', $attr);
     }
     $arguments = shortcode_atts(self::$mla_get_shortcode_attachments_parameters, $attr);
     $mla_page_parameter = $arguments['mla_page_parameter'];
     unset($arguments['mla_page_parameter']);
     /*
      * $mla_page_parameter, if set, doesn't make it through the shortcode_atts filter,
      * so we handle it separately
      */
     if (!isset($arguments[$mla_page_parameter])) {
         if (isset($attr[$mla_page_parameter])) {
             $arguments[$mla_page_parameter] = $attr[$mla_page_parameter];
         } else {
             $arguments[$mla_page_parameter] = NULL;
         }
     }
     /*
     		 * 'RAND' is not documented in the codex, but is present in the code.
     		 * CODE REMOVED in WordPress 4.1
     		 * /
     		if ( 'RAND' == strtoupper( $arguments['order'] ) ) {
     			$arguments['orderby'] = 'none';
     			unset( $arguments['order'] );
     		} // */
     if (!empty($arguments['ids'])) {
         // 'ids' is explicitly ordered, unless you specify otherwise.
         if (empty($attr['orderby'])) {
             $arguments['orderby'] = 'post__in';
         }
         $arguments['include'] = $arguments['ids'];
     }
     unset($arguments['ids']);
     if (!is_null($return_found_rows)) {
         $arguments = apply_filters('mla_gallery_query_arguments', $arguments);
     }
     /*
      * Extract taxonomy arguments
      */
     $query_arguments = array();
     if (!empty($attr)) {
         $all_taxonomies = get_taxonomies(array('show_ui' => true), 'names');
         $simple_tax_queries = array();
         foreach ($attr as $key => $value) {
             if ('tax_query' == $key) {
                 if (is_array($value)) {
                     $query_arguments[$key] = $value;
                 } else {
                     $tax_query = NULL;
                     $value = self::_sanitize_query_specification($value);
                     /*
                      * Replace invalid queries from "where-used" callers with a harmless equivalent
                      */
                     if ($where_used_query && false !== strpos($value, '{+')) {
                         $value = "array( array( 'taxonomy' => 'none', 'field' => 'slug', 'terms' => 'none' ) )";
                     }
                     $function = @create_function('', 'return ' . $value . ';');
                     if (is_callable($function)) {
                         $tax_query = $function();
                     }
                     if (is_array($tax_query)) {
                         $query_arguments[$key] = $tax_query;
                         break;
                         // Done - the tax_query overrides all other taxonomy parameters
                     } else {
                         return '<p>' . __('ERROR', 'media-library-assistant') . ': ' . __('Invalid mla_gallery', 'media-library-assistant') . ' tax_query = ' . var_export($value, true) . '</p>';
                     }
                 }
                 // not array
             } elseif (array_key_exists($key, $all_taxonomies)) {
                 $simple_tax_queries[$key] = implode(',', array_filter(array_map('trim', explode(',', $value))));
             }
             // array_key_exists
         }
         //foreach $attr
         /*
          * One of five outcomes:
          * 1) An explicit tax_query was found; use it and ignore all other taxonomy parameters
          * 2) No tax query is present; no further processing required
          * 3) Two or more simple tax queries are present; compose a tax_query
          * 4) One simple tax query and (tax_operator or tax_include_children) are present; compose a tax_query
          * 5) One simple tax query is present; use it as-is or convert 'category' to 'category_name'
          */
         if (isset($query_arguments['tax_query']) || empty($simple_tax_queries)) {
             // No further action required
         } elseif (1 < count($simple_tax_queries) || isset($attr['tax_operator']) || isset($attr['tax_include_children'])) {
             // Build a tax_query
             if (1 < count($simple_tax_queries)) {
                 $tax_relation = 'AND';
                 if (isset($attr['tax_relation'])) {
                     if ('OR' == strtoupper($attr['tax_relation'])) {
                         $tax_relation = 'OR';
                     }
                 }
                 $tax_query = array('relation' => $tax_relation);
             } else {
                 $tax_query = array();
             }
             // Validate other tax_query parameters or set defaults
             $tax_operator = 'IN';
             if (isset($attr['tax_operator'])) {
                 $attr_value = strtoupper($attr['tax_operator']);
                 if (in_array($attr_value, array('IN', 'NOT IN', 'AND'))) {
                     $tax_operator = $attr_value;
                 }
             }
             $tax_include_children = true;
             if (isset($attr['tax_include_children'])) {
                 if ('FALSE' == strtoupper($attr['tax_include_children'])) {
                     $tax_include_children = false;
                 }
             }
             foreach ($simple_tax_queries as $key => $value) {
                 $tax_query[] = array('taxonomy' => $key, 'field' => 'slug', 'terms' => explode(',', $value), 'operator' => $tax_operator, 'include_children' => $tax_include_children);
             }
             $query_arguments['tax_query'] = $tax_query;
         } else {
             // exactly one simple query is present
             if (isset($simple_tax_queries['category'])) {
                 $arguments['category_name'] = $simple_tax_queries['category'];
             } else {
                 $query_arguments = $simple_tax_queries;
             }
         }
     }
     // ! empty
     /*
      * $query_arguments has been initialized in the taxonomy code above.
      */
     $is_tax_query = !($use_children = empty($query_arguments));
     foreach ($arguments as $key => $value) {
         /*
          * There are several "fallthru" cases in this switch statement that decide 
          * whether or not to limit the query to children of a specific post.
          */
         $children_ok = true;
         switch ($key) {
             case 'post_parent':
                 switch (strtolower($value)) {
                     case 'all':
                         $value = NULL;
                         $use_children = false;
                         break;
                     case 'any':
                         self::$query_parameters['post_parent'] = 'any';
                         $value = NULL;
                         $use_children = false;
                         break;
                     case 'current':
                         $value = $post_parent;
                         $use_children = true;
                         break;
                     case 'none':
                         self::$query_parameters['post_parent'] = 'none';
                         $value = NULL;
                         $use_children = false;
                         break;
                 }
                 // fallthru
             // fallthru
             case 'id':
                 if (is_numeric($value)) {
                     $query_arguments[$key] = intval($value);
                     if (!$children_ok) {
                         $use_children = false;
                     }
                 }
                 unset($arguments[$key]);
                 break;
             case 'numberposts':
             case 'posts_per_page':
             case 'posts_per_archive_page':
                 if (is_numeric($value)) {
                     $value = intval($value);
                     if (!empty($value)) {
                         $query_arguments[$key] = $value;
                     }
                 }
                 unset($arguments[$key]);
                 break;
             case 'meta_value_num':
                 $children_ok = false;
                 // fallthru
             // fallthru
             case 'offset':
                 if (is_numeric($value)) {
                     $query_arguments[$key] = intval($value);
                     if (!$children_ok) {
                         $use_children = false;
                     }
                 }
                 unset($arguments[$key]);
                 break;
             case 'paged':
                 if ('current' == strtolower($value)) {
                     /*
                      * Note: The query variable 'page' holds the pagenumber for a single paginated
                      * Post or Page that includes the <!--nextpage--> Quicktag in the post content. 
                      */
                     if (get_query_var('page')) {
                         $query_arguments[$key] = get_query_var('page');
                     } else {
                         $query_arguments[$key] = get_query_var('paged') ? get_query_var('paged') : 1;
                     }
                 } elseif (is_numeric($value)) {
                     $query_arguments[$key] = intval($value);
                 } elseif ('' === $value) {
                     $query_arguments[$key] = 1;
                 }
                 unset($arguments[$key]);
                 break;
             case $mla_page_parameter:
             case 'mla_paginate_total':
                 if (is_numeric($value)) {
                     $query_arguments[$key] = intval($value);
                 } elseif ('' === $value) {
                     $query_arguments[$key] = 1;
                 }
                 unset($arguments[$key]);
                 break;
             case 'author':
             case 'cat':
             case 'tag_id':
                 if (!empty($value)) {
                     if (is_array($value)) {
                         $query_arguments[$key] = array_filter($value);
                     } else {
                         $query_arguments[$key] = array_filter(array_map('intval', explode(",", $value)));
                     }
                     if (1 == count($query_arguments[$key])) {
                         $query_arguments[$key] = $query_arguments[$key][0];
                     } else {
                         $query_arguments[$key] = implode(',', $query_arguments[$key]);
                     }
                     $use_children = false;
                 }
                 unset($arguments[$key]);
                 break;
             case 'category__and':
             case 'category__in':
             case 'category__not_in':
             case 'tag__and':
             case 'tag__in':
             case 'tag__not_in':
             case 'include':
                 $children_ok = false;
                 // fallthru
             // fallthru
             case 'exclude':
                 if (!empty($value)) {
                     if (is_array($value)) {
                         $value = array_filter($value);
                     } else {
                         $value = array_filter(array_map('intval', explode(",", $value)));
                     }
                     if (!empty($value)) {
                         $query_arguments[$key] = $value;
                         if (!$children_ok) {
                             $use_children = false;
                         }
                     }
                 }
                 unset($arguments[$key]);
                 break;
             case 'tag_slug__and':
             case 'tag_slug__in':
                 if (!empty($value)) {
                     if (is_array($value)) {
                         $query_arguments[$key] = $value;
                     } else {
                         $query_arguments[$key] = array_filter(array_map('trim', explode(",", $value)));
                     }
                     $use_children = false;
                 }
                 unset($arguments[$key]);
                 break;
             case 'nopaging':
                 // boolean value, default false
                 if (!empty($value) && 'false' != strtolower($value)) {
                     $query_arguments[$key] = true;
                 }
                 unset($arguments[$key]);
                 break;
                 // boolean values, default true
             // boolean values, default true
             case 'cache_results':
             case 'update_post_meta_cache':
             case 'update_post_term_cache':
                 if (!empty($value) && 'true' != strtolower($value)) {
                     $query_arguments[$key] = false;
                 }
                 unset($arguments[$key]);
                 break;
             case 'sentence':
             case 'exact':
                 if (!empty($value) && 'true' == strtolower($value)) {
                     MLAData::$search_parameters[$key] = true;
                 } else {
                     MLAData::$search_parameters[$key] = false;
                 }
                 unset($arguments[$key]);
                 break;
             case 'mla_search_connector':
             case 'mla_phrase_connector':
             case 'mla_term_connector':
                 if (!empty($value) && 'OR' == strtoupper($value)) {
                     MLAData::$search_parameters[$key] = 'OR';
                 } else {
                     MLAData::$search_parameters[$key] = 'AND';
                 }
                 unset($arguments[$key]);
                 break;
             case 'mla_terms_phrases':
                 $children_ok = false;
                 // fallthru
             // fallthru
             case 'mla_terms_taxonomies':
             case 'mla_search_fields':
                 if (!empty($value)) {
                     MLAData::$search_parameters[$key] = $value;
                     if (!$children_ok) {
                         $use_children = false;
                     }
                 }
                 unset($arguments[$key]);
                 break;
             case 's':
                 MLAData::$search_parameters['s'] = $value;
                 // fallthru
             // fallthru
             case 'author_name':
             case 'category_name':
             case 'tag':
             case 'meta_key':
             case 'meta_value':
             case 'meta_compare':
                 $children_ok = false;
                 // fallthru
             // fallthru
             case 'post_type':
             case 'post_status':
             case 'post_mime_type':
             case 'orderby':
                 if (!empty($value)) {
                     $query_arguments[$key] = $value;
                     if (!$children_ok) {
                         $use_children = false;
                     }
                 }
                 unset($arguments[$key]);
                 break;
             case 'order':
                 if (!empty($value)) {
                     $value = strtoupper($value);
                     if (in_array($value, array('ASC', 'DESC'))) {
                         $query_arguments[$key] = $value;
                     }
                 }
                 unset($arguments[$key]);
                 break;
             case 'date_query':
                 if (!empty($value)) {
                     if (is_array($value)) {
                         $query_arguments[$key] = $value;
                     } else {
                         $date_query = NULL;
                         $value = self::_sanitize_query_specification($value);
                         /*
                          * Replace invalid queries from "where-used" callers with a harmless equivalent
                          */
                         if ($where_used_query && false !== strpos($value, '{+')) {
                             $value = "array( array( 'key' => 'unlikely', 'value' => 'none or otherwise unlikely' ) )";
                         }
                         $function = @create_function('', 'return ' . $value . ';');
                         if (is_callable($function)) {
                             $date_query = $function();
                         }
                         if (is_array($date_query)) {
                             $query_arguments[$key] = $date_query;
                         } else {
                             return '<p>' . __('ERROR', 'media-library-assistant') . ': ' . __('Invalid mla_gallery', 'media-library-assistant') . ' date_query = ' . var_export($value, true) . '</p>';
                         }
                     }
                     // not array
                     $use_children = false;
                 }
                 unset($arguments[$key]);
                 break;
             case 'meta_query':
                 if (!empty($value)) {
                     if (is_array($value)) {
                         $query_arguments[$key] = $value;
                     } else {
                         $meta_query = NULL;
                         $value = self::_sanitize_query_specification($value);
                         /*
                          * Replace invalid queries from "where-used" callers with a harmless equivalent
                          */
                         if ($where_used_query && false !== strpos($value, '{+')) {
                             $value = "array( array( 'key' => 'unlikely', 'value' => 'none or otherwise unlikely' ) )";
                         }
                         $function = @create_function('', 'return ' . $value . ';');
                         if (is_callable($function)) {
                             $meta_query = $function();
                         }
                         if (is_array($meta_query)) {
                             $query_arguments[$key] = $meta_query;
                         } else {
                             return '<p>' . __('ERROR', 'media-library-assistant') . ': ' . __('Invalid mla_gallery', 'media-library-assistant') . ' meta_query = ' . var_export($value, true) . '</p>';
                         }
                     }
                     // not array
                     $use_children = false;
                 }
                 unset($arguments[$key]);
                 break;
             case 'fields':
                 if (!empty($value)) {
                     $value = strtolower($value);
                     if (in_array($value, array('ids', 'id=>parent'))) {
                         $query_arguments[$key] = $value;
                     }
                 }
                 unset($arguments[$key]);
                 break;
             default:
                 // ignore anything else
         }
         // switch $key
     }
     // foreach $arguments
     /*
      * Decide whether to use a "get_children" style query
      */
     self::$query_parameters['disable_tax_join'] = $is_tax_query && !$use_children;
     if ($use_children && !isset($query_arguments['post_parent'])) {
         if (!isset($query_arguments['id'])) {
             $query_arguments['post_parent'] = $post_parent;
         } else {
             $query_arguments['post_parent'] = $query_arguments['id'];
         }
         unset($query_arguments['id']);
     }
     if (isset($query_arguments['numberposts']) && !isset($query_arguments['posts_per_page'])) {
         $query_arguments['posts_per_page'] = $query_arguments['numberposts'];
     }
     unset($query_arguments['numberposts']);
     /*
      * MLA pagination will override WordPress pagination
      */
     if (isset($query_arguments[$mla_page_parameter])) {
         unset($query_arguments['nopaging']);
         unset($query_arguments['offset']);
         unset($query_arguments['paged']);
         if (isset($query_arguments['mla_paginate_total']) && $query_arguments[$mla_page_parameter] > $query_arguments['mla_paginate_total']) {
             $query_arguments['offset'] = 0x7fffffff;
             // suppress further output
         } else {
             $query_arguments['paged'] = $query_arguments[$mla_page_parameter];
         }
     } else {
         if (isset($query_arguments['posts_per_page']) || isset($query_arguments['posts_per_archive_page']) || isset($query_arguments['paged']) || isset($query_arguments['offset'])) {
             unset($query_arguments['nopaging']);
         }
     }
     unset($query_arguments[$mla_page_parameter]);
     unset($query_arguments['mla_paginate_total']);
     if (isset($query_arguments['post_mime_type']) && 'all' == strtolower($query_arguments['post_mime_type'])) {
         unset($query_arguments['post_mime_type']);
     }
     if (!empty($query_arguments['include'])) {
         $incposts = wp_parse_id_list($query_arguments['include']);
         $query_arguments['posts_per_page'] = count($incposts);
         // only the number of posts included
         $query_arguments['post__in'] = $incposts;
         unset($query_arguments['include']);
     } elseif (!empty($query_arguments['exclude'])) {
         $query_arguments['post__not_in'] = wp_parse_id_list($query_arguments['exclude']);
         unset($query_arguments['exclude']);
     }
     $query_arguments['ignore_sticky_posts'] = true;
     $query_arguments['no_found_rows'] = is_null($return_found_rows) ? true : !$return_found_rows;
     /*
      * We will always handle "orderby" in our filter
      */
     self::$query_parameters['orderby'] = self::_validate_sql_orderby($query_arguments);
     if (false === self::$query_parameters['orderby']) {
         unset(self::$query_parameters['orderby']);
     }
     unset($query_arguments['orderby']);
     unset($query_arguments['order']);
     if (self::$mla_debug) {
         add_filter('posts_clauses', 'MLAShortcodes::mla_shortcode_query_posts_clauses_filter', 0x7fffffff, 1);
         add_filter('posts_clauses_request', 'MLAShortcodes::mla_shortcode_query_posts_clauses_request_filter', 0x7fffffff, 1);
     }
     add_filter('posts_join', 'MLAShortcodes::mla_shortcode_query_posts_join_filter', 0x7fffffff, 1);
     add_filter('posts_where', 'MLAShortcodes::mla_shortcode_query_posts_where_filter', 0x7fffffff, 1);
     add_filter('posts_orderby', 'MLAShortcodes::mla_shortcode_query_posts_orderby_filter', 0x7fffffff, 1);
     /*
      * Handle the keyword and terms search in the posts_search filter.
      * One or both of 'mla_terms_phrases' and 's' must be present to
      * trigger the search.
      */
     if (empty(MLAData::$search_parameters['mla_terms_phrases']) && empty(MLAData::$search_parameters['s'])) {
         MLAData::$search_parameters = array('debug' => 'none');
     } else {
         /*
          * Convert Terms Search parameters to the filter's requirements.
          * mla_terms_taxonomies is shared with keyword search.
          */
         if (empty(MLAData::$search_parameters['mla_terms_taxonomies'])) {
             MLAData::$search_parameters['mla_terms_search']['taxonomies'] = MLAOptions::mla_supported_taxonomies('term-search');
         } else {
             MLAData::$search_parameters['mla_terms_search']['taxonomies'] = array_filter(array_map('trim', explode(',', MLAData::$search_parameters['mla_terms_taxonomies'])));
         }
         if (!empty(MLAData::$search_parameters['mla_terms_phrases'])) {
             MLAData::$search_parameters['mla_terms_search']['phrases'] = MLAData::$search_parameters['mla_terms_phrases'];
             if (empty(MLAData::$search_parameters['mla_phrase_connector'])) {
                 MLAData::$search_parameters['mla_terms_search']['radio_phrases'] = 'AND';
             } else {
                 MLAData::$search_parameters['mla_terms_search']['radio_phrases'] = MLAData::$search_parameters['mla_phrase_connector'];
             }
             if (empty(MLAData::$search_parameters['mla_term_connector'])) {
                 MLAData::$search_parameters['mla_terms_search']['radio_terms'] = 'OR';
             } else {
                 MLAData::$search_parameters['mla_terms_search']['radio_terms'] = MLAData::$search_parameters['mla_phrase_connector'];
             }
         }
         unset(MLAData::$search_parameters['mla_terms_phrases']);
         unset(MLAData::$search_parameters['mla_terms_taxonomies']);
         unset(MLAData::$search_parameters['mla_phrase_connector']);
         unset(MLAData::$search_parameters['mla_term_connector']);
         if (empty(MLAData::$search_parameters['mla_search_fields'])) {
             MLAData::$search_parameters['mla_search_fields'] = array('title', 'content');
         } else {
             MLAData::$search_parameters['mla_search_fields'] = array_filter(array_map('trim', explode(',', MLAData::$search_parameters['mla_search_fields'])));
             MLAData::$search_parameters['mla_search_fields'] = array_intersect(array('title', 'content', 'excerpt', 'name', 'terms'), MLAData::$search_parameters['mla_search_fields']);
             /*
              * Look for keyword search including 'terms' 
              */
             foreach (MLAData::$search_parameters['mla_search_fields'] as $index => $field) {
                 if ('terms' == $field) {
                     if (isset(MLAData::$search_parameters['mla_terms_search']['phrases'])) {
                         /*
                          * The Terms Search overrides any terms-based keyword search for now; too complicated.
                          */
                         unset(MLAData::$search_parameters['mla_search_fields'][$index]);
                     } else {
                         MLAData::$search_parameters['mla_search_taxonomies'] = MLAData::$search_parameters['mla_terms_search']['taxonomies'];
                         unset(MLAData::$search_parameters['mla_terms_search']['taxonomies']);
                     }
                 }
                 // terms in search fields
             }
         }
         // mla_search_fields present
         if (empty(MLAData::$search_parameters['mla_search_connector'])) {
             MLAData::$search_parameters['mla_search_connector'] = 'AND';
         }
         if (empty(MLAData::$search_parameters['sentence'])) {
             MLAData::$search_parameters['sentence'] = false;
         }
         if (empty(MLAData::$search_parameters['exact'])) {
             MLAData::$search_parameters['exact'] = false;
         }
         MLAData::$search_parameters['debug'] = self::$mla_debug ? 'shortcode' : 'none';
         add_filter('posts_search', 'MLAData::mla_query_posts_search_filter', 10, 2);
         add_filter('posts_groupby', 'MLAData::mla_query_posts_groupby_filter');
     }
     if (self::$mla_debug) {
         global $wp_filter;
         foreach ($wp_filter['posts_where'] as $priority => $filters) {
             $debug_message = '<strong>mla_debug $wp_filter[posts_where]</strong> priority = ' . var_export($priority, true) . '<br />';
             foreach ($filters as $name => $descriptor) {
                 $debug_message .= 'filter name = ' . var_export($name, true) . '<br />';
             }
             MLA::mla_debug_add($debug_message);
         }
         foreach ($wp_filter['posts_orderby'] as $priority => $filters) {
             $debug_message = '<strong>mla_debug $wp_filter[posts_orderby]</strong> priority = ' . var_export($priority, true) . '<br />';
             foreach ($filters as $name => $descriptor) {
                 $debug_message .= 'filter name = ' . var_export($name, true) . '<br />';
             }
             MLA::mla_debug_add($debug_message);
         }
     }
     /*
      * Disable Relevanssi - A Better Search, v3.2 by Mikko Saari 
      * relevanssi_prevent_default_request( $request, $query )
      * apply_filters('relevanssi_admin_search_ok', $admin_search_ok, $query );
      */
     if (function_exists('relevanssi_prevent_default_request')) {
         add_filter('relevanssi_admin_search_ok', 'MLAData::mla_query_relevanssi_admin_search_ok_filter');
     }
     self::$mla_gallery_wp_query_object = new WP_Query();
     $attachments = self::$mla_gallery_wp_query_object->query($query_arguments);
     /*
      * $return_found_rows is used to indicate that the call comes from gallery_shortcode(),
      * which is the only call that supplies it.
      */
     if (is_null($return_found_rows)) {
         $return_found_rows = false;
     } else {
         do_action('mla_gallery_wp_query_object', $query_arguments);
     }
     if ($return_found_rows) {
         $attachments['found_rows'] = self::$mla_gallery_wp_query_object->found_posts;
     }
     if (!empty(MLAData::$search_parameters)) {
         remove_filter('posts_search', 'MLAData::mla_query_posts_search_filter');
     }
     if (function_exists('relevanssi_prevent_default_request')) {
         remove_filter('relevanssi_admin_search_ok', 'MLAData::mla_query_relevanssi_admin_search_ok_filter');
     }
     remove_filter('posts_join', 'MLAShortcodes::mla_shortcode_query_posts_join_filter', 0x7fffffff);
     remove_filter('posts_where', 'MLAShortcodes::mla_shortcode_query_posts_where_filter', 0x7fffffff);
     remove_filter('posts_orderby', 'MLAShortcodes::mla_shortcode_query_posts_orderby_filter', 0x7fffffff);
     if (self::$mla_debug) {
         remove_filter('posts_clauses', 'MLAShortcodes::mla_shortcode_query_posts_clauses_filter', 0x7fffffff);
         remove_filter('posts_clauses_request', 'MLAShortcodes::mla_shortcode_query_posts_clauses_request_filter', 0x7fffffff);
         MLA::mla_debug_add('<strong>' . __('mla_debug query', 'media-library-assistant') . '</strong> = ' . var_export($query_arguments, true));
         MLA::mla_debug_add('<strong>' . __('mla_debug request', 'media-library-assistant') . '</strong> = ' . var_export(self::$mla_gallery_wp_query_object->request, true));
         MLA::mla_debug_add('<strong>' . __('mla_debug query_vars', 'media-library-assistant') . '</strong> = ' . var_export(self::$mla_gallery_wp_query_object->query_vars, true));
         MLA::mla_debug_add('<strong>' . __('mla_debug post_count', 'media-library-assistant') . '</strong> = ' . var_export(self::$mla_gallery_wp_query_object->post_count, true));
     }
     self::$mla_gallery_wp_query_object = NULL;
     return $attachments;
 }
 /**
  * Renders the Settings/Media Library Assistant "Language" tab
  *
  * @since 2.11
  *
  * @return	array	( 'message' => '', 'body' => '' )
  */
 public static function mla_render_language_tab()
 {
     $page_content = array('message' => '', 'body' => '<h2>' . __('Language', 'media-library-assistant') . '</h2>');
     /*
      * Check for submit buttons to change or reset settings.
      * Initialize page messages and content.
      */
     if (!empty($_REQUEST['mla-language-options-save'])) {
         check_admin_referer(MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME);
         $page_content = self::_save_language_settings();
     } elseif (!empty($_REQUEST['mla-language-options-reset'])) {
         check_admin_referer(MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME);
         $page_content = self::_reset_language_settings();
     } else {
         $page_content = array('message' => '', 'body' => '');
     }
     if (!empty($page_content['body'])) {
         return $page_content;
     }
     /*
      * Find WPML Media plugin status
      */
     $installed = false;
     $active = false;
     $wpml_media = SitePress::get_installed_plugins();
     if (isset($wpml_media['WPML Media'])) {
         $wpml_media = $wpml_media['WPML Media'];
         if (!empty($wpml_media['plugin'])) {
             $installed = true;
             $active = isset($wpml_media['file']) && is_plugin_active($wpml_media['file']);
         }
     }
     $wpml_media = '';
     if (!$installed) {
         $wpml_media = '<p><strong>' . __('WARNING:', 'media-library-assistant') . __(' WPML Media is not installed.', 'media-library-assistant') . '</strong></p>';
     } elseif (!$active) {
         $wpml_media = '<p><strong>' . __('WARNING:', 'media-library-assistant') . __(' WPML Media is not active.', 'media-library-assistant') . '</strong></p>';
     }
     $page_values = array('Language Options' => __('Language Options', 'media-library-assistant'), 'In this tab' => sprintf(__('In this tab you can find a number of options for controlling WPML-specific operations. Scroll down to find options for %1$s and %2$s. Be sure to click "Save Changes" at the bottom of the tab to save any changes you make.', 'media-library-assistant'), '<strong>' . __('Media/Assistant submenu table', 'media-library-assistant') . '</strong>', '<strong>' . __('Term Management', 'media-library-assistant') . '</strong>'), 'You can find' => sprintf(__('You can find more information about multilingual features in the %1$s section of the Documentation.', 'media-library-assistant'), '<a href="[+settingsURL+]?page=mla-settings-menu-documentation&amp;mla_tab=documentation#mla_language_tab" title="' . __('Language Options documentation', 'media-library-assistant') . '">' . __('WPML &amp; Polylang Multilingual Support; the MLA Language Tab', 'media-library-assistant') . '</a>'), 'WPML Status' => $wpml_media, 'settingsURL' => admin_url('options-general.php'), 'Save Changes' => __('Save Changes', 'media-library-assistant'), 'Delete Language options' => __('Delete Language options and restore default settings', 'media-library-assistant'), '_wpnonce' => wp_nonce_field(MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME, true, false), '_wp_http_referer' => wp_referer_field(false), 'Go to Top' => __('Go to Top', 'media-library-assistant'), 'form_url' => admin_url('options-general.php') . '?page=mla-settings-menu-language&mla_tab=language', 'options_list' => '');
     $options_list = '';
     foreach (MLA_WPML::$mla_language_option_definitions as $key => $value) {
         if ('language' == $value['tab']) {
             $options_list .= MLASettings::mla_compose_option_row($key, $value, MLA_WPML::$mla_language_option_definitions);
         }
     }
     $page_values['options_list'] = $options_list;
     $page_template = MLACore::mla_load_template('admin-display-language-tab.tpl');
     $page_content['body'] = MLAData::mla_parse_template($page_template, $page_values);
     return $page_content;
 }
 /**
  * Render and manage iptc/exif support options
  *
  * @since 1.00
  * @uses $mla_option_templates contains row and table templates
  *
  * @param	string 	'render', 'update', 'delete', or 'reset'
  * @param	string 	option name, e.g., 'iptc_exif_mapping'
  * @param	array 	option parameters
  * @param	array 	Optional. null (default) for 'render' else option data, e.g., $_REQUEST
  *
  * @return	string	HTML table row markup for 'render' else message(s) reflecting the results of the operation.
  */
 public static function mla_iptc_exif_option_handler($action, $key, $value, $args = null)
 {
     $current_values = self::mla_get_option('iptc_exif_mapping');
     switch ($action) {
         case 'render':
             switch ($key) {
                 case 'iptc_exif_standard_mapping':
                     $row_template = self::$mla_option_templates['iptc-exif-standard-row'];
                     $table_rows = '';
                     foreach ($current_values['standard'] as $row_name => $row_value) {
                         $row_values = array('key' => $row_name, 'name' => $row_value['name'], 'iptc_field_options' => self::_compose_iptc_option_list($row_value['iptc_value']), 'exif_size' => self::MLA_EXIF_SIZE, 'exif_text' => $row_value['exif_value'], 'iptc_selected' => '', 'exif_selected' => '', 'keep_selected' => '', 'replace_selected' => '');
                         if ($row_value['iptc_first']) {
                             $row_values['iptc_selected'] = 'selected="selected"';
                         } else {
                             $row_values['exif_selected'] = 'selected="selected"';
                         }
                         if ($row_value['keep_existing']) {
                             $row_values['keep_selected'] = 'selected="selected"';
                         } else {
                             $row_values['replace_selected'] = 'selected="selected"';
                         }
                         $table_rows .= MLAData::mla_parse_template($row_template, $row_values);
                     }
                     // foreach row
                     $option_values = array('table_rows' => $table_rows, 'help' => $value['help']);
                     return MLAData::mla_parse_template(self::$mla_option_templates['iptc-exif-standard-table'], $option_values);
                 case 'iptc_exif_taxonomy_mapping':
                     $row_template = self::$mla_option_templates['iptc-exif-taxonomy-row'];
                     $select_template = self::$mla_option_templates['iptc-exif-select'];
                     $table_rows = '';
                     $taxonomies = get_taxonomies(array('show_ui' => true), 'objects');
                     foreach ($taxonomies as $row_name => $row_value) {
                         $row_values = array('key' => $row_name, 'name' => esc_html($row_value->labels->name), 'hierarchical' => (string) $row_value->hierarchical, 'iptc_field_options' => '', 'exif_size' => self::MLA_EXIF_SIZE, 'exif_text' => '', 'iptc_selected' => '', 'exif_selected' => '', 'keep_selected' => '', 'replace_selected' => '', 'parent_select' => '');
                         if (array_key_exists($row_name, $current_values['taxonomy'])) {
                             $current_value = $current_values['taxonomy'][$row_name];
                             $row_values['iptc_field_options'] = self::_compose_iptc_option_list($current_value['iptc_value']);
                             $row_values['exif_text'] = $current_value['exif_value'];
                             if ($current_value['iptc_first']) {
                                 $row_values['iptc_selected'] = 'selected="selected"';
                             } else {
                                 $row_values['exif_selected'] = 'selected="selected"';
                             }
                             if ($current_value['keep_existing']) {
                                 $row_values['keep_selected'] = 'selected="selected"';
                             } else {
                                 $row_values['replace_selected'] = 'selected="selected"';
                             }
                             if ($row_value->hierarchical) {
                                 $parent = isset($current_value['parent']) ? (int) $current_value['parent'] : 0;
                                 $select_values = array('array' => 'taxonomy', 'key' => $row_name, 'element' => 'parent', 'options' => self::_compose_parent_option_list($row_name, $parent));
                                 $row_values['parent_select'] = MLAData::mla_parse_template($select_template, $select_values);
                             }
                         } else {
                             $row_values['iptc_field_options'] = self::_compose_iptc_option_list('none');
                             $row_values['iptc_selected'] = 'selected="selected"';
                             $row_values['keep_selected'] = 'selected="selected"';
                             if ($row_value->hierarchical) {
                                 $select_values = array('array' => 'taxonomy', 'key' => $row_name, 'element' => 'parent', 'options' => self::_compose_parent_option_list($row_name, 0));
                                 $row_values['parent_select'] = MLAData::mla_parse_template($select_template, $select_values);
                             }
                         }
                         $table_rows .= MLAData::mla_parse_template($row_template, $row_values);
                     }
                     // foreach row
                     $option_values = array('table_rows' => $table_rows, 'help' => $value['help']);
                     return MLAData::mla_parse_template(self::$mla_option_templates['iptc-exif-taxonomy-table'], $option_values);
                 case 'iptc_exif_custom_mapping':
                     if (empty($current_values['custom'])) {
                         $table_rows = MLAData::mla_parse_template(self::$mla_option_templates['iptc-exif-custom-empty-row'], array('column_count' => 5));
                     } else {
                         $row_template = self::$mla_option_templates['iptc-exif-custom-rule-row'];
                         $table_rows = '';
                     }
                     /*
                      * One row for each existing rule
                      */
                     ksort($current_values['custom']);
                     foreach ($current_values['custom'] as $row_name => $current_value) {
                         $row_values = array('column_count' => 5, 'key' => $row_name, 'name' => $row_name, 'iptc_field_options' => '', 'exif_size' => self::MLA_EXIF_SIZE, 'exif_text' => '', 'iptc_selected' => '', 'exif_selected' => '', 'keep_selected' => '', 'replace_selected' => '');
                         $row_values['iptc_field_options'] = self::_compose_iptc_option_list($current_value['iptc_value']);
                         $row_values['exif_text'] = $current_value['exif_value'];
                         if ($current_value['iptc_first']) {
                             $row_values['iptc_selected'] = 'selected="selected"';
                         } else {
                             $row_values['exif_selected'] = 'selected="selected"';
                         }
                         if ($current_value['keep_existing']) {
                             $row_values['keep_selected'] = 'selected="selected"';
                         } else {
                             $row_values['replace_selected'] = 'selected="selected"';
                         }
                         $table_rows .= MLAData::mla_parse_template($row_template, $row_values);
                     }
                     // foreach existing rule
                     /*
                      * Add a row for defining a new rule, existing Custom Field
                      */
                     $row_template = self::$mla_option_templates['iptc-exif-custom-new-rule-row'];
                     $row_values = array('column_count' => 5, 'key' => self::MLA_NEW_CUSTOM_RULE, 'field_name_options' => self::_compose_custom_field_option_list('none', $current_values['custom']), 'iptc_field_options' => self::_compose_iptc_option_list('none'), 'exif_size' => self::MLA_EXIF_SIZE, 'exif_text' => '', 'iptc_selected' => 'selected="selected"', 'exif_selected' => '', 'keep_selected' => 'selected="selected"', 'replace_selected' => '');
                     $table_rows .= MLAData::mla_parse_template($row_template, $row_values);
                     /*
                      * Add a row for defining a new rule, new Custom Field
                      */
                     $row_template = self::$mla_option_templates['iptc-exif-custom-new-field-row'];
                     $row_values = array('column_count' => 5, 'key' => self::MLA_NEW_CUSTOM_FIELD, 'field_name_size' => '24', 'iptc_field_options' => self::_compose_iptc_option_list('none'), 'exif_size' => self::MLA_EXIF_SIZE, 'exif_text' => '', 'iptc_selected' => 'selected="selected"', 'exif_selected' => '', 'keep_selected' => 'selected="selected"', 'replace_selected' => '');
                     $table_rows .= MLAData::mla_parse_template($row_template, $row_values);
                     $option_values = array('table_rows' => $table_rows, 'help' => $value['help']);
                     return MLAData::mla_parse_template(self::$mla_option_templates['iptc-exif-custom-table'], $option_values);
                 default:
                     return "<br>ERROR: Render unknown custom {$key}\r\n";
             }
             // switch $key
         // switch $key
         case 'update':
         case 'delete':
             $settings_changed = false;
             $messages = '';
             switch ($key) {
                 case 'iptc_exif_standard_mapping':
                     $results = self::_update_iptc_exif_standard_mapping($current_values, $args);
                     $messages .= $results['message'];
                     $current_values = $results['values'];
                     $settings_changed = $results['changed'];
                     break;
                 case 'iptc_exif_taxonomy_mapping':
                     $results = self::_update_iptc_exif_taxonomy_mapping($current_values, $args);
                     $messages .= $results['message'];
                     $current_values = $results['values'];
                     $settings_changed = $results['changed'];
                     break;
                 case 'iptc_exif_custom_mapping':
                     $results = self::_update_iptc_exif_custom_mapping($current_values, $args);
                     $messages .= $results['message'];
                     $current_values = $results['values'];
                     $settings_changed = $results['changed'];
                     break;
                 case 'iptc_exif_mapping':
                     $results = self::_update_iptc_exif_standard_mapping($current_values, $args);
                     $messages .= $results['message'];
                     $current_values = $results['values'];
                     $settings_changed = $results['changed'];
                     $results = self::_update_iptc_exif_taxonomy_mapping($current_values, $args);
                     $messages .= $results['message'];
                     $current_values = $results['values'];
                     $settings_changed |= $results['changed'];
                     $results = self::_update_iptc_exif_custom_mapping($current_values, $args);
                     $messages .= $results['message'];
                     $current_values = $results['values'];
                     $settings_changed |= $results['changed'];
                     break;
                 default:
                     return "<br>ERROR: Update/delete unknown custom {$key}\r\n";
             }
             // switch $key
             if ($settings_changed) {
                 $settings_changed = MLAOptions::mla_update_option('iptc_exif_mapping', $current_values);
                 if ($settings_changed) {
                     $results = "IPTC/EXIF mapping settings updated.\r\n";
                 } else {
                     $results = "ERROR: IPTC/EXIF settings update failed.\r\n";
                 }
             } else {
                 $results = "IPTC/EXIF no mapping changes detected.\r\n";
             }
             return $results . $messages;
         case 'reset':
             switch ($key) {
                 case 'iptc_exif_standard_mapping':
                     $current_values['standard'] = self::$mla_option_definitions['iptc_exif_mapping']['std']['standard'];
                     $settings_changed = MLAOptions::mla_update_option('iptc_exif_mapping', $current_values);
                     if ($settings_changed) {
                         return "IPTC/EXIF Standard field settings saved.\r\n";
                     } else {
                         return "ERROR: IPTC/EXIF Standard field settings update failed.\r\n";
                     }
                 case 'iptc_exif_taxonomy_mapping':
                     $current_values['taxonomy'] = self::$mla_option_definitions['iptc_exif_mapping']['std']['taxonomy'];
                     $settings_changed = MLAOptions::mla_update_option('iptc_exif_mapping', $current_values);
                     if ($settings_changed) {
                         return "IPTC/EXIF Taxonomy term settings saved.\r\n";
                     } else {
                         return "ERROR: IPTC/EXIF Taxonomy term settings update failed.\r\n";
                     }
                 case 'iptc_exif_custom_mapping':
                     $current_values['custom'] = self::$mla_option_definitions['iptc_exif_mapping']['std']['custom'];
                     $settings_changed = MLAOptions::mla_update_option('iptc_exif_mapping', $current_values);
                     if ($settings_changed) {
                         return "IPTC/EXIF Custom field settings saved.\r\n";
                     } else {
                         return "ERROR: IPTC/EXIF Custom field settings reset failed.\r\n";
                     }
                 case 'iptc_exif_mapping':
                     self::mla_delete_option($key);
                     return "<br>Reset custom {$key}\r\n";
                 default:
                     return "<br>ERROR: Reset unknown custom {$key}\r\n";
             }
             // switch $key
         // switch $key
         default:
             return "<br>ERROR: Custom {$key} unknown action: {$action}\r\n";
     }
     // switch $action
 }
 /**
  * Handles pagnation output types 'previous_page', 'next_page', and 'paginate_links'
  *
  * @since 2.20
  *
  * @param array	value(s) for mla_output_type parameter
  * @param string template substitution values, e.g., ('instance' => '1', ...  )
  * @param string merged default and passed shortcode parameter values
  * @param string raw passed shortcode parameter values
  * @param integer number of attachments in the gallery, without pagination
  * @param string output text so far, may include debug values
  *
  * @return mixed	false or string with HTML for pagination output types
  */
 private static function _process_pagination_output_types($output_parameters, $markup_values, $arguments, $attr, $found_rows, $output = '')
 {
     if (!in_array($output_parameters[0], array('previous_page', 'next_page', 'paginate_links'))) {
         return false;
     }
     /*
      * Add data selection parameters to gallery-specific and mla_gallery-specific parameters
      */
     $arguments = array_merge($arguments, shortcode_atts(self::$mla_get_shortcode_attachments_parameters, $attr));
     $posts_per_page = absint($arguments['posts_per_page']);
     $mla_page_parameter = $arguments['mla_page_parameter'];
     /*
      * $mla_page_parameter, if set, doesn't make it through the shortcode_atts filter,
      * so we handle it separately
      */
     if (!isset($arguments[$mla_page_parameter])) {
         if (isset($attr[$mla_page_parameter])) {
             $arguments[$mla_page_parameter] = $attr[$mla_page_parameter];
         } else {
             $arguments[$mla_page_parameter] = '';
         }
     }
     if (0 == $posts_per_page) {
         $posts_per_page = absint($arguments['numberposts']);
     }
     if (0 == $posts_per_page) {
         $posts_per_page = absint(get_option('posts_per_page'));
     }
     if (0 < $posts_per_page) {
         $max_page = floor($found_rows / $posts_per_page);
         if ($max_page < $found_rows / $posts_per_page) {
             $max_page++;
         }
     } else {
         $max_page = 1;
     }
     if (isset($arguments['mla_paginate_total']) && $max_page > absint($arguments['mla_paginate_total'])) {
         $max_page = absint($arguments['mla_paginate_total']);
     }
     if (isset($arguments[$mla_page_parameter])) {
         $paged = absint($arguments[$mla_page_parameter]);
     } else {
         $paged = absint($arguments['paged']);
     }
     if (0 == $paged) {
         $paged = 1;
     }
     if ($max_page < $paged) {
         $paged = $max_page;
     }
     switch ($output_parameters[0]) {
         case 'previous_page':
             if (1 < $paged) {
                 $new_page = $paged - 1;
             } else {
                 $new_page = 0;
                 if (isset($output_parameters[1])) {
                     switch ($output_parameters[1]) {
                         case 'wrap':
                             $new_page = $max_page;
                             break;
                         case 'first':
                             $new_page = 1;
                     }
                 }
             }
             break;
         case 'next_page':
             if ($paged < $max_page) {
                 $new_page = $paged + 1;
             } else {
                 $new_page = 0;
                 if (isset($output_parameters[1])) {
                     switch ($output_parameters[1]) {
                         case 'last':
                             $new_page = $max_page;
                             break;
                         case 'wrap':
                             $new_page = 1;
                     }
                 }
             }
             break;
         case 'paginate_links':
             $new_page = 0;
     }
     $markup_values['current_page'] = $paged;
     $markup_values['new_page'] = $new_page;
     $markup_values['last_page'] = $max_page;
     $markup_values['posts_per_page'] = $posts_per_page;
     $markup_values['found_rows'] = $found_rows;
     if ($paged) {
         $markup_values['current_offset'] = ($paged - 1) * $posts_per_page;
     } else {
         $markup_values['current_offset'] = 0;
     }
     if ($new_page) {
         $markup_values['new_offset'] = ($new_page - 1) * $posts_per_page;
     } else {
         $markup_values['new_offset'] = 0;
     }
     $markup_values['current_page_text'] = 'mla_paginate_current="[+current_page+]"';
     $markup_values['new_page_text'] = 'mla_paginate_current="[+new_page+]"';
     $markup_values['last_page_text'] = 'mla_paginate_total="[+last_page+]"';
     $markup_values['posts_per_page_text'] = 'posts_per_page="[+posts_per_page+]"';
     if ('HTTPS' == substr($_SERVER["SERVER_PROTOCOL"], 0, 5)) {
         $markup_values['scheme'] = 'https://';
     } else {
         $markup_values['scheme'] = 'http://';
     }
     $markup_values['http_host'] = $_SERVER['HTTP_HOST'];
     if (0 < $new_page) {
         $new_uri = remove_query_arg($mla_page_parameter, $_SERVER['REQUEST_URI']);
         $markup_values['request_uri'] = add_query_arg(array($mla_page_parameter => $new_page), $new_uri);
     } else {
         $markup_values['request_uri'] = $_SERVER['REQUEST_URI'];
     }
     $markup_values['new_url'] = set_url_scheme($markup_values['scheme'] . $markup_values['http_host'] . $markup_values['request_uri']);
     /*
      * Expand pagination-specific Gallery Display Content parameters,
      * which can contain request: and query: arguments.
      */
     $pagination_arguments = array('mla_nolink_text', 'mla_link_class', 'mla_rollover_text', 'mla_link_attributes', 'mla_link_href', 'mla_link_text', 'mla_prev_text', 'mla_next_text');
     $new_text = '';
     foreach ($pagination_arguments as $value) {
         $new_text .= str_replace('{+', '[+', str_replace('+}', '+]', $arguments[$value]));
     }
     $markup_values = MLAData::mla_expand_field_level_parameters($new_text, $attr, $markup_values);
     /*
      * Build the new link, applying Gallery Display Content parameters
      */
     if ('paginate_links' == $output_parameters[0]) {
         return self::_paginate_links($output_parameters, $markup_values, $arguments, $found_rows, $output);
     }
     if (0 == $new_page) {
         if (!empty($arguments['mla_nolink_text'])) {
             return self::_process_shortcode_parameter($arguments['mla_nolink_text'], $markup_values);
         } else {
             return '';
         }
     }
     $new_link = '<a ';
     if (!empty($arguments['mla_target'])) {
         $new_link .= 'target="' . $arguments['mla_target'] . '" ';
     }
     if (!empty($arguments['mla_link_class'])) {
         $new_link .= 'class="' . esc_attr(self::_process_shortcode_parameter($arguments['mla_link_class'], $markup_values)) . '" ';
     }
     if (!empty($arguments['mla_rollover_text'])) {
         $new_link .= 'title="' . esc_attr(self::_process_shortcode_parameter($arguments['mla_rollover_text'], $markup_values)) . '" ';
     }
     if (!empty($arguments['mla_link_attributes'])) {
         $new_link .= esc_attr(self::_process_shortcode_parameter($arguments['mla_link_attributes'], $markup_values)) . ' ';
     }
     if (!empty($arguments['mla_link_href'])) {
         //$new_link .= 'href="' . esc_attr( self::_process_shortcode_parameter( $arguments['mla_link_href'], $markup_values ) ) . '" >';
         $new_link .= 'href="' . self::_process_shortcode_parameter($arguments['mla_link_href'], $markup_values) . '" >';
     } else {
         $new_link .= 'href="' . $markup_values['new_url'] . '" >';
     }
     if (!empty($arguments['mla_link_text'])) {
         $new_link .= self::_process_shortcode_parameter($arguments['mla_link_text'], $markup_values) . '</a>';
     } else {
         if ('previous_page' == $output_parameters[0]) {
             if (isset($arguments['mla_prev_text'])) {
                 $new_text = esc_attr(self::_process_shortcode_parameter($arguments['mla_prev_text'], $markup_values));
             } else {
                 $new_text = '&laquo; ' . __('Previous', 'media-library-assistant');
             }
         } else {
             if (isset($arguments['mla_next_text'])) {
                 $new_text = esc_attr(self::_process_shortcode_parameter($arguments['mla_next_text'], $markup_values));
             } else {
                 $new_text = __('Next', 'media-library-assistant') . ' &raquo;';
             }
         }
         $new_link .= $new_text . '</a>';
     }
     return $new_link;
 }
Example #8
0
 /**
  * Extract Metadata from a PDF file
  * 
  * @since 2.10
  *
  * @param	string	full path to the desired file
  *
  * @return	array	( 'xmp' => array( key => value ), 'pdf' => array( key => value ) ) for each metadata field, in string format
  */
 public static function mla_extract_pdf_metadata($file_name)
 {
     $xmp = array();
     $metadata = array();
     self::$pdf_indirect_objects = NULL;
     $chunksize = 16384;
     if (!file_exists($file_name)) {
         return array('xmp' => $xmp, 'pdf' => $metadata);
     }
     $filesize = filesize($file_name);
     $file_offset = $chunksize < $filesize ? $filesize - $chunksize : 0;
     $tail = file_get_contents($file_name, false, NULL, $file_offset);
     //error_log( __LINE__ . " MLAPDF::mla_extract_pdf_metadata( {$file_name}, {$file_offset} ) tail = \r\n" . MLAData::mla_hex_dump( $tail ), 0 );
     if (0 == $file_offset) {
         $header = substr($tail, 0, 128);
     } else {
         $header = file_get_contents($file_name, false, NULL, 0, 128);
     }
     //error_log( __LINE__ . " MLAPDF::mla_extract_pdf_metadata( {$file_name}, {$file_offset} ) header = \r\n" . MLAData::mla_hex_dump( $header ), 0 );
     if ('%PDF-' == substr($header, 0, 5)) {
         $metadata['PDF_Version'] = substr($header, 1, 7);
         $metadata['PDF_VersionNumber'] = substr($header, 5, 3);
     }
     /*
      * Find the xref and (optional) trailer
      */
     $match_count = preg_match_all('/startxref[\\x00-\\x20]+(\\d+)[\\x00-\\x20]+\\%\\%EOF/', $tail, $matches, PREG_OFFSET_CAPTURE);
     if (0 == $match_count) {
         /* translators: 1: ERROR tag 2: path and file */
         error_log(sprintf(_x('%1$s: File "%2$s", startxref not found.', 'error_log', 'media-library-assistant'), __('ERROR', 'media-library-assistant'), $path), 0);
         return array('xmp' => $xmp, 'pdf' => $metadata);
     }
     $startxref = (int) $matches[1][$match_count - 1][0];
     $trailer_dictionaries = self::_extract_pdf_trailer($file_name, $startxref);
     //error_log( __LINE__ . " MLAPDF::mla_extract_pdf_metadata trailer_dictionaries = " . var_export( $trailer_dictionaries, true ), 0 );
     if (is_array($trailer_dictionaries)) {
         $info_reference = NULL;
         foreach ($trailer_dictionaries as $trailer_dictionary) {
             if (isset($trailer_dictionary['Info'])) {
                 $info_reference = $trailer_dictionary['Info'];
                 break;
             }
         }
         //error_log( __LINE__ . " MLAPDF::mla_extract_pdf_metadata info_reference = " . var_export( $info_reference, true ), 0 );
         if (isset($info_reference)) {
             $info_object = self::_find_pdf_indirect_dictionary($file_name, $info_reference['object'], $info_reference['generation']);
             /*
              * Handle single or multiple Info instances
              */
             $info_objects = array();
             if ($info_object) {
                 if (1 == $info_object['count']) {
                     $info_objects[] = $info_object;
                 } else {
                     for ($index = 0; $index < $info_object['count']; $index++) {
                         $info_objects[] = self::_find_pdf_indirect_dictionary($file_name, $info_reference['object'], $info_reference['generation'], $index);
                     }
                 }
             }
             //error_log( __LINE__ . " MLAPDF::mla_extract_pdf_metadata info_objects = " . var_export( $info_objects, true ), 0 );
             foreach ($info_objects as $info_object) {
                 $info_dictionary = self::_parse_pdf_dictionary($info_object['content'], 0);
                 //error_log( __LINE__ . " MLAPDF::mla_extract_pdf_metadata info_dictionary = " . var_export( $info_dictionary, true ), 0 );
                 unset($info_dictionary['/length']);
                 foreach ($info_dictionary as $name => $value) {
                     if ('string' == $value['type']) {
                         $prefix = substr($value['value'], 0, 2);
                         if ('D:' == $prefix) {
                             $metadata[$name] = MLAData::mla_parse_pdf_date($value['value']);
                         } elseif (chr(0xfe) . chr(0xff) == $prefix) {
                             $metadata[$name] = self::_parse_pdf_UTF16BE($value['value']);
                         } else {
                             $metadata[$name] = $value['value'];
                         }
                     } else {
                         $metadata[$name] = $value['value'];
                     }
                 }
                 // each info entry
             }
             // foreach Info object
             /*
              * Remove spurious "Filter" dictionaries
              */
             unset($metadata['Filter']);
             unset($metadata['Length']);
             unset($metadata['Length1']);
         }
         // found Info reference
         //error_log( __LINE__ . ' MLAPDF::mla_extract_pdf_metadata pdf metadata = ' . var_export( $metadata, true ), 0 );
         /*
          * Look for XMP Metadata
          */
         $root_reference = NULL;
         //error_log( __LINE__ . " MLAPDF::mla_extract_pdf_metadata info_dictionary = " . var_export( $info_dictionary, true ), 0 );
         foreach ($trailer_dictionaries as $trailer_dictionary) {
             if (isset($trailer_dictionary['Root'])) {
                 $root_reference = $trailer_dictionary['Root'];
                 break;
             }
         }
         //error_log( __LINE__ . " MLAPDF::mla_extract_pdf_metadata root_reference = " . var_export( $root_reference, true ), 0 );
         if (isset($root_reference)) {
             $root_object = self::_find_pdf_indirect_dictionary($file_name, $root_reference['object'], $root_reference['generation']);
             //error_log( __LINE__ . " MLAPDF::mla_extract_pdf_metadata root_object = " . var_export( $root_object, true ), 0 );
             if ($root_object) {
                 $root_dictionary = self::_parse_pdf_dictionary($root_object['content'], 0);
                 //error_log( __LINE__ . " MLAPDF::mla_extract_pdf_metadata root_dictionary = " . var_export( $root_dictionary, true ), 0 );
                 unset($root_dictionary['/length']);
                 if (isset($root_dictionary['Metadata'])) {
                     $xmp_object = self::_find_pdf_indirect_dictionary($file_name, $root_dictionary['Metadata']['object'], $root_dictionary['Metadata']['generation']);
                     //error_log( __LINE__ . " MLAPDF::mla_extract_pdf_metadata xmp_object = " . var_export( $xmp_object, true ), 0 );
                     $xmp = MLAData::mla_parse_xmp_metadata($file_name, $xmp_object['start'] + $xmp_object['length']);
                     if (is_array($xmp)) {
                         $metadata = array_merge($metadata, $xmp);
                     } else {
                         $xmp = array();
                         $xmp = MLAData::mla_parse_xmp_metadata($file_name, 0);
                         //error_log( __LINE__ . ' MLAPDF::mla_extract_pdf_metadata recovered xmp = ' . var_export( $xmp, true ), 0 );
                     }
                 }
                 // found Metadata reference
             }
             // found Root object
         }
         // found Root reference
     }
     // found trailer_dictionaries
     //error_log( __LINE__ . ' MLAPDF::mla_extract_pdf_metadata pdf = ' . var_export( $metadata, true ), 0 );
     //error_log( __LINE__ . ' MLAPDF::mla_extract_pdf_metadata xmp = ' . var_export( $xmp, true ), 0 );
     return array('xmp' => $xmp, 'pdf' => $metadata);
 }
 /**
  * Handles brace/bracket escaping and parses template for a shortcode parameter
  *
  * @since 1.14
  *
  * @param string raw shortcode parameter, e.g., "text {+field+} {brackets} \\{braces\\}"
  * @param string template substitution values, e.g., ('instance' => '1', ...  )
  *
  * @return string query specification with HTML escape sequences and line breaks removed
  */
 private static function _process_shortcode_parameter($text, $markup_values)
 {
     $new_text = str_replace('{', '[', str_replace('}', ']', $text));
     $new_text = str_replace('\\[', '{', str_replace('\\]', '}', $new_text));
     return MLAData::mla_parse_template($new_text, $markup_values);
 }
 /**
  * Render and manage iptc/exif support options
  *
  * @since 1.00
  * @uses $mla_option_templates contains row and table templates
  *
  * @param	string 	'render', 'update', 'delete', or 'reset'
  * @param	string 	option name, e.g., 'iptc_exif_mapping'
  * @param	array 	option parameters
  * @param	array 	Optional. null (default) for 'render' else option data, e.g., $_REQUEST
  *
  * @return	string	HTML table row markup for 'render' else message(s) reflecting the results of the operation.
  */
 public static function mla_iptc_exif_option_handler($action, $key, $value, $args = NULL)
 {
     $current_values = MLACore::mla_get_option('iptc_exif_mapping');
     switch ($action) {
         case 'render':
             switch ($key) {
                 case 'iptc_exif_standard_mapping':
                     $row_template = MLAOptions::$mla_option_templates['iptc-exif-standard-row'];
                     $table_rows = '';
                     foreach ($current_values['standard'] as $row_name => $row_value) {
                         $row_values = array('key' => esc_attr($row_name), 'name_attr' => esc_attr($row_value['name']), 'name' => esc_html($row_value['name']), 'iptc_field_options' => MLAOptions::_compose_iptc_option_list($row_value['iptc_value']), 'exif_size' => MLACoreOptions::MLA_EXIF_SIZE, 'exif_text' => esc_attr($row_value['exif_value']), 'iptc_selected' => '', 'IPTC' => __('IPTC', 'media-library-assistant'), 'exif_selected' => '', 'EXIF' => __('EXIF', 'media-library-assistant'), 'keep_selected' => '', 'Keep' => __('Keep', 'media-library-assistant'), 'replace_selected' => '', 'Replace' => __('Replace', 'media-library-assistant'));
                         if ($row_value['iptc_first']) {
                             $row_values['iptc_selected'] = 'selected="selected"';
                         } else {
                             $row_values['exif_selected'] = 'selected="selected"';
                         }
                         if ($row_value['keep_existing']) {
                             $row_values['keep_selected'] = 'selected="selected"';
                         } else {
                             $row_values['replace_selected'] = 'selected="selected"';
                         }
                         $table_rows .= MLAData::mla_parse_template($row_template, $row_values);
                     }
                     // foreach row
                     $option_values = array('Field Title' => __('Field Title', 'media-library-assistant'), 'IPTC Value' => __('IPTC Value', 'media-library-assistant'), 'EXIF/Template Value' => __('EXIF/Template Value', 'media-library-assistant'), 'Priority' => __('Priority', 'media-library-assistant'), 'Existing Text' => __('Existing Text', 'media-library-assistant'), 'table_rows' => $table_rows, 'help' => $value['help']);
                     return MLAData::mla_parse_template(MLAOptions::$mla_option_templates['iptc-exif-standard-table'], $option_values);
                 case 'iptc_exif_taxonomy_mapping':
                     $row_template = MLAOptions::$mla_option_templates['iptc-exif-taxonomy-row'];
                     $select_template = MLAOptions::$mla_option_templates['iptc-exif-select'];
                     $table_rows = '';
                     $taxonomies = get_taxonomies(array('show_ui' => true), 'objects');
                     foreach ($taxonomies as $row_name => $row_value) {
                         if (!MLACore::mla_taxonomy_support($row_name, 'support')) {
                             continue;
                         }
                         $row_values = array('key' => esc_attr($row_name), 'name' => esc_html($row_value->labels->name), 'hierarchical' => (string) $row_value->hierarchical, 'iptc_field_options' => '', 'exif_size' => MLACoreOptions::MLA_EXIF_SIZE, 'exif_text' => '', 'iptc_selected' => '', 'IPTC' => __('IPTC', 'media-library-assistant'), 'exif_selected' => '', 'EXIF' => __('EXIF', 'media-library-assistant'), 'keep_selected' => '', 'Keep' => __('Keep', 'media-library-assistant'), 'replace_selected' => '', 'Replace' => __('Replace', 'media-library-assistant'), 'delimiters_size' => 4, 'delimiters_text' => '', 'parent_select' => '');
                         if (array_key_exists($row_name, $current_values['taxonomy'])) {
                             $current_value = $current_values['taxonomy'][$row_name];
                             $row_values['iptc_field_options'] = MLAOptions::_compose_iptc_option_list($current_value['iptc_value']);
                             $row_values['exif_text'] = esc_attr($current_value['exif_value']);
                             if ($current_value['iptc_first']) {
                                 $row_values['iptc_selected'] = 'selected="selected"';
                             } else {
                                 $row_values['exif_selected'] = 'selected="selected"';
                             }
                             if ($current_value['keep_existing']) {
                                 $row_values['keep_selected'] = 'selected="selected"';
                             } else {
                                 $row_values['replace_selected'] = 'selected="selected"';
                             }
                             $row_values['delimiters_text'] = $current_value['delimiters'];
                             if ($row_value->hierarchical) {
                                 $parent = isset($current_value['parent']) ? (int) $current_value['parent'] : 0;
                                 $select_values = array('array' => 'taxonomy', 'key' => esc_attr($row_name), 'element' => 'parent', 'options' => MLAOptions::_compose_parent_option_list($row_name, $parent));
                                 $row_values['parent_select'] = MLAData::mla_parse_template($select_template, $select_values);
                             }
                         } else {
                             $row_values['iptc_field_options'] = MLAOptions::_compose_iptc_option_list('none');
                             $row_values['iptc_selected'] = 'selected="selected"';
                             $row_values['keep_selected'] = 'selected="selected"';
                             if ($row_value->hierarchical) {
                                 $select_values = array('array' => 'taxonomy', 'key' => esc_attr($row_name), 'element' => 'parent', 'options' => MLAOptions::_compose_parent_option_list($row_name, 0));
                                 $row_values['parent_select'] = MLAData::mla_parse_template($select_template, $select_values);
                             }
                         }
                         $table_rows .= MLAData::mla_parse_template($row_template, $row_values);
                     }
                     // foreach row
                     $option_values = array('Field Title' => __('Field Title', 'media-library-assistant'), 'IPTC Value' => __('IPTC Value', 'media-library-assistant'), 'EXIF/Template Value' => __('EXIF/Template Value', 'media-library-assistant'), 'Priority' => __('Priority', 'media-library-assistant'), 'Existing Text' => __('Existing Text', 'media-library-assistant'), 'Delimiter(s)' => __('Delimiter(s)', 'media-library-assistant'), 'Parent' => __('Parent', 'media-library-assistant'), 'table_rows' => $table_rows, 'help' => $value['help']);
                     return MLAData::mla_parse_template(MLAOptions::$mla_option_templates['iptc-exif-taxonomy-table'], $option_values);
                 case 'iptc_exif_custom_mapping':
                     if (empty($current_values['custom'])) {
                         $table_rows = MLAData::mla_parse_template(MLAOptions::$mla_option_templates['iptc-exif-custom-empty-row'], array('No Mapping Rules' => __('No Custom Field Mapping Rules Defined', 'media-library-assistant'), 'column_count' => 5));
                     } else {
                         $row_template = MLAOptions::$mla_option_templates['iptc-exif-custom-rule-row'];
                         $table_rows = '';
                         $index = 0;
                     }
                     /*
                      * One row for each existing rule, case insensitive "natural order"
                      */
                     $sorted_keys = array();
                     foreach ($current_values['custom'] as $row_name => $current_value) {
                         $sorted_keys[$current_value['name']] = $current_value['name'];
                     }
                     natcasesort($sorted_keys);
                     $sorted_names = array();
                     foreach ($sorted_keys as $row_name) {
                         $sorted_names[$row_name] = array();
                     }
                     /*
                      * Allow for multiple rules mapping the same name (an old bug)
                      */
                     foreach ($current_values['custom'] as $row_name => $current_value) {
                         $sorted_names[$current_value['name']][] = $row_name;
                     }
                     foreach ($sorted_names as $sorted_keys) {
                         foreach ($sorted_keys as $row_name) {
                             $current_value = $current_values['custom'][$row_name];
                             $row_values = array('column_count' => 5, 'column_count_meta' => 5 - 2, 'index' => $index++, 'key' => esc_attr($row_name), 'name_attr' => esc_attr($current_value['name']), 'name' => esc_html($current_value['name']), 'iptc_field_options' => MLAOptions::_compose_iptc_option_list($current_value['iptc_value']), 'exif_size' => MLACoreOptions::MLA_EXIF_SIZE, 'exif_text' => esc_attr($current_value['exif_value']), 'iptc_selected' => '', 'IPTC' => __('IPTC', 'media-library-assistant'), 'exif_selected' => '', 'EXIF' => __('EXIF', 'media-library-assistant'), 'keep_selected' => '', 'Keep' => __('Keep', 'media-library-assistant'), 'replace_selected' => '', 'Replace' => __('Replace', 'media-library-assistant'), 'Format' => __('Format', 'media-library-assistant'), 'native_format' => '', 'Native' => __('Native', 'media-library-assistant'), 'commas_format' => '', 'Commas' => __('Commas', 'media-library-assistant'), 'raw_format' => '', 'Raw' => __('Raw', 'media-library-assistant'), 'Option' => __('Option', 'media-library-assistant'), 'text_option' => '', 'Text' => __('Text', 'media-library-assistant'), 'single_option' => '', 'Single' => __('Single', 'media-library-assistant'), 'export_option' => '', 'Export' => __('Export', 'media-library-assistant'), 'array_option' => '', 'Array' => __('Array', 'media-library-assistant'), 'multi_option' => '', 'Multi' => __('Multi', 'media-library-assistant'), 'no_null_checked' => '', 'Delete NULL values' => __('Delete NULL values', 'media-library-assistant'), 'Delete Rule' => __('Delete Rule', 'media-library-assistant'), 'Delete Field' => __('Delete Rule AND Field', 'media-library-assistant'), 'Update Rule' => __('Update Rule', 'media-library-assistant'), 'Map All Attachments' => __('Map All Attachments', 'media-library-assistant'));
                             if ($current_value['iptc_first']) {
                                 $row_values['iptc_selected'] = 'selected="selected"';
                             } else {
                                 $row_values['exif_selected'] = 'selected="selected"';
                             }
                             if ($current_value['keep_existing']) {
                                 $row_values['keep_selected'] = 'selected="selected"';
                             } else {
                                 $row_values['replace_selected'] = 'selected="selected"';
                             }
                             switch ($current_value['format']) {
                                 case 'commas':
                                     $row_values['commas_format'] = 'selected="selected"';
                                     break;
                                 case 'raw':
                                     $row_values['raw_format'] = 'selected="selected"';
                                     break;
                                 default:
                                     $row_values['native_format'] = 'selected="selected"';
                             }
                             // format
                             switch ($current_value['option']) {
                                 case 'single':
                                     $row_values['single_option'] = 'selected="selected"';
                                     break;
                                 case 'export':
                                     $row_values['export_option'] = 'selected="selected"';
                                     break;
                                 case 'array':
                                     $row_values['array_option'] = 'selected="selected"';
                                     break;
                                 case 'multi':
                                     $row_values['multi_option'] = 'selected="selected"';
                                     break;
                                 default:
                                     $row_values['text_option'] = 'selected="selected"';
                             }
                             // option
                             if ($current_value['no_null']) {
                                 $row_values['no_null_checked'] = 'checked="checked"';
                             }
                             $table_rows .= MLAData::mla_parse_template($row_template, $row_values);
                         }
                         // foreach current_values key
                     }
                     // foreach sorted_name
                     /*
                      * Add a row for defining a new rule, existing Custom Field
                      */
                     $row_template = MLAOptions::$mla_option_templates['iptc-exif-custom-new-rule-row'];
                     $row_values = array('column_count' => 5, 'column_count_meta' => 5 - 2, 'Add new Rule' => __('Add a new Mapping Rule', 'media-library-assistant'), 'index' => MLACoreOptions::MLA_NEW_CUSTOM_RULE, 'field_name_options' => MLAOptions::_compose_custom_field_option_list('none', $current_values['custom']), 'iptc_field_options' => MLAOptions::_compose_iptc_option_list('none'), 'exif_size' => MLACoreOptions::MLA_EXIF_SIZE, 'exif_text' => '', 'iptc_selected' => 'selected="selected"', 'IPTC' => __('IPTC', 'media-library-assistant'), 'exif_selected' => '', 'EXIF' => __('EXIF', 'media-library-assistant'), 'keep_selected' => 'selected="selected"', 'Keep' => __('Keep', 'media-library-assistant'), 'replace_selected' => '', 'Replace' => __('Replace', 'media-library-assistant'), 'Format' => __('Format', 'media-library-assistant'), 'native_format' => 'selected="selected"', 'Native' => __('Native', 'media-library-assistant'), 'commas_format' => '', 'Commas' => __('Commas', 'media-library-assistant'), 'raw_format' => '', 'Raw' => __('Raw', 'media-library-assistant'), 'Option' => __('Option', 'media-library-assistant'), 'text_option' => '', 'Text' => __('Text', 'media-library-assistant'), 'single_option' => '', 'Single' => __('Single', 'media-library-assistant'), 'export_option' => '', 'Export' => __('Export', 'media-library-assistant'), 'array_option' => '', 'Array' => __('Array', 'media-library-assistant'), 'multi_option' => '', 'Multi' => __('Multi', 'media-library-assistant'), 'no_null_checked' => '', 'Delete NULL values' => __('Delete NULL values', 'media-library-assistant'), 'Add Rule' => __('Add Rule', 'media-library-assistant'), 'Map All Attachments' => __('Add Rule and Map All Attachments', 'media-library-assistant'));
                     $table_rows .= MLAData::mla_parse_template($row_template, $row_values);
                     /*
                      * Add a row for defining a new rule, new Custom Field
                      */
                     $row_template = MLAOptions::$mla_option_templates['iptc-exif-custom-new-field-row'];
                     $row_values = array('column_count' => 5, 'column_count_meta' => 5 - 2, 'Add new Field' => __('Add a new Field and Mapping Rule', 'media-library-assistant'), 'index' => MLACoreOptions::MLA_NEW_CUSTOM_FIELD, 'field_name_size' => '24', 'iptc_field_options' => MLAOptions::_compose_iptc_option_list('none'), 'exif_size' => MLACoreOptions::MLA_EXIF_SIZE, 'exif_text' => '', 'iptc_selected' => 'selected="selected"', 'IPTC' => __('IPTC', 'media-library-assistant'), 'exif_selected' => '', 'EXIF' => __('EXIF', 'media-library-assistant'), 'keep_selected' => 'selected="selected"', 'Keep' => __('Keep', 'media-library-assistant'), 'replace_selected' => '', 'Replace' => __('Replace', 'media-library-assistant'), 'Format' => __('Format', 'media-library-assistant'), 'native_format' => 'selected="selected"', 'Native' => __('Native', 'media-library-assistant'), 'commas_format' => '', 'Commas' => __('Commas', 'media-library-assistant'), 'raw_format' => '', 'Raw' => __('Raw', 'media-library-assistant'), 'Option' => __('Option', 'media-library-assistant'), 'text_option' => '', 'Text' => __('Text', 'media-library-assistant'), 'single_option' => '', 'Single' => __('Single', 'media-library-assistant'), 'export_option' => '', 'Export' => __('Export', 'media-library-assistant'), 'array_option' => '', 'Array' => __('Array', 'media-library-assistant'), 'multi_option' => '', 'Multi' => __('Multi', 'media-library-assistant'), 'no_null_checked' => '', 'Delete NULL values' => __('Delete NULL values', 'media-library-assistant'), 'Add Field' => __('Add Field', 'media-library-assistant'), 'Map All Attachments' => __('Add Field and Map All Attachments', 'media-library-assistant'));
                     $table_rows .= MLAData::mla_parse_template($row_template, $row_values);
                     $option_values = array('Field Title' => __('Field Title', 'media-library-assistant'), 'IPTC Value' => __('IPTC Value', 'media-library-assistant'), 'EXIF/Template Value' => __('EXIF/Template Value', 'media-library-assistant'), 'Priority' => __('Priority', 'media-library-assistant'), 'Existing Text' => __('Existing Text', 'media-library-assistant'), 'table_rows' => $table_rows, 'help' => $value['help']);
                     return MLAData::mla_parse_template(MLAOptions::$mla_option_templates['iptc-exif-custom-table'], $option_values);
                 default:
                     /* translators: 1: ERROR tag 2: option name */
                     return '<br>' . sprintf(__('%1$s: Render unknown custom %2$s.', 'media-library-assistant'), __('ERROR', 'media-library-assistant'), $key) . "\r\n";
             }
             // switch $key
         // switch $key
         case 'update':
         case 'delete':
             $settings_changed = false;
             $messages = '';
             switch ($key) {
                 case 'iptc_exif_standard_mapping':
                     $results = MLAOptions::_update_iptc_exif_standard_mapping($current_values, $args);
                     $messages .= $results['message'];
                     $current_values = $results['values'];
                     $settings_changed = $results['changed'];
                     break;
                 case 'iptc_exif_taxonomy_mapping':
                     $results = MLAOptions::_update_iptc_exif_taxonomy_mapping($current_values, $args);
                     $messages .= $results['message'];
                     $current_values = $results['values'];
                     $settings_changed = $results['changed'];
                     break;
                 case 'iptc_exif_custom_mapping':
                     $results = MLAOptions::_update_iptc_exif_custom_mapping($current_values, $args);
                     $messages .= $results['message'];
                     $current_values = $results['values'];
                     $settings_changed = $results['changed'];
                     break;
                 case 'iptc_exif_mapping':
                     $results = MLAOptions::_update_iptc_exif_standard_mapping($current_values, $args);
                     $messages .= $results['message'];
                     $current_values = $results['values'];
                     $settings_changed = $results['changed'];
                     $results = MLAOptions::_update_iptc_exif_taxonomy_mapping($current_values, $args);
                     $messages .= $results['message'];
                     $current_values = $results['values'];
                     $settings_changed |= $results['changed'];
                     $results = MLAOptions::_update_iptc_exif_custom_mapping($current_values, $args);
                     $messages .= $results['message'];
                     $current_values = $results['values'];
                     $settings_changed |= $results['changed'];
                     break;
                 default:
                     /* translators: 1: ERROR tag 2: option name */
                     return '<br>' . sprintf(__('%1$s: Update/delete unknown custom %2$s.', 'media-library-assistant'), __('ERROR', 'media-library-assistant'), $key) . "\r\n";
             }
             // switch $key
             if ($settings_changed) {
                 $settings_changed = MLACore::mla_update_option('iptc_exif_mapping', $current_values);
                 if ($settings_changed) {
                     $results = __('IPTC/EXIF mapping settings updated.', 'media-library-assistant') . "\r\n";
                 } else {
                     $results = __('ERROR', 'media-library-assistant') . ': ' . __('IPTC/EXIF settings update failed.', 'media-library-assistant') . "\r\n";
                 }
             } else {
                 $results = __('IPTC/EXIF no mapping changes detected.', 'media-library-assistant') . "\r\n";
             }
             return $results . $messages;
         case 'reset':
             switch ($key) {
                 case 'iptc_exif_standard_mapping':
                     $current_values['standard'] = MLACoreOptions::$mla_option_definitions['iptc_exif_mapping']['std']['standard'];
                     $settings_changed = MLACore::mla_update_option('iptc_exif_mapping', $current_values);
                     if ($settings_changed) {
                         /* translators: 1: field type */
                         return sprintf(__('%1$s settings saved.', 'media-library-assistant'), 'IPTC/EXIF ' . __('Standard field', 'media-library-assistant')) . "\r\n";
                     } else {
                         /* translators: 1: ERROR tag 2: field type */
                         return sprintf(__('%1$s: IPTC/EXIF %2$s settings update failed.', 'media-library-assistant'), __('ERROR', 'media-library-assistant'), __('Standard field', 'media-library-assistant')) . "\r\n";
                     }
                 case 'iptc_exif_taxonomy_mapping':
                     $current_values['taxonomy'] = MLACoreOptions::$mla_option_definitions['iptc_exif_mapping']['std']['taxonomy'];
                     $settings_changed = MLACore::mla_update_option('iptc_exif_mapping', $current_values);
                     if ($settings_changed) {
                         /* translators: 1: field type */
                         return sprintf(__('%1$s settings saved.', 'media-library-assistant'), 'IPTC/EXIF ' . __('Taxonomy term', 'media-library-assistant')) . "\r\n";
                     } else {
                         /* translators: 1: ERROR tag 2: field type */
                         return sprintf(__('%1$s: IPTC/EXIF %2$s settings update failed.', 'media-library-assistant'), __('ERROR', 'media-library-assistant'), __('Taxonomy term', 'media-library-assistant')) . "\r\n";
                     }
                 case 'iptc_exif_custom_mapping':
                     $current_values['custom'] = MLACoreOptions::$mla_option_definitions['iptc_exif_mapping']['std']['custom'];
                     $settings_changed = MLACore::mla_update_option('iptc_exif_mapping', $current_values);
                     if ($settings_changed) {
                         /* translators: 1: field type */
                         return sprintf(__('%1$s settings saved.', 'media-library-assistant'), 'IPTC/EXIF ' . __('Custom field', 'media-library-assistant')) . "\r\n";
                     } else {
                         /* translators: 1: ERROR tag 2: field type */
                         return sprintf(__('%1$s: IPTC/EXIF %2$s settings update failed.', 'media-library-assistant'), __('ERROR', 'media-library-assistant'), __('Custom field', 'media-library-assistant')) . "\r\n";
                     }
                 case 'iptc_exif_mapping':
                     MLACore::mla_delete_option($key);
                     /* translators: 1: option name, e.g., taxonomy_support */
                     return '<br>' . sprintf(__('Reset custom %1$s', 'media-library-assistant'), $key) . "\r\n";
                 default:
                     /* translators: 1: ERROR tag 2: option name, e.g., taxonomy_support */
                     return '<br>' . sprintf(__('%1$s: Reset unknown custom %2$s', 'media-library-assistant'), __('ERROR', 'media-library-assistant'), $key) . "\r\n";
             }
             // switch $key
         // switch $key
         default:
             /* translators: 1: ERROR tag 2: option name 3: action, e.g., update, delete, reset */
             return '<br>' . sprintf(__('%1$s: Custom %2$s unknown action "%3$s"', 'media-library-assistant'), __('ERROR', 'media-library-assistant'), $key, $action) . "\r\n";
     }
     // switch $action
 }
Example #11
0
 /**
  * Display a single item sub page; prepare the form to 
  * change the meta data for a single attachment.
  * 
  * This function is not used in WordPress 3.5 and later.
  *
  * @since 0.1
  * 
  * @param	int		The WordPress Post ID of the attachment item
  *
  * @return	array	message and/or HTML content
  */
 private static function _display_single_item($post_id)
 {
     global $post;
     /*
      * This function sets the global $post
      */
     $post_data = MLAData::mla_get_attachment_by_id($post_id);
     if (!isset($post_data)) {
         return array('message' => 'ERROR: Could not retrieve Attachment.', 'body' => '');
     }
     if (!current_user_can('edit_post', $post_id)) {
         return array('message' => 'You are not allowed to edit this Attachment.', 'body' => '');
     }
     if (!empty($post_data['mla_wp_attachment_metadata'])) {
         $page_template_array = MLAData::mla_load_template(MLA_PLUGIN_PATH . 'tpls/admin-display-single-image.tpl');
         $width = isset($post_data['mla_wp_attachment_metadata']['width']) ? $post_data['mla_wp_attachment_metadata']['width'] : '';
         $height = isset($post_data['mla_wp_attachment_metadata']['height']) ? $post_data['mla_wp_attachment_metadata']['height'] : '';
         $image_meta = var_export($post_data['mla_wp_attachment_metadata'], true);
         if (!isset($post_data['mla_wp_attachment_image_alt'])) {
             $post_data['mla_wp_attachment_image_alt'] = '';
         }
     } else {
         $page_template_array = MLAData::mla_load_template(MLA_PLUGIN_PATH . 'tpls/admin-display-single-document.tpl');
         $width = '';
         $height = '';
         $image_meta = '';
     }
     if (array($page_template_array)) {
         $page_template = $page_template_array['page'];
         $authors_template = $page_template_array['authors'];
         $postbox_template = $page_template_array['postbox'];
     } else {
         error_log("ERROR: MLA::_display_single_item \$page_template_array = " . var_export($page_template_array, true), 0);
         $page_template = $page_template_array;
         $authors_template = '';
         $postbox_template = '';
     }
     if (empty($post_data['mla_references']['parent_title'])) {
         $parent_info = $post_data['mla_references']['parent_errors'];
     } else {
         $parent_info = sprintf('(%1$s) %2$s %3$s', $post_data['mla_references']['parent_type'], $post_data['mla_references']['parent_title'], $post_data['mla_references']['parent_errors']);
     }
     if ($authors = self::_authors_dropdown($post_data['post_author'], 'attachments[' . $post_data['ID'] . '][post_author]')) {
         $args = array('ID' => $post_data['ID'], 'authors' => $authors);
         $authors = MLAData::mla_parse_template($authors_template, $args);
     } else {
         $authors = '';
     }
     if (MLAOptions::$process_featured_in) {
         $features = '';
         foreach ($post_data['mla_references']['features'] as $feature_id => $feature) {
             if ($feature_id == $post_data['post_parent']) {
                 $parent = 'PARENT ';
             } else {
                 $parent = '';
             }
             $features .= sprintf('%1$s (%2$s %3$s), %4$s', $parent, $feature->post_type, $feature_id, $feature->post_title) . "\r\n";
         }
         // foreach $feature
     } else {
         $features = 'disabled';
     }
     if (MLAOptions::$process_inserted_in) {
         $inserts = '';
         foreach ($post_data['mla_references']['inserts'] as $file => $insert_array) {
             $inserts .= $file . "\r\n";
             foreach ($insert_array as $insert) {
                 if ($insert->ID == $post_data['post_parent']) {
                     $parent = '  PARENT ';
                 } else {
                     $parent = '  ';
                 }
                 $inserts .= sprintf('%1$s (%2$s %3$s), %4$s', $parent, $insert->post_type, $insert->ID, $insert->post_title) . "\r\n";
             }
             // foreach $insert
         }
         // foreach $file
     } else {
         $inserts = 'disabled';
     }
     if (MLAOptions::$process_gallery_in) {
         $galleries = '';
         foreach ($post_data['mla_references']['galleries'] as $gallery_id => $gallery) {
             if ($gallery_id == $post_data['post_parent']) {
                 $parent = 'PARENT ';
             } else {
                 $parent = '';
             }
             $galleries .= sprintf('%1$s (%2$s %3$s), %4$s', $parent, $gallery['post_type'], $gallery_id, $gallery['post_title']) . "\r\n";
         }
         // foreach $gallery
     } else {
         $galleries = 'disabled';
     }
     if (MLAOptions::$process_mla_gallery_in) {
         $mla_galleries = '';
         foreach ($post_data['mla_references']['mla_galleries'] as $gallery_id => $gallery) {
             if ($gallery_id == $post_data['post_parent']) {
                 $parent = 'PARENT ';
             } else {
                 $parent = '';
             }
             $mla_galleries .= sprintf('%1$s (%2$s %3$s), %4$s', $parent, $gallery['post_type'], $gallery_id, $gallery['post_title']) . "\r\n";
         }
         // foreach $gallery
     } else {
         $mla_galleries = 'disabled';
     }
     /*
      * WordPress doesn't look in hidden fields to set the month filter dropdown or sorting parameters
      */
     if (isset($_REQUEST['m'])) {
         $url_args = '&m=' . $_REQUEST['m'];
     } else {
         $url_args = '';
     }
     if (isset($_REQUEST['post_mime_type'])) {
         $url_args .= '&post_mime_type=' . $_REQUEST['post_mime_type'];
     }
     if (isset($_REQUEST['order'])) {
         $url_args .= '&order=' . $_REQUEST['order'];
     }
     if (isset($_REQUEST['orderby'])) {
         $url_args .= '&orderby=' . $_REQUEST['orderby'];
     }
     /*
      * Add the current view arguments
      */
     if (isset($_REQUEST['detached'])) {
         $view_args = '<input type="hidden" name="detached" value="' . $_REQUEST['detached'] . "\" />\r\n";
     } elseif (isset($_REQUEST['status'])) {
         $view_args = '<input type="hidden" name="status" value="' . $_REQUEST['status'] . "\" />\r\n";
     } else {
         $view_args = '';
     }
     if (isset($_REQUEST['paged'])) {
         $view_args .= sprintf('<input type="hidden" name="paged" value="%1$s" />', $_REQUEST['paged']) . "\r\n";
     }
     $side_info_column = '';
     $taxonomies = get_object_taxonomies('attachment', 'objects');
     foreach ($taxonomies as $tax_name => $tax_object) {
         ob_start();
         if ($tax_object->hierarchical && $tax_object->show_ui) {
             $box = array('id' => $tax_name . 'div', 'title' => esc_html($tax_object->labels->name), 'callback' => 'categories_meta_box', 'args' => array('taxonomy' => $tax_name), 'inside_html' => '');
             post_categories_meta_box($post, $box);
         } elseif ($tax_object->show_ui) {
             $box = array('id' => 'tagsdiv-' . $tax_name, 'title' => esc_html($tax_object->labels->name), 'callback' => 'post_tags_meta_box', 'args' => array('taxonomy' => $tax_name), 'inside_html' => '');
             post_tags_meta_box($post, $box);
         }
         $box['inside_html'] = ob_get_contents();
         ob_end_clean();
         $side_info_column .= MLAData::mla_parse_template($postbox_template, $box);
     }
     $page_values = array('ID' => $post_data['ID'], 'post_mime_type' => $post_data['post_mime_type'], 'menu_order' => $post_data['menu_order'], 'post_date' => $post_data['post_date'], 'post_modified' => $post_data['post_modified'], 'post_parent' => $post_data['post_parent'], 'menu_order' => $post_data['menu_order'], 'attachment_icon' => wp_get_attachment_image($post_id, array(160, 120), true), 'file_name' => esc_html($post_data['mla_references']['file']), 'width' => $width, 'height' => $height, 'post_title_attr' => esc_attr($post_data['post_title']), 'post_name_attr' => esc_attr($post_data['post_name']), 'image_alt_attr' => '', 'post_excerpt_attr' => esc_attr($post_data['post_excerpt']), 'post_content' => esc_textarea($post_data['post_content']), 'image_meta' => esc_textarea($image_meta), 'parent_info' => esc_attr($parent_info), 'guid_attr' => esc_attr($post_data['guid']), 'authors' => $authors, 'features' => esc_textarea($features), 'inserts' => esc_textarea($inserts), 'galleries' => esc_textarea($galleries), 'mla_galleries' => esc_textarea($mla_galleries), 'mla_admin_action' => self::MLA_ADMIN_SINGLE_EDIT_UPDATE, 'form_url' => admin_url('upload.php') . '?page=' . self::ADMIN_PAGE_SLUG . $url_args, 'view_args' => $view_args, 'wpnonce' => wp_nonce_field(self::MLA_ADMIN_NONCE, '_wpnonce', true, false), 'side_info_column' => $side_info_column);
     if (!empty($post_data['mla_wp_attachment_image_alt'])) {
         $page_values['image_alt_attr'] = esc_attr($post_data['mla_wp_attachment_image_alt']);
     }
     return array('message' => '', 'body' => MLAData::mla_parse_template($page_template, $page_values));
 }
 /**
  * Compose HTML markup for the import settings if any settings files exist
  *
  * @since 1.50
  *
  * @return	string	HTML markup for the Import All Settings button and dropdown list, if any
  */
 private static function _compose_import_settings()
 {
     if (!file_exists(MLA_BACKUP_DIR)) {
         return '';
     }
     $prefix = (defined(MLA_OPTION_PREFIX) ? MLA_OPTION_PREFIX : 'mla_') . '_options_';
     $prefix_length = strlen($prefix);
     $backup_files = array();
     $files = scandir(MLA_BACKUP_DIR, 1);
     // sort descending
     foreach ($files as $file) {
         if (0 === strpos($file, $prefix)) {
             $tail = substr($file, $prefix_length, strlen($file) - ($prefix_length + 4));
             $text = sprintf('%1$s/%2$s/%3$s %4$s', substr($tail, 0, 4), substr($tail, 4, 2), substr($tail, 6, 2), substr($tail, 9));
             $backup_files[$text] = $file;
         }
     }
     if (empty($backup_files)) {
         return '';
     }
     $option_values = array('value' => 'none', 'text' => '&mdash; ' . __('select settings', 'media-library-assistant') . ' &mdash;', 'selected' => 'selected="selected"');
     $select_options = MLAData::mla_parse_template(self::$page_template_array['select-option'], $option_values);
     foreach ($backup_files as $text => $file) {
         $option_values = array('value' => esc_attr($file), 'text' => esc_html($text), 'selected' => '');
         $select_options .= MLAData::mla_parse_template(self::$page_template_array['select-option'], $option_values);
     }
     $option_values = array('key' => 'mla-import-settings-file', 'options' => $select_options);
     return '<input name="mla-general-options-import" type="submit" class="button-primary" value="' . __('Import ALL Settings', 'media-library-assistant') . '" />' . MLAData::mla_parse_template(self::$page_template_array['select-only'], $option_values);
 }
 /**
  * Fetch and filter IPTC and EXIF, XMP or PDF metadata for an image attachment
  * 
  * @since 0.90
  *
  * @param	int		post ID of attachment
  * @param	string	optional; if $post_id is zero, path to the image file.
  *
  * @return	array	Meta data variables, IPTC and EXIF or PDF
  */
 public static function mla_fetch_attachment_image_metadata($post_id, $path = '')
 {
     $results = array('post_id' => $post_id, 'mla_iptc_metadata' => array(), 'mla_exif_metadata' => array(), 'mla_xmp_metadata' => array(), 'mla_pdf_metadata' => array());
     if (0 != $post_id) {
         $path = get_attached_file($post_id);
     }
     if (!empty($path)) {
         if ('pdf' == strtolower(pathinfo($path, PATHINFO_EXTENSION))) {
             $pdf_metadata = MLAPDF::mla_extract_pdf_metadata($path);
             $results['mla_xmp_metadata'] = $pdf_metadata['xmp'];
             $results['mla_pdf_metadata'] = $pdf_metadata['pdf'];
             return $results;
         }
         $size = getimagesize($path, $info);
         if (is_callable('iptcparse')) {
             if (!empty($info['APP13'])) {
                 //set_error_handler( 'MLAData::mla_IPTC_EXIF_error_handler' );
                 $iptc_values = iptcparse($info['APP13']);
                 //restore_error_handler();
                 if (!empty(MLAData::$mla_IPTC_EXIF_errors)) {
                     $results['mla_iptc_errors'] = MLAData::$mla_IPTC_EXIF_errors;
                     MLAData::$mla_IPTC_EXIF_errors = array();
                     error_log(__('ERROR', 'media-library-assistant') . ': ' . '$results[mla_iptc_errors] = ' . var_export($results['mla_exif_errors'], true), 0);
                 }
                 if (!is_array($iptc_values)) {
                     $iptc_values = array();
                 }
                 foreach ($iptc_values as $key => $value) {
                     if (in_array($key, array('1#000', '1#020', '1#022', '1#120', '1#122', '2#000', '2#200', '2#201'))) {
                         $value = unpack('nbinary', $value[0]);
                         $results['mla_iptc_metadata'][$key] = (string) $value['binary'];
                     } elseif (1 == count($value)) {
                         $results['mla_iptc_metadata'][$key] = $value[0];
                     } else {
                         $results['mla_iptc_metadata'][$key] = $value;
                     }
                 }
                 // foreach $value
             }
             // ! empty
         }
         // iptcparse
         if (is_callable('exif_read_data') && in_array($size[2], array(IMAGETYPE_JPEG, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM))) {
             //set_error_handler( 'MLAData::mla_IPTC_EXIF_error_handler' );
             $results['mla_exif_metadata'] = $exif_data = @exif_read_data($path);
             //restore_error_handler();
             if (!empty(MLAData::$mla_IPTC_EXIF_errors)) {
                 $results['mla_exif_errors'] = MLAData::$mla_IPTC_EXIF_errors;
                 MLAData::$mla_IPTC_EXIF_errors = array();
                 error_log(__('ERROR', 'media-library-assistant') . ': ' . '$results[mla_exif_errors] = ' . var_export($results['mla_exif_errors'], true), 0);
             }
         }
         // exif_read_data
         $results['mla_xmp_metadata'] = self::mla_parse_xmp_metadata($path, 0);
         if (NULL == $results['mla_xmp_metadata']) {
             $results['mla_xmp_metadata'] = array();
         }
     }
     /*
      * Expand EXIF Camera-related values:
      *
      * ExposureBiasValue
      * ExposureTime
      * Flash
      * FNumber 
      * FocalLength
      * ShutterSpeed from ExposureTime
      */
     $new_data = array();
     if (isset($exif_data['FNumber'])) {
         if (false !== ($value = self::_rational_to_string($exif_data['FNumber'], '%1$d', '%1$d/%2$d', '%1$.1f'))) {
             $new_data['FNumber'] = $value;
         }
     }
     // FNumber
     if (isset($exif_data['ExposureBiasValue'])) {
         $fragments = array_map('intval', explode('/', $exif_data['ExposureBiasValue']));
         if (!is_null($fragments[1])) {
             $numerator = $fragments[0];
             $denominator = $fragments[1];
             // Clean up some common format issues, e.g. 4/6, 2/4
             while (0 == ($numerator & 0x1) && 0 == ($denominator & 0x1)) {
                 $numerator = $numerator >> 1;
                 $denominator = $denominator >> 1;
             }
             // Remove excess precision
             if ($denominator > $numerator && 1000 < $numerator && 1000 < $denominator) {
                 $exif_data['ExposureBiasValue'] = sprintf('%1$+.3f', $numerator / $denominator);
             } else {
                 $fragments[0] = $numerator;
                 $fragments[1] = $denominator;
                 $exif_data['ExposureBiasValue'] = $numerator . '/' . $denominator;
             }
         }
         if (false !== ($value = self::_rational_to_string($exif_data['ExposureBiasValue'], '%1$+d', '%1$+d/%2$d', '%1$+.2f'))) {
             $new_data['ExposureBiasValue'] = $value;
         }
     }
     // ExposureBiasValue
     if (isset($exif_data['Flash'])) {
         $value = absint($exif_data['Flash']);
         if ($value & 0x1) {
             $new_data['Flash'] = __('Yes', 'media-library-assistant');
         } else {
             $new_data['Flash'] = __('No', 'media-library-assistant');
         }
     }
     // Flash
     if (isset($exif_data['FocalLength'])) {
         if (false !== ($value = self::_rational_to_string($exif_data['FocalLength'], '%1$d', '%1$d/%2$d', '%1$.2f'))) {
             $new_data['FocalLength'] = $value;
         }
     }
     // FocalLength
     if (isset($exif_data['ExposureTime'])) {
         if (false !== ($value = self::_rational_to_string($exif_data['ExposureTime'], '%1$d', '%1$d/%2$d', '%1$.2f'))) {
             $new_data['ExposureTime'] = $value;
         }
     }
     // ExposureTime
     /*
      * ShutterSpeed in "1/" format, from ExposureTime
      * Special logic for "fractional shutter speed" values 1.3, 1.5, 1.6, 2.5
      */
     if (isset($exif_data['ExposureTime'])) {
         $fragments = array_map('intval', explode('/', $exif_data['ExposureTime']));
         if (!is_null($fragments[1] && $fragments[0])) {
             if (1 == $fragments[1]) {
                 $new_data['ShutterSpeed'] = $new_data['ExposureTime'] = sprintf('%1$d', $fragments[0]);
             } elseif (0 != $fragments[1]) {
                 $value = $fragments[0] / $fragments[1];
                 if (0 < $value && 1 > $value) {
                     // Convert to "1/" value for shutter speed
                     if (1 == $fragments[0]) {
                         $new_data['ShutterSpeed'] = $new_data['ExposureTime'];
                     } else {
                         $test = (double) number_format(1.0 / $value, 1, '.', '');
                         if (in_array($test, array(1.3, 1.5, 1.6, 2.5))) {
                             $new_data['ShutterSpeed'] = '1/' . number_format(1.0 / $value, 1, '.', '');
                         } else {
                             $new_data['ShutterSpeed'] = '1/' . number_format(1.0 / $value, 0, '.', '');
                         }
                     }
                 } else {
                     $new_data['ShutterSpeed'] = $new_data['ExposureTime'] = sprintf('%1$.2f', $value);
                 }
             }
             // fractional value
         }
         // valid denominator and non-zero numerator
     }
     // ShutterSpeed
     if (isset($exif_data['UndefinedTag:0xA420'])) {
         $new_data['ImageUniqueID'] = $exif_data['UndefinedTag:0xA420'];
     }
     if (isset($exif_data['UndefinedTag:0xA430'])) {
         $new_data['CameraOwnerName'] = $exif_data['UndefinedTag:0xA430'];
     }
     if (isset($exif_data['UndefinedTag:0xA431'])) {
         $new_data['BodySerialNumber'] = $exif_data['UndefinedTag:0xA431'];
     }
     if (isset($exif_data['UndefinedTag:0xA432']) && is_array($exif_data['UndefinedTag:0xA432'])) {
         $array = $new_data['LensSpecification'] = $exif_data['UndefinedTag:0xA432'];
         if (isset($array[0])) {
             if (false !== ($value = self::_rational_to_string($array[0], '%1$d', '%1$d/%2$d', '%1$.2f'))) {
                 $new_data['LensMinFocalLength'] = $value;
             }
         }
         if (isset($array[1])) {
             if (false !== ($value = self::_rational_to_string($array[1], '%1$d', '%1$d/%2$d', '%1$.2f'))) {
                 $new_data['LensMaxFocalLength'] = $value;
             }
         }
         if (isset($array[2])) {
             if (false !== ($value = self::_rational_to_string($array[2], '%1$d', '%1$d/%2$d', '%1$.1f'))) {
                 $new_data['LensMinFocalLengthFN'] = $value;
             }
         }
         if (isset($array[3])) {
             if (false !== ($value = self::_rational_to_string($array[3], '%1$d', '%1$d/%2$d', '%1$.1f'))) {
                 $new_data['LensMaxFocalLengthFN'] = $value;
             }
         }
     }
     if (isset($exif_data['UndefinedTag:0xA433'])) {
         $new_data['LensMake'] = $exif_data['UndefinedTag:0xA433'];
     }
     if (isset($exif_data['UndefinedTag:0xA434'])) {
         $new_data['LensModel'] = $exif_data['UndefinedTag:0xA434'];
     }
     if (isset($exif_data['UndefinedTag:0xA435'])) {
         $new_data['LensSerialNumber'] = $exif_data['UndefinedTag:0xA435'];
     }
     if (!empty($new_data)) {
         $results['mla_exif_metadata']['CAMERA'] = $new_data;
     }
     /*
      * Expand EXIF GPS values
      */
     $new_data = array();
     if (isset($exif_data['GPSVersion'])) {
         $new_data['Version'] = sprintf('%1$d.%2$d.%3$d.%4$d', ord($exif_data['GPSVersion'][0]), ord($exif_data['GPSVersion'][1]), ord($exif_data['GPSVersion'][2]), ord($exif_data['GPSVersion'][3]));
     }
     if (isset($exif_data['GPSLatitudeRef'])) {
         $new_data['LatitudeRef'] = $exif_data['GPSLatitudeRef'];
         $new_data['LatitudeRefS'] = 'N' == $exif_data['GPSLatitudeRef'] ? '' : '-';
         $ref = $new_data['LatitudeRef'];
         $refs = $new_data['LatitudeRefS'];
     } else {
         $ref = '';
         $refs = '';
     }
     if (isset($exif_data['GPSLatitude'])) {
         $rational = $exif_data['GPSLatitude'];
         $new_data['LatitudeD'] = $degrees = self::_rational_to_decimal($rational[0]);
         $new_data['LatitudeM'] = $minutes = self::_rational_to_decimal($rational[1]);
         $new_data['LatitudeS'] = sprintf('%1$01.4f', $seconds = self::_rational_to_decimal($rational[2]));
         $decimal_minutes = $minutes + $seconds / 60;
         $decimal_degrees = $decimal_minutes / 60;
         $new_data['Latitude'] = sprintf('%1$dd %2$d\' %3$01.4f" %4$s', $degrees, $minutes, $seconds, $ref);
         $new_data['LatitudeDM'] = sprintf('%1$d %2$01.4f', $degrees, $decimal_minutes);
         $new_data['LatitudeDD'] = sprintf('%1$01f', $degrees + $decimal_degrees);
         $new_data['LatitudeMinDec'] = substr($new_data['LatitudeDM'], strpos($new_data['LatitudeDM'], ' ') + 1);
         $new_data['LatitudeDegDec'] = substr($new_data['LatitudeDD'], strpos($new_data['LatitudeDD'], '.'));
         $new_data['LatitudeSDM'] = $refs . $new_data['LatitudeDM'];
         $new_data['LatitudeSDD'] = $refs . $new_data['LatitudeDD'];
         $new_data['LatitudeDM'] = $new_data['LatitudeDM'] . $ref;
         $new_data['LatitudeDD'] = $new_data['LatitudeDD'] . $ref;
     }
     if (isset($exif_data['GPSLongitudeRef'])) {
         $new_data['LongitudeRef'] = $exif_data['GPSLongitudeRef'];
         $new_data['LongitudeRefS'] = 'E' == $exif_data['GPSLongitudeRef'] ? '' : '-';
         $ref = $new_data['LongitudeRef'];
         $refs = $new_data['LongitudeRefS'];
     } else {
         $ref = '';
         $refs = '';
     }
     if (isset($exif_data['GPSLongitude'])) {
         $rational = $exif_data['GPSLongitude'];
         $new_data['LongitudeD'] = $degrees = self::_rational_to_decimal($rational[0]);
         $new_data['LongitudeM'] = $minutes = self::_rational_to_decimal($rational[1]);
         $new_data['LongitudeS'] = sprintf('%1$01.4f', $seconds = self::_rational_to_decimal($rational[2]));
         $decimal_minutes = $minutes + $seconds / 60;
         $decimal_degrees = $decimal_minutes / 60;
         $new_data['Longitude'] = sprintf('%1$dd %2$d\' %3$01.4f" %4$s', $degrees, $minutes, $seconds, $ref);
         $new_data['LongitudeDM'] = sprintf('%1$d %2$01.4f', $degrees, $decimal_minutes);
         $new_data['LongitudeDD'] = sprintf('%1$01f', $degrees + $decimal_degrees);
         $new_data['LongitudeMinDec'] = substr($new_data['LongitudeDM'], strpos($new_data['LongitudeDM'], ' ') + 1);
         $new_data['LongitudeDegDec'] = substr($new_data['LongitudeDD'], strpos($new_data['LongitudeDD'], '.'));
         $new_data['LongitudeSDM'] = $refs . $new_data['LongitudeDM'];
         $new_data['LongitudeSDD'] = $refs . $new_data['LongitudeDD'];
         $new_data['LongitudeDM'] = $new_data['LongitudeDM'] . $ref;
         $new_data['LongitudeDD'] = $new_data['LongitudeDD'] . $ref;
     }
     if (isset($exif_data['GPSAltitudeRef'])) {
         $new_data['AltitudeRef'] = sprintf('%1$d', ord($exif_data['GPSAltitudeRef'][0]));
         $new_data['AltitudeRefS'] = '0' == $new_data['AltitudeRef'] ? '' : '-';
         $refs = $new_data['AltitudeRefS'];
     } else {
         $refs = '';
     }
     if (isset($exif_data['GPSAltitude'])) {
         $new_data['Altitude'] = sprintf('%1$s%2$01.4f', $refs, $meters = self::_rational_to_decimal($exif_data['GPSAltitude']));
         $new_data['AltitudeFeet'] = sprintf('%1$s%2$01.2f', $refs, $meters * 3.280839895013);
     }
     if (isset($exif_data['GPSTimeStamp'])) {
         $rational = $exif_data['GPSTimeStamp'];
         $new_data['TimeStampH'] = sprintf('%1$02d', $hours = self::_rational_to_decimal($rational[0]));
         $new_data['TimeStampM'] = sprintf('%1$02d', $minutes = self::_rational_to_decimal($rational[1]));
         $new_data['TimeStampS'] = sprintf('%1$02d', $seconds = self::_rational_to_decimal($rational[2]));
         $new_data['TimeStamp'] = sprintf('%1$02d:%2$02d:%3$02d', $hours, $minutes, $seconds);
     }
     if (isset($exif_data['GPSDateStamp'])) {
         $parts = explode(':', $exif_data['GPSDateStamp']);
         $new_data['DateStampY'] = $parts[0];
         $new_data['DateStampM'] = $parts[1];
         $new_data['DateStampD'] = $parts[2];
         $new_data['DateStamp'] = $exif_data['GPSDateStamp'];
     }
     if (isset($exif_data['GPSMapDatum'])) {
         $new_data['MapDatum'] = $exif_data['GPSMapDatum'];
     }
     if (!empty($new_data)) {
         $results['mla_exif_metadata']['GPS'] = $new_data;
     }
     /*
     		 * Expand EXIF array values - replaced by mla_find_array_element MLA v2.13
     		 * /
     		foreach ( $results['mla_exif_metadata'] as $exif_key => $exif_value ) {
     			if ( is_array( $exif_value ) ) {
     				foreach ( $exif_value as $key => $value ) {
     					$results['mla_exif_metadata'][ $exif_key . '.' . $key ] = $value;
     				}
     			} // is_array
     		} // */
     return $results;
 }
 /**
  * Assemble the in-memory representation of the (read-only) Optional Upload MIME Types 
  *
  * @since 1.40
  *
  * @return	boolean	Success (true) or failure (false) of the operation
  */
 private static function _get_optional_upload_mime_templates()
 {
     if (NULL != self::$mla_optional_upload_mime_templates) {
         return true;
     }
     self::$mla_optional_upload_mime_templates = array();
     $template_array = MLAData::mla_load_template('mla-default-mime-types.tpl');
     if (isset($template_array['mla-optional-mime-types'])) {
         $mla_mime_types = preg_split('/[\\r\\n]+/', $template_array['mla-optional-mime-types']);
         $ID = 0;
         foreach ($mla_mime_types as $mla_type) {
             $array = explode(',', $mla_type);
             $slug = $array[0];
             if ($matched_type = self::mla_get_upload_mime($slug)) {
                 $core_type = $matched_type['core_type'];
                 $mla_type = $matched_type['mla_type'];
             } else {
                 $core_type = '';
                 $mla_type = '';
             }
             self::$mla_optional_upload_mime_templates[++$ID] = array('ID' => $ID, 'slug' => $slug, 'mime_type' => $array[1], 'core_type' => $core_type, 'mla_type' => $mla_type, 'description' => $array[2]);
         }
     }
     return true;
 }
 /**
  * Prepares the list of items for displaying
  *
  * This is where you prepare your data for display. This method will usually
  * be used to query the database, sort and filter the data, and generally
  * get it ready to be displayed. At a minimum, we should set $this->items and
  * $this->set_pagination_args().
  *
  * @since 0.1
  */
 function prepare_items()
 {
     // Initialize $this->_column_headers
     $this->get_column_info();
     /*
      * Calculate and filter pagination arguments.
      */
     $user = get_current_user_id();
     $option = $this->screen->get_option('per_page', 'option');
     $per_page = (int) get_user_meta($user, $option, true);
     if (empty($per_page) || $per_page < 1) {
         $per_page = (int) $this->screen->get_option('per_page', 'default');
     }
     $current_page = isset($_REQUEST['paged']) ? absint($_REQUEST['paged']) : 1;
     $pagination = apply_filters_ref_array('mla_list_table_prepare_items_pagination', array(compact(array('per_page', 'current_page')), &$this));
     $per_page = isset($pagination['per_page']) ? $pagination['per_page'] : $per_page;
     $current_page = isset($pagination['current_page']) ? $pagination['current_page'] : $current_page;
     /*
      * Assign sorted and paginated data to the items property, where 
      * it can be used by the rest of the class.
      */
     $total_items = apply_filters_ref_array('mla_list_table_prepare_items_total_items', array(NULL, &$this));
     if (is_null($total_items)) {
         $total_items = MLAData::mla_count_list_table_items($_REQUEST, ($current_page - 1) * $per_page, $per_page);
     }
     /*
      * Register the pagination options & calculations.
      */
     $this->set_pagination_args(array('total_items' => $total_items, 'per_page' => $per_page, 'total_pages' => ceil($total_items / $per_page)));
     $this->items = apply_filters_ref_array('mla_list_table_prepare_items_the_items', array(NULL, &$this));
     if (is_null($this->items)) {
         $this->items = MLAData::mla_query_list_table_items($_REQUEST, ($current_page - 1) * $per_page, $per_page);
     }
     do_action_ref_array('mla_list_table_prepare_items', array(&$this));
 }
 /**
  * Saves updates from the Edit Media screen.
  * Declared public because it is an action.
  *
  * @since 0.80
  *
  * @param	integer	ID of the current post
  *
  * @return	void
  */
 public static function mla_edit_attachment_action($post_ID)
 {
     $new_data = array();
     if (isset($_REQUEST['mla_post_parent'])) {
         $new_data['post_parent'] = $_REQUEST['mla_post_parent'];
     }
     if (isset($_REQUEST['mla_menu_order'])) {
         $new_data['menu_order'] = $_REQUEST['mla_menu_order'];
     }
     if (!empty($new_data)) {
         MLAData::mla_update_single_item($post_ID, $new_data);
     }
 }
 /**
  * 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;
 }
Example #18
0
 /**
  * Extract Metadata from a PDF file
  * 
  * @since 1.50
  *
  * @param	string	full path to the desired file
  *
  * @return	array	( key => value ) for each metadata field, in string format
  */
 private static function _extract_pdf_metadata($file_name)
 {
     $metadata = array();
     self::$pdf_indirect_objects = NULL;
     $chunksize = 16384;
     if (!file_exists($file_name)) {
         return $metadata;
     }
     $filesize = filesize($file_name);
     $file_offset = $chunksize < $filesize ? $filesize - $chunksize : 0;
     $tail = file_get_contents($file_name, false, NULL, $file_offset);
     if (0 == $file_offset) {
         $header = substr($tail, 0, 128);
     } else {
         $header = file_get_contents($file_name, false, NULL, 0, 128);
     }
     if ('%PDF-' == substr($header, 0, 5)) {
         $metadata['PDF_Version'] = substr($header, 1, 7);
         $metadata['PDF_VersionNumber'] = substr($header, 5, 3);
     }
     /*
      * Find the xref and (optional) trailer
      */
     $match_count = preg_match_all('/startxref[\\x00-\\x20]+(\\d+)[\\x00-\\x20]+\\%\\%EOF/', $tail, $matches, PREG_OFFSET_CAPTURE);
     if (0 == $match_count) {
         error_log('ERROR: startxref not found ' . var_export($path, true), 0);
         return $metadata;
     }
     $startxref = (int) $matches[1][$match_count - 1][0];
     $trailer_dictionaries = self::_extract_pdf_trailer($file_name, $startxref);
     if (is_array($trailer_dictionaries)) {
         $info_reference = NULL;
         foreach ($trailer_dictionaries as $trailer_dictionary) {
             if (isset($trailer_dictionary['Info'])) {
                 $info_reference = $trailer_dictionary['Info'];
                 break;
             }
         }
         if (isset($info_reference)) {
             $info_object = self::_find_pdf_indirect_dictionary($file_name, $info_reference['object'], $info_reference['generation']);
             if ($info_object) {
                 $info_dictionary = self::_parse_pdf_dictionary($info_object['content'], 0);
                 unset($info_dictionary['/length']);
                 foreach ($info_dictionary as $name => $value) {
                     if ('string' == $value['type']) {
                         $prefix = substr($value['value'], 0, 2);
                         if ('D:' == $prefix) {
                             $metadata[$name] = self::_parse_pdf_date($value['value']);
                         } elseif (chr(0xfe) . chr(0xff) == $prefix) {
                             $metadata[$name] = self::_parse_pdf_UTF16BE($value['value']);
                         } else {
                             $metadata[$name] = $value['value'];
                         }
                     } else {
                         $metadata[$name] = $value['value'];
                     }
                 }
                 // each info entry
             }
             // found Info object
         }
         // found Info reference
         /*
          * Look for XMP Metadata
          */
         $root_reference = NULL;
         foreach ($trailer_dictionaries as $trailer_dictionary) {
             if (isset($trailer_dictionary['Root'])) {
                 $root_reference = $trailer_dictionary['Root'];
                 break;
             }
         }
         if (isset($root_reference)) {
             $root_object = self::_find_pdf_indirect_dictionary($file_name, $root_reference['object'], $root_reference['generation']);
             if ($root_object) {
                 $root_dictionary = self::_parse_pdf_dictionary($root_object['content'], 0);
                 unset($root_dictionary['/length']);
                 if (isset($root_dictionary['Metadata'])) {
                     $xmp_object = self::_find_pdf_indirect_dictionary($file_name, $root_dictionary['Metadata']['object'], $root_dictionary['Metadata']['generation']);
                     $xmp = self::_parse_xmp_metadata($file_name, $xmp_object['start'] + $xmp_object['length']);
                     if (is_array($xmp)) {
                         $metadata = array_merge($metadata, $xmp);
                     }
                 }
                 // found Metadata reference
             }
             // found Root object
         }
         // found Root reference
     }
     // found trailer_dictionaries
     return $metadata;
 }
 /**
  * Prepares the list of items for displaying
  *
  * This is where you prepare your data for display. This method will usually
  * be used to query the database, sort and filter the data, and generally
  * get it ready to be displayed. At a minimum, we should set $this->items and
  * $this->set_pagination_args().
  *
  * @since 0.1
  *
  * @return	void
  */
 function prepare_items()
 {
     $this->_column_headers = array($this->get_columns(), $this->get_hidden_columns(), $this->get_sortable_columns());
     /*
      * REQUIRED for pagination.
      */
     $user = get_current_user_id();
     $screen = get_current_screen();
     $option = $screen->get_option('per_page', 'option');
     $per_page = get_user_meta($user, $option, true);
     if (empty($per_page) || $per_page < 1) {
         $per_page = $screen->get_option('per_page', 'default');
     }
     //		$current_page = $this->get_pagenum();
     $current_page = isset($_REQUEST['paged']) ? absint($_REQUEST['paged']) : 1;
     /*
      * REQUIRED. Assign sorted and paginated data to the items property, where 
      * it can be used by the rest of the class.
      */
     $total_items = MLAData::mla_count_list_table_items($_REQUEST, ($current_page - 1) * $per_page, $per_page);
     $this->items = MLAData::mla_query_list_table_items($_REQUEST, ($current_page - 1) * $per_page, $per_page);
     /*
      * REQUIRED. We also have to register our pagination options & calculations.
      */
     $this->set_pagination_args(array('total_items' => $total_items, 'per_page' => $per_page, 'total_pages' => ceil($total_items / $per_page)));
 }
Example #20
0
 /**
  * Ajax handler to set post_parent for a single attachment
  *
  * Adapted from wp_ajax_inline_save in /wp-admin/includes/ajax-actions.php
  *
  * @since 0.20
  *
  * @return	void	echo HTML <td> innerHTML for updated call or error message, then die()
  */
 public static function mla_set_parent_ajax_action()
 {
     check_ajax_referer(MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME);
     if (empty($_REQUEST['post_ID'])) {
         echo __('ERROR', 'media-library-assistant') . ': ' . __('No post ID found', 'media-library-assistant');
         die;
     } else {
         $post_id = $_REQUEST['post_ID'];
     }
     if (!current_user_can('edit_post', $post_id)) {
         wp_die(__('ERROR', 'media-library-assistant') . ': ' . __('You are not allowed to edit this Attachment.', 'media-library-assistant'));
     }
     if (!class_exists('MLAData')) {
         require_once MLA_PLUGIN_PATH . 'includes/class-mla-data.php';
         MLAData::initialize();
     }
     $results = MLAData::mla_update_single_item($post_id, $_REQUEST);
     if (false !== strpos($results['message'], __('ERROR', 'media-library-assistant'))) {
         wp_die($results['message']);
     }
     $new_item = (object) MLAData::mla_get_attachment_by_id($post_id);
     if (!class_exists('MLA_List_Table')) {
         require_once MLA_PLUGIN_PATH . 'includes/class-mla-list-table.php';
         MLA_List_Table::mla_admin_init_action();
     }
     //	Create an instance of our package class and echo the new HTML
     $MLAListTable = apply_filters('mla_list_table_new_instance', NULL);
     if (is_null($MLAListTable)) {
         $MLAListTable = new MLA_List_Table();
     }
     $MLAListTable->single_row($new_item);
     die;
     // this is required to return a proper result
 }
 /**
  * Ajax handler for Media Manager queries 
  *
  * Adapted from wp_ajax_query_attachments in /wp-admin/includes/ajax-actions.php
  *
  * @since 1.20
  *
  * @return	void	echo HTML <tr> markup for updated row or error message, then die()
  */
 public static function mla_query_attachments_action()
 {
     if (!current_user_can('upload_files')) {
         wp_send_json_error();
     }
     /*
      * Pick out and clean up the query terms we can process
      */
     $query = isset($_REQUEST['query']) ? (array) $_REQUEST['query'] : array();
     $query = array_intersect_key($query, array_flip(array('order', 'orderby', 'posts_per_page', 'paged', 'post_mime_type', 'post_parent', 'post__in', 'post__not_in', 'mla_filter_month', 'mla_filter_term', 'mla_search_value', 's', 'mla_search_fields', 'mla_search_connector')));
     if (isset($query['post_mime_type'])) {
         if ('detached' == $query['post_mime_type']) {
             $query['detached'] = '1';
             unset($query['post_mime_type']);
         } else {
             $view = $query['post_mime_type'];
             unset($query['post_mime_type']);
             $query = array_merge($query, MLAMime::mla_prepare_view_query('view', $view));
         }
     }
     /*
      * Convert mla_filter_month back to the WordPress "m" parameter
      */
     if (isset($query['mla_filter_month'])) {
         if ('0' != $query['mla_filter_month']) {
             $query['m'] = $query['mla_filter_month'];
         }
         unset($query['mla_filter_month']);
     }
     /*
      * Process the enhanced search box OR fix up the default search box
      */
     if (isset($query['mla_search_value'])) {
         if (!empty($query['mla_search_value'])) {
             $query['s'] = $query['mla_search_value'];
         }
         //			else
         //				unset( $query['s'] );
         unset($query['mla_search_value']);
     }
     /*		elseif ( ! empty( $query['s'] ) ) {
     			$query['mla_search_fields'] = array( 'title', 'content' );
     			$query['mla_search_connector'] = 'AND';
     		} // */
     if (isset($query['posts_per_page'])) {
         $count = $query['posts_per_page'];
         $offset = $count * (isset($query['paged']) ? $query['paged'] - 1 : 0);
     } else {
         $count = 0;
         $offset = 0;
     }
     /*
      * Check for sorting override
      */
     $option = MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_MODAL_ORDERBY);
     if ('default' != $option) {
         /*
          * Make sure the current orderby choice still exists or revert to default.
          */
         $default_orderby = array_merge(array('none' => array('none', false)), MLA_List_Table::mla_get_sortable_columns());
         $found_current = false;
         foreach ($default_orderby as $key => $value) {
             if ($option == $value[0]) {
                 $found_current = true;
                 break;
             }
         }
         if (!$found_current) {
             MLAOptions::mla_delete_option(MLAOptions::MLA_DEFAULT_ORDERBY);
             $option = MLAOptions::mla_get_option(MLAOptions::MLA_DEFAULT_ORDERBY);
         }
         $query['orderby'] = $option;
     }
     $option = MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_MODAL_ORDER);
     if ('default' != $option) {
         $query['order'] = $option;
     }
     $query['post_type'] = 'attachment';
     $query['post_status'] = 'inherit';
     if (current_user_can(get_post_type_object('attachment')->cap->read_private_posts)) {
         $query['post_status'] .= ',private';
     }
     $query = MLAData::mla_query_media_modal_items($query, $offset, $count);
     $posts = array_map('wp_prepare_attachment_for_js', $query->posts);
     $posts = array_filter($posts);
     wp_send_json_success($posts);
 }