/**
  * 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'), 'MLAQuery::_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)), self::mla_get_sortable_columns());
     $current_orderby = MLACore::mla_get_option(MLACore::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 = MLACore::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 {
         MLACore::mla_delete_option(MLACore::MLA_DEFAULT_ORDERBY);
         $current_orderby = MLACore::mla_get_option(MLACore::MLA_DEFAULT_ORDERBY);
     }
     $clean_request = array('m' => 0, 'orderby' => $current_orderby, 'order' => MLACore::mla_get_option(MLACore::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 = MLACore::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 = MLAQuery::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_alt_text_view' => false, 'use_postmeta_view' => false, 'use_orderby_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'];
         MLACore::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_alt_text_view'] = true;
         }
         if (in_array('terms', self::$search_parameters['mla_search_fields'])) {
             self::$search_parameters['mla_search_taxonomies'] = MLACore::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 = MLAQuery::mla_custom_field_option_value($clean_request['orderby']);
         if (isset($option_value['name'])) {
             self::$query_parameters['use_orderby_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; it can have NULL values,
              * so we'll handle it in the JOIN and ORDERBY filters
              */
             case '_wp_attachment_image_alt':
                 self::$query_parameters['use_orderby_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 = MLACore::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' == MLACore::mla_get_option(MLACore::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;
 }
 /**
  * Parses shortcode parameters and returns the gallery objects
  *
  * @since 2.20
  *
  * @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
      */
     MLAQuery::$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;
         }
     }
     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)) {
                     MLAQuery::$search_parameters[$key] = true;
                 } else {
                     MLAQuery::$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)) {
                     MLAQuery::$search_parameters[$key] = 'OR';
                 } else {
                     MLAQuery::$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)) {
                     MLAQuery::$search_parameters[$key] = $value;
                     if (!$children_ok) {
                         $use_children = false;
                     }
                 }
                 unset($arguments[$key]);
                 break;
             case 's':
                 MLAQuery::$search_parameters['s'] = trim($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', 'MLAShortcode_Support::mla_shortcode_query_posts_clauses_filter', 0x7fffffff, 1);
         add_filter('posts_clauses_request', 'MLAShortcode_Support::mla_shortcode_query_posts_clauses_request_filter', 0x7fffffff, 1);
     }
     add_filter('posts_join', 'MLAShortcode_Support::mla_shortcode_query_posts_join_filter', 0x7fffffff, 1);
     add_filter('posts_where', 'MLAShortcode_Support::mla_shortcode_query_posts_where_filter', 0x7fffffff, 1);
     add_filter('posts_orderby', 'MLAShortcode_Support::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(MLAQuery::$search_parameters['mla_terms_phrases']) && empty(MLAQuery::$search_parameters['s'])) {
         MLAQuery::$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(MLAQuery::$search_parameters['mla_terms_taxonomies'])) {
             MLAQuery::$search_parameters['mla_terms_search']['taxonomies'] = MLACore::mla_supported_taxonomies('term-search');
         } else {
             MLAQuery::$search_parameters['mla_terms_search']['taxonomies'] = array_filter(array_map('trim', explode(',', MLAQuery::$search_parameters['mla_terms_taxonomies'])));
         }
         if (!empty(MLAQuery::$search_parameters['mla_terms_phrases'])) {
             MLAQuery::$search_parameters['mla_terms_search']['phrases'] = MLAQuery::$search_parameters['mla_terms_phrases'];
             if (empty(MLAQuery::$search_parameters['mla_phrase_connector'])) {
                 MLAQuery::$search_parameters['mla_terms_search']['radio_phrases'] = 'AND';
             } else {
                 MLAQuery::$search_parameters['mla_terms_search']['radio_phrases'] = MLAQuery::$search_parameters['mla_phrase_connector'];
             }
             if (empty(MLAQuery::$search_parameters['mla_term_connector'])) {
                 MLAQuery::$search_parameters['mla_terms_search']['radio_terms'] = 'OR';
             } else {
                 MLAQuery::$search_parameters['mla_terms_search']['radio_terms'] = MLAQuery::$search_parameters['mla_phrase_connector'];
             }
         }
         unset(MLAQuery::$search_parameters['mla_terms_phrases']);
         unset(MLAQuery::$search_parameters['mla_terms_taxonomies']);
         unset(MLAQuery::$search_parameters['mla_phrase_connector']);
         unset(MLAQuery::$search_parameters['mla_term_connector']);
         if (empty(MLAQuery::$search_parameters['mla_search_fields'])) {
             MLAQuery::$search_parameters['mla_search_fields'] = array('title', 'content');
         } else {
             MLAQuery::$search_parameters['mla_search_fields'] = array_filter(array_map('trim', explode(',', MLAQuery::$search_parameters['mla_search_fields'])));
             MLAQuery::$search_parameters['mla_search_fields'] = array_intersect(array('title', 'content', 'excerpt', 'name', 'terms'), MLAQuery::$search_parameters['mla_search_fields']);
             /*
              * Look for keyword search including 'terms' 
              */
             foreach (MLAQuery::$search_parameters['mla_search_fields'] as $index => $field) {
                 if ('terms' == $field) {
                     if (isset(MLAQuery::$search_parameters['mla_terms_search']['phrases'])) {
                         /*
                          * The Terms Search overrides any terms-based keyword search for now; too complicated.
                          */
                         unset(MLAQuery::$search_parameters['mla_search_fields'][$index]);
                     } else {
                         MLAQuery::$search_parameters['mla_search_taxonomies'] = MLAQuery::$search_parameters['mla_terms_search']['taxonomies'];
                         unset(MLAQuery::$search_parameters['mla_terms_search']['taxonomies']);
                     }
                 }
                 // terms in search fields
             }
         }
         // mla_search_fields present
         if (empty(MLAQuery::$search_parameters['mla_search_connector'])) {
             MLAQuery::$search_parameters['mla_search_connector'] = 'AND';
         }
         if (empty(MLAQuery::$search_parameters['sentence'])) {
             MLAQuery::$search_parameters['sentence'] = false;
         }
         if (empty(MLAQuery::$search_parameters['exact'])) {
             MLAQuery::$search_parameters['exact'] = false;
         }
         MLAQuery::$search_parameters['debug'] = self::$mla_debug ? 'shortcode' : 'none';
         add_filter('posts_search', 'MLAQuery::mla_query_posts_search_filter', 10, 2);
         add_filter('posts_groupby', 'MLAQuery::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 />';
             }
             MLACore::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 />';
             }
             MLACore::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');
     }
     if (class_exists('MLA_Polylang')) {
         $query_arguments = apply_filters('mla_get_shortcode_attachments_final_terms', $query_arguments, $return_found_rows);
     }
     MLAShortcodes::$mla_gallery_wp_query_object = new WP_Query();
     $attachments = MLAShortcodes::$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'] = MLAShortcodes::$mla_gallery_wp_query_object->found_posts;
     }
     if (!empty(MLAQuery::$search_parameters)) {
         remove_filter('posts_groupby', 'MLAQuery::mla_query_posts_groupby_filter');
         remove_filter('posts_search', 'MLAQuery::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', 'MLAShortcode_Support::mla_shortcode_query_posts_join_filter', 0x7fffffff);
     remove_filter('posts_where', 'MLAShortcode_Support::mla_shortcode_query_posts_where_filter', 0x7fffffff);
     remove_filter('posts_orderby', 'MLAShortcode_Support::mla_shortcode_query_posts_orderby_filter', 0x7fffffff);
     if (self::$mla_debug) {
         remove_filter('posts_clauses', 'MLAShortcode_Support::mla_shortcode_query_posts_clauses_filter', 0x7fffffff);
         remove_filter('posts_clauses_request', 'MLAShortcode_Support::mla_shortcode_query_posts_clauses_request_filter', 0x7fffffff);
         MLACore::mla_debug_add('<strong>' . __('mla_debug query', 'media-library-assistant') . '</strong> = ' . var_export($query_arguments, true));
         MLACore::mla_debug_add('<strong>' . __('mla_debug request', 'media-library-assistant') . '</strong> = ' . var_export(MLAShortcodes::$mla_gallery_wp_query_object->request, true));
         MLACore::mla_debug_add('<strong>' . __('mla_debug query_vars', 'media-library-assistant') . '</strong> = ' . var_export(MLAShortcodes::$mla_gallery_wp_query_object->query_vars, true));
         MLACore::mla_debug_add('<strong>' . __('mla_debug post_count', 'media-library-assistant') . '</strong> = ' . var_export(MLAShortcodes::$mla_gallery_wp_query_object->post_count, true));
     }
     MLAShortcodes::$mla_gallery_wp_query_object = NULL;
     return $attachments;
 }