WP_Tax_Query::sanitize_query( array $queries ): array

Ensures the ‘tax_query’ argument passed to the class constructor is well-formed.

Description

Ensures that each query-level clause has a ‘relation’ key, and that each first-order clause contains all the necessary keys from $defaults.

Parameters

$queriesarrayrequired
Array of queries clauses.

Return

array Sanitized array of query clauses.

Source

public function sanitize_query( $queries ) {
	$cleaned_query = array();

	$defaults = array(
		'taxonomy'         => '',
		'terms'            => array(),
		'field'            => 'term_id',
		'operator'         => 'IN',
		'include_children' => true,
	);

	foreach ( $queries as $key => $query ) {
		if ( 'relation' === $key ) {
			$cleaned_query['relation'] = $this->sanitize_relation( $query );

			// First-order clause.
		} elseif ( self::is_first_order_clause( $query ) ) {

			$cleaned_clause          = array_merge( $defaults, $query );
			$cleaned_clause['terms'] = (array) $cleaned_clause['terms'];
			$cleaned_query[]         = $cleaned_clause;

			/*
			 * Keep a copy of the clause in the flate
			 * $queried_terms array, for use in WP_Query.
			 */
			if ( ! empty( $cleaned_clause['taxonomy'] ) && 'NOT IN' !== $cleaned_clause['operator'] ) {
				$taxonomy = $cleaned_clause['taxonomy'];
				if ( ! isset( $this->queried_terms[ $taxonomy ] ) ) {
					$this->queried_terms[ $taxonomy ] = array();
				}

				/*
				 * Backward compatibility: Only store the first
				 * 'terms' and 'field' found for a given taxonomy.
				 */
				if ( ! empty( $cleaned_clause['terms'] ) && ! isset( $this->queried_terms[ $taxonomy ]['terms'] ) ) {
					$this->queried_terms[ $taxonomy ]['terms'] = $cleaned_clause['terms'];
				}

				if ( ! empty( $cleaned_clause['field'] ) && ! isset( $this->queried_terms[ $taxonomy ]['field'] ) ) {
					$this->queried_terms[ $taxonomy ]['field'] = $cleaned_clause['field'];
				}
			}

			// Otherwise, it's a nested query, so we recurse.
		} elseif ( is_array( $query ) ) {
			$cleaned_subquery = $this->sanitize_query( $query );

			if ( ! empty( $cleaned_subquery ) ) {
				// All queries with children must have a relation.
				if ( ! isset( $cleaned_subquery['relation'] ) ) {
					$cleaned_subquery['relation'] = 'AND';
				}

				$cleaned_query[] = $cleaned_subquery;
			}
		}
	}

	return $cleaned_query;
}

Changelog

VersionDescription
4.1.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.