if (!empty($_REQUEST['s'])) { $search_value = esc_attr(stripslashes(trim($_REQUEST['s']))); $search_fields = isset($_REQUEST['mla_search_fields']) ? $_REQUEST['mla_search_fields'] : array(); $search_connector = $_REQUEST['mla_search_connector']; } else { $search_value = MLAOptions::mla_get_option(MLAOptions::MLA_SEARCH_MEDIA_FILTER_DEFAULTS); $search_fields = $search_value['search_fields']; $search_connector = $search_value['search_connector']; $search_value = ''; } if ('checked' == MLAOptions::mla_get_option(MLAOptions::MLA_SEARCH_MEDIA_FILTER_SHOW_CONTROLS)) { $controls_style = 'style="display: inline;"'; } else { $controls_style = 'style="display: none;"'; } $supported_taxonomies = MLAOptions::mla_supported_taxonomies('support'); if (empty($supported_taxonomies)) { $terms_style = 'style="display: none;"'; unset($search_fields['terms']); } else { $terms_style = 'style="display: inline;"'; } ?> <p class="search-box"> <label class="screen-reader-text" for="mla-media-search-input"><?php _e('Search Media', 'media-library-assistant'); ?> </label> <input name="s" id="mla-media-search-input" type="text" size="45" value="<?php echo $search_value; ?>
/** * 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; }
/** * Adds settings values to be passed to the Media Manager in /wp-includes/js/media-views.js. * Declared public because it is a filter. * * @since 1.20 * * @param array associative array with setting => value pairs * @param object || NULL current post object, if available * * @return array updated $settings array */ public static function mla_media_view_settings_filter($settings, $post) { /* * If we know what screen we're on we can test our enabling options */ self::$mla_media_modal_settings['screen'] = 'modal'; if (function_exists('get_current_screen')) { $screen = get_current_screen(); if (is_object($screen) && 'upload' == $screen->base) { self::$mla_media_modal_settings['screen'] = 'grid'; } } self::$mla_media_modal_settings['comma'] = _x(',', 'tag_delimiter', 'media-library-assistant'); self::$mla_media_modal_settings['ajaxNonce'] = wp_create_nonce(MLA::MLA_ADMIN_NONCE_ACTION, MLA::MLA_ADMIN_NONCE_NAME); self::$mla_media_modal_settings['allMimeTypes'] = MLAMime::mla_pluck_table_views(); self::$mla_media_modal_settings['allMimeTypes']['detached'] = MLAOptions::$mla_option_definitions[MLAOptions::MLA_POST_MIME_TYPES]['std']['detached']['plural']; self::$mla_media_modal_settings['allMimeTypes']['attached'] = MLAOptions::$mla_option_definitions[MLAOptions::MLA_POST_MIME_TYPES]['std']['attached']['plural']; /* * Trash items are allowed in the Media/Library Grid view */ if (EMPTY_TRASH_DAYS && MEDIA_TRASH) { self::$mla_media_modal_settings['allMimeTypes']['trash'] = MLAOptions::$mla_option_definitions[MLAOptions::MLA_POST_MIME_TYPES]['std']['trash']['plural']; } self::$mla_media_modal_settings['months'] = self::_months_dropdown('attachment'); self::$mla_media_modal_settings['termsTaxonomy'] = MLAOptions::mla_taxonomy_support('', 'filter'); $terms_options = self::_terms_options(MLA_List_Table::mla_get_taxonomy_filter_dropdown()); self::$mla_media_modal_settings['termsClass'] = $terms_options['class']; self::$mla_media_modal_settings['termsValue'] = $terms_options['value']; self::$mla_media_modal_settings['termsText'] = $terms_options['text']; $current_version = get_bloginfo('version'); if (version_compare($current_version, '3.9', '<') && version_compare($current_version, '3.6', '>=')) { self::$mla_media_modal_settings['termsIndent'] = '-'; } self::$mla_media_modal_settings['enableMediaGrid'] = 'checked' == MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_GRID_TOOLBAR); self::$mla_media_modal_settings['enableMediaModal'] = 'checked' == MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_MODAL_TOOLBAR); self::$mla_media_modal_settings['enableDetailsCategory'] = 'checked' == MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_MODAL_DETAILS_CATEGORY_METABOX); self::$mla_media_modal_settings['enableDetailsTag'] = 'checked' == MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_MODAL_DETAILS_TAG_METABOX); self::$mla_media_modal_settings['enableMimeTypes'] = 'checked' == MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_MODAL_MIMETYPES); self::$mla_media_modal_settings['enableMonthsDropdown'] = 'checked' == MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_MODAL_MONTHS); self::$mla_media_modal_settings['enableSearchBox'] = 'checked' == MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_MODAL_SEARCHBOX); self::$mla_media_modal_settings['enableSearchBoxControls'] = 'checked' == MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_MODAL_SEARCHBOX_CONTROLS); $supported_taxonomies = MLAOptions::mla_supported_taxonomies('support'); self::$mla_media_modal_settings['enableTermsDropdown'] = 'checked' == MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_MODAL_TERMS) && !empty($supported_taxonomies); self::$mla_media_modal_settings['enableTermsAutofill'] = 'checked' == MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_MODAL_DETAILS_AUTOFILL) && !empty($supported_taxonomies); $supported_taxonomies = MLAOptions::mla_supported_taxonomies('term-search'); self::$mla_media_modal_settings['enableTermsSearch'] = 'checked' == MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_MODAL_TERMS_SEARCH) && !empty($supported_taxonomies); /* * Compile a list of the enhanced taxonomies */ self::$mla_media_modal_settings['enhancedTaxonomies'] = array(); foreach (get_taxonomies(array('show_ui' => true), 'objects') as $key => $value) { if (MLAOptions::mla_taxonomy_support($key)) { if (!($use_checklist = $value->hierarchical)) { $use_checklist = MLAOptions::mla_taxonomy_support($key, 'flat-checklist'); } /* * Make sure the appropriate MMMW Enhancement option has been checked */ if ($use_checklist) { if ('checked' === MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_MODAL_DETAILS_CATEGORY_METABOX)) { self::$mla_media_modal_settings['enhancedTaxonomies'][] = $key; } } else { if ('checked' === MLAOptions::mla_get_option(MLAOptions::MLA_MEDIA_MODAL_DETAILS_TAG_METABOX)) { self::$mla_media_modal_settings['enhancedTaxonomies'][] = $key; } } } // taxonomy_support } // each taxonomy /* * Set and filter the initial values for toolbar controls */ $search_defaults = MLAOptions::mla_get_option(MLAOptions::MLA_SEARCH_MEDIA_FILTER_DEFAULTS); $initial_values = array('filterMime' => 'all', 'filterUploaded' => 'all', 'filterMonth' => 0, 'filterTerm' => 0, 'searchConnector' => $search_defaults['search_connector'], 'searchFields' => $search_defaults['search_fields'], 'searchValue' => ''); $initial_values = apply_filters('mla_media_modal_initial_filters', $initial_values, $post); // No supported taxonomies implies no "terms" search $supported_taxonomies = MLAOptions::mla_supported_taxonomies('support'); if (empty($supported_taxonomies)) { $index = array_search('terms', $initial_values['searchFields']); if (false !== $index) { unset($initial_values['searchFields'][$index]); } } /* * Except for filterMime/post_mime_type, these will be passed * back to the server in the query['s'] field. */ self::$mla_media_modal_settings['query']['initial']['filterMime'] = $initial_values['filterMime']; // post_mime_type 'image'; // self::$mla_media_modal_settings['query']['initial']['filterUploaded'] = $initial_values['filterUploaded']; // post_mime_type 'image'; // self::$mla_media_modal_settings['query']['initial']['filterMonth'] = $initial_values['filterMonth']; // mla_filter_month '201404'; // self::$mla_media_modal_settings['query']['initial']['filterTerm'] = $initial_values['filterTerm']; // mla_filter_term '175'; // self::$mla_media_modal_settings['query']['initial']['searchConnector'] = $initial_values['searchConnector']; // mla_search_connector 'OR'; // self::$mla_media_modal_settings['query']['initial']['searchFields'] = $initial_values['searchFields']; // mla_search_fields array( 'excerpt', 'title', 'content' ); // self::$mla_media_modal_settings['query']['initial']['searchValue'] = $initial_values['searchValue']; // mla_search_value 'col'; // //self::$mla_media_modal_settings['query']['initial']['termsSearch'] = $initial_values['termsSearch']; // mla_terms_search self::$mla_media_modal_settings['query']['initial']['searchClicks'] = 0; // mla_search_clicks, to force transmission $settings = array_merge($settings, array('mla_settings' => self::$mla_media_modal_settings)); return apply_filters('mla_media_modal_settings', $settings, $post); }
/** * Extra controls to be displayed between bulk actions and pagination * * Modeled after class-wp-posts-list-table.php in wp-admin/includes. * * @since 0.1 * * @param string 'top' or 'bottom', i.e., above or below the table rows * * @return array Contains all the bulk actions: 'slugs'=>'Visible Titles' */ function extra_tablenav($which) { echo '<div class="alignleft actions">'; if ('top' == $which) { $this->months_dropdown('attachment'); echo self::mla_get_taxonomy_filter_dropdown(isset($_REQUEST['mla_filter_term']) ? $_REQUEST['mla_filter_term'] : 0); submit_button(__('Filter', 'media-library-assistant'), 'secondary', 'mla_filter', false, array('id' => 'post-query-submit')); $term_search_taxonomies = MLAOptions::mla_supported_taxonomies('term-search'); if (!empty($term_search_taxonomies)) { submit_button(__('Terms Search', 'media-library-assistant'), 'secondary', 'mla_filter', false, array('id' => 'mla-terms-search-open', 'onclick' => 'mlaTaxonomy.termsSearch.open()')); } } if (self::mla_submenu_arguments(true) != self::mla_submenu_arguments(false)) { submit_button(__('Clear Filter-by', 'media-library-assistant'), 'button apply', 'clear_filter_by', false); } if ($this->is_trash && current_user_can('edit_others_posts')) { submit_button(__('Empty Trash', 'media-library-assistant'), 'button apply', 'delete_all', false); } echo '</div>'; }
/** * Sanitize and expand query arguments from request variables * * Prepare the arguments for WP_Query. * Modeled after wp_edit_attachments_query in wp-admin/post.php * * @since 0.1 * * @param array query parameters from web page, usually found in $_REQUEST * @param int Optional number of rows (default 0) to skip over to reach desired page * @param int Optional number of rows on each page (0 = all rows, default) * * @return array revised arguments suitable for WP_Query */ private static function _prepare_list_table_query($raw_request, $offset = 0, $count = 0) { /* * Go through the $raw_request, take only the arguments that are used in the query and * sanitize or validate them. */ if (!is_array($raw_request)) { /* 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'), 'MLAData::_prepare_list_table_query', var_export($raw_request, true)), 0); return null; } /* * 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()); $current_orderby = MLAOptions::mla_get_option(MLAOptions::MLA_DEFAULT_ORDERBY); $found_current = false; foreach ($default_orderby as $key => $value) { if ($current_orderby == $value[0]) { $found_current = true; break; } } if ($found_current) { /* * Custom fields can have HTML reserved characters, which are encoded by * mla_get_sortable_columns, so a separate, unencoded list is required. */ $default_orderby = MLAOptions::mla_custom_field_support('custom_sortable_columns'); foreach ($default_orderby as $sort_key => $sort_value) { if ($current_orderby == $sort_key) { $current_orderby = 'c_' . $sort_value[0]; break; } } // foreach } else { MLAOptions::mla_delete_option(MLAOptions::MLA_DEFAULT_ORDERBY); $current_orderby = MLAOptions::mla_get_option(MLAOptions::MLA_DEFAULT_ORDERBY); } $clean_request = array('m' => 0, 'orderby' => $current_orderby, 'order' => MLAOptions::mla_get_option(MLAOptions::MLA_DEFAULT_ORDER), 'post_type' => 'attachment', 'post_status' => 'inherit', 'mla_search_connector' => 'AND', 'mla_search_fields' => array()); foreach ($raw_request as $key => $value) { switch ($key) { /* * 'sentence' and 'exact' modify the keyword search ('s') * Their value is not important, only their presence. */ case 'sentence': case 'exact': case 'mla-tax': case 'mla-term': $clean_request[$key] = sanitize_key($value); break; case 'orderby': if (in_array($value, array('none', 'post__in'))) { $clean_request[$key] = $value; } else { $orderby = NULL; /* * Custom fields can have HTML reserved characters, which are encoded by * mla_get_sortable_columns, so a separate, unencoded list is required. */ $sortable_columns = MLAOptions::mla_custom_field_support('custom_sortable_columns'); foreach ($sortable_columns as $sort_key => $sort_value) { if ($value == $sort_key) { $orderby = 'c_' . $sort_value[0]; break; } } // foreach if (NULL === $orderby) { $sortable_columns = MLA_List_Table::mla_get_sortable_columns(); foreach ($sortable_columns as $sort_key => $sort_value) { if ($value == $sort_value[0]) { $orderby = $value; break; } } // foreach } if (NULL !== $orderby) { $clean_request[$key] = $orderby; } } break; /* * ids allows hooks to supply a persistent list of items */ /* * ids allows hooks to supply a persistent list of items */ case 'ids': if (is_array($value)) { $clean_request['post__in'] = $value; } else { $clean_request['post__in'] = array_map('absint', explode(',', $value)); } break; /* * post__in and post__not_in are used in the Media Modal Ajax queries */ /* * post__in and post__not_in are used in the Media Modal Ajax queries */ case 'post__in': case 'post__not_in': case 'post_mime_type': $clean_request[$key] = $value; break; case 'parent': case 'post_parent': $clean_request['post_parent'] = absint($value); break; /* * ['m'] - filter by year and month of post, e.g., 201204 */ /* * ['m'] - filter by year and month of post, e.g., 201204 */ case 'author': case 'm': $clean_request[$key] = absint($value); break; /* * ['mla_filter_term'] - filter by category or tag ID; -1 allowed */ /* * ['mla_filter_term'] - filter by category or tag ID; -1 allowed */ case 'mla_filter_term': $clean_request[$key] = intval($value); break; case 'order': switch ($value = strtoupper($value)) { case 'ASC': case 'DESC': $clean_request[$key] = $value; break; default: $clean_request[$key] = 'ASC'; } break; case 'detached': if ('0' == $value || '1' == $value) { $clean_request['detached'] = $value; } break; case 'status': if ('trash' == $value) { $clean_request['post_status'] = 'trash'; } break; /* * ['s'] - Search Media by one or more keywords * ['mla_search_connector'], ['mla_search_fields'] - Search Media options */ /* * ['s'] - Search Media by one or more keywords * ['mla_search_connector'], ['mla_search_fields'] - Search Media options */ case 's': switch (substr($value, 0, 3)) { case '>|<': $clean_request['debug'] = 'console'; break; case '<|>': $clean_request['debug'] = 'log'; break; } if (isset($clean_request['debug'])) { $value = substr($value, 3); } $value = stripslashes(trim($value)); if (!empty($value)) { $clean_request[$key] = $value; } break; case 'mla_terms_search': if (!empty($value['phrases']) && !empty($value['taxonomies'])) { $value['phrases'] = stripslashes(trim($value['phrases'])); if (!empty($value['phrases'])) { $clean_request[$key] = $value; } } break; case 'mla_search_connector': case 'mla_search_fields': $clean_request[$key] = $value; break; case 'mla-metakey': case 'mla-metavalue': $clean_request[$key] = stripslashes($value); break; case 'meta_query': if (!empty($value)) { if (is_array($value)) { $clean_request[$key] = $value; } else { $clean_request[$key] = unserialize(stripslashes($value)); unset($clean_request[$key]['slug']); } // not array } break; default: // ignore anything else in $_REQUEST } // switch $key } // foreach $raw_request /* * Pass query and search parameters to the filters for _execute_list_table_query */ self::$query_parameters = array('use_postmeta_view' => false, 'orderby' => $clean_request['orderby'], 'order' => $clean_request['order']); self::$query_parameters['detached'] = isset($clean_request['detached']) ? $clean_request['detached'] : NULL; self::$search_parameters = array('debug' => 'none'); /* * Matching a meta_value to NULL requires a LEFT JOIN to a view and a special WHERE clause * Matching a wildcard pattern requires mainpulating the WHERE clause, too */ if (isset($clean_request['meta_query']['key'])) { self::$query_parameters['use_postmeta_view'] = true; self::$query_parameters['postmeta_key'] = $clean_request['meta_query']['key']; self::$query_parameters['postmeta_value'] = NULL; unset($clean_request['meta_query']); } elseif (isset($clean_request['meta_query']['patterns'])) { self::$query_parameters['patterns'] = $clean_request['meta_query']['patterns']; unset($clean_request['meta_query']['patterns']); } if (isset($clean_request['debug'])) { self::$query_parameters['debug'] = $clean_request['debug']; self::$search_parameters['debug'] = $clean_request['debug']; MLA::mla_debug_mode($clean_request['debug']); unset($clean_request['debug']); } /* * We must patch the WHERE clause if there are leading spaces in the meta_value */ if (isset($clean_request['mla-metavalue']) && 0 < strlen($clean_request['mla-metavalue']) && ' ' == $clean_request['mla-metavalue'][0]) { self::$query_parameters['mla-metavalue'] = $clean_request['mla-metavalue']; } /* * We will handle "Terms Search" in the mla_query_posts_search_filter. */ if (isset($clean_request['mla_terms_search'])) { self::$search_parameters['mla_terms_search'] = $clean_request['mla_terms_search']; /* * The Terms Search overrides any terms-based keyword search for now; too complicated. */ if (isset($clean_request['mla_search_fields'])) { foreach ($clean_request['mla_search_fields'] as $index => $field) { if ('terms' == $field) { unset($clean_request['mla_search_fields'][$index]); } } } } /* * We will handle keyword search in the mla_query_posts_search_filter. */ if (isset($clean_request['s'])) { self::$search_parameters['s'] = $clean_request['s']; self::$search_parameters['mla_search_fields'] = apply_filters('mla_list_table_search_filter_fields', $clean_request['mla_search_fields'], array('content', 'title', 'excerpt', 'alt-text', 'name', 'terms')); self::$search_parameters['mla_search_connector'] = $clean_request['mla_search_connector']; self::$search_parameters['sentence'] = isset($clean_request['sentence']); self::$search_parameters['exact'] = isset($clean_request['exact']); if (in_array('alt-text', self::$search_parameters['mla_search_fields'])) { self::$query_parameters['use_postmeta_view'] = true; self::$query_parameters['postmeta_key'] = '_wp_attachment_image_alt'; } if (in_array('terms', self::$search_parameters['mla_search_fields'])) { self::$search_parameters['mla_search_taxonomies'] = MLAOptions::mla_supported_taxonomies('term-search'); } unset($clean_request['s']); unset($clean_request['mla_search_connector']); unset($clean_request['mla_search_fields']); unset($clean_request['sentence']); unset($clean_request['exact']); } /* * We have to handle custom field/post_meta values here * because they need a JOIN clause supplied by WP_Query */ if ('c_' == substr($clean_request['orderby'], 0, 2)) { $option_value = MLAOptions::mla_custom_field_option_value($clean_request['orderby']); if (isset($option_value['name'])) { self::$query_parameters['use_postmeta_view'] = true; self::$query_parameters['postmeta_key'] = $option_value['name']; if (isset($clean_request['orderby'])) { unset($clean_request['orderby']); } if (isset($clean_request['order'])) { unset($clean_request['order']); } } } else { // custom field switch (self::$query_parameters['orderby']) { /* * '_wp_attachment_image_alt' is special; we'll handle it in the JOIN and ORDERBY filters */ case '_wp_attachment_image_alt': self::$query_parameters['use_postmeta_view'] = true; self::$query_parameters['postmeta_key'] = '_wp_attachment_image_alt'; if (isset($clean_request['orderby'])) { unset($clean_request['orderby']); } if (isset($clean_request['order'])) { unset($clean_request['order']); } break; case '_wp_attached_file': $clean_request['meta_key'] = '_wp_attached_file'; $clean_request['orderby'] = 'meta_value'; $clean_request['order'] = self::$query_parameters['order']; break; } // switch $orderby } /* * Ignore incoming paged value; use offset and count instead */ if ((int) $count > 0) { $clean_request['offset'] = $offset; $clean_request['posts_per_page'] = $count; } elseif ((int) $count == -1) { $clean_request['posts_per_page'] = $count; } /* * ['mla_filter_term'] - filter by taxonomy * * cat = 0 is "All Categories", i.e., no filtering * cat = -1 is "No Categories" */ if (isset($clean_request['mla_filter_term'])) { if ($clean_request['mla_filter_term'] != 0) { $tax_filter = MLAOptions::mla_taxonomy_support('', 'filter'); if ($clean_request['mla_filter_term'] == -1) { $term_list = get_terms($tax_filter, array('fields' => 'ids', 'hide_empty' => false)); $clean_request['tax_query'] = array(array('taxonomy' => $tax_filter, 'field' => 'id', 'terms' => $term_list, 'operator' => 'NOT IN')); } else { // mla_filter_term == -1 $clean_request['tax_query'] = array(array('taxonomy' => $tax_filter, 'field' => 'id', 'terms' => array((int) $clean_request['mla_filter_term']), 'include_children' => 'checked' == MLAOptions::mla_get_option(MLAOptions::MLA_TAXONOMY_FILTER_INCLUDE_CHILDREN))); } // mla_filter_term != -1 } // mla_filter_term != 0 unset($clean_request['mla_filter_term']); } // isset mla_filter_term if (isset($clean_request['mla-tax']) && isset($clean_request['mla-term'])) { $clean_request['tax_query'] = array(array('taxonomy' => $clean_request['mla-tax'], 'field' => 'slug', 'terms' => $clean_request['mla-term'], 'include_children' => false)); unset($clean_request['mla-tax']); unset($clean_request['mla-term']); } // isset mla_tax if (isset($clean_request['mla-metakey']) && isset($clean_request['mla-metavalue'])) { $clean_request['meta_key'] = $clean_request['mla-metakey']; $clean_request['meta_value'] = $clean_request['mla-metavalue']; unset($clean_request['mla-metakey']); unset($clean_request['mla-metavalue']); } // isset mla_tax return $clean_request; }