/** * Build a tax_query clause corresponding to a single input * * @param $taxonomy * @param $input_name * @param $input * @return array */ private function taxQueryClause($taxonomy, $input_name, $input) { if (empty($input)) { return; } $request_var = RequestVar::nameToVar($input_name, 'taxonomy'); $terms = $this->request->get($request_var); if (empty($terms)) { return; } $clause = array(); $clause['taxonomy'] = $taxonomy; $clause['operator'] = $input['operator']; $clause['field'] = empty($inputs['term_format']) ? self::$default_format : $inputs['term_format']; $clause['terms'] = $terms; return $clause; }
/** * Build a meta_query clause for meta values which are stored as an array * * Creates a separate sub-clause for each value being queried * * @param $meta_key * @param $input_name * @param $input * @return array */ private function metaQueryClauseArray($meta_key, $input_name, $input) { $request_var = RequestVar::nameToVar($input_name, 'meta_key'); $var = $this->request->get($request_var); if (empty($var)) { return array(); } $clause = array(); if (!is_array($var)) { $var = array($var); } foreach ($var as $value) { $clause[] = $this->subClause($meta_key, $input, $value); } if (count($clause) > 1) { $clause['relation'] = $input['relation']; } if (count($clause) == 1) { $clause = $clause[0]; } return $clause; }
/** * Given a Field object, initializes that field's input(s) to Input objects * and adds them to the inputs table * * @param Field $field * @param $request */ private function addInputs(Field $field, $request) { $field_type = $field->getFieldType(); $inputs = $field->getInputs(); foreach ($inputs as $name => $input_args) { try { if ($field_type == FieldType::date) { $date_type = !empty($input_args['date_type']) ? $input_args['date_type'] : false; $post_types = $this->selectedPostTypes($request); $name = RequestVar::nameToVar($name, $field_type, $date_type); $input = DateInputBuilder::make($name, $input_args, $post_types, $request); } else { if ($field_type == FieldType::generic) { $name = empty($input_args['id']) ? 'generic' : $input_args['id']; } else { $name = RequestVar::nameToVar($name, $field_type); } $input = InputBuilder::make($name, $field_type, $input_args, $request); } $this->inputs[] = $input; } catch (\InvalidArgumentException $e) { $this->addExceptionError($e); continue; } catch (\Exception $e) { $this->addExceptionError($e); continue; } } }
/** * Takes an array of query arguments and adds a sub-query * (eg tax_query, meta_query, or date_query) * * @param array $query * @param FieldGroup $field_group * @param $field_type * @param HttpRequest $request * @return array */ private function addSubQuery(array $query, FieldGroup $field_group, $field_type, HttpRequest $request) { $classnames = array('taxonomy' => 'TaxQuery', 'meta_key' => 'MetaQuery', 'date' => 'DateQuery'); $fields = $field_group->getFields(); if (empty($classnames[$field_type]) || empty($fields)) { return $query; } $s_query = $this->getSubQuery($classnames[$field_type], $fields, $field_group->getRelation(), $request); if (!empty($s_query)) { $query[RequestVar::wpQueryVar($field_type)] = $s_query; } return $query; }