/** * 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; }
/** * 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&mla_tab=documentation#mla_language_tab" title="' . __('Language Options documentation', 'media-library-assistant') . '">' . __('WPML & 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 = '« ' . __('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') . ' »'; } } $new_link .= $new_text . '</a>'; } return $new_link; }
/** * 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 }
/** * 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' => '— ' . __('select settings', 'media-library-assistant') . ' —', '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; }
/** * 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))); }
/** * 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); }