Title: WP_Tax_Query::sanitize_query
Published: December 18, 2014
Last modified: April 28, 2025

---

# WP_Tax_Query::sanitize_query( array $queries ): array

## In this article

 * [Description](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/?output_format=md#description)
 * [Parameters](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/?output_format=md#parameters)
 * [Return](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/?output_format=md#return)
 * [Source](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/?output_format=md#source)
 * [Related](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/?output_format=md#wp--skip-link--target)

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

## 󠀁[Description](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/?output_format=md#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](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/?output_format=md#parameters)󠁿

 `$queries`arrayrequired

Array of queries clauses.

## 󠀁[Return](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/?output_format=md#return)󠁿

 array Sanitized array of query clauses.

## 󠀁[Source](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/?output_format=md#source)󠁿

    ```php
    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;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-includes/class-wp-tax-query.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-includes/class-wp-tax-query.php#L136)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-includes/class-wp-tax-query.php#L136-L197)

## 󠀁[Related](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/?output_format=md#related)󠁿

| Uses | Description | 
| [WP_Tax_Query::sanitize_relation()](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_relation/)`wp-includes/class-wp-tax-query.php` |

Sanitizes a ‘relation’ operator.

  | 
| [WP_Tax_Query::is_first_order_clause()](https://developer.wordpress.org/reference/classes/wp_tax_query/is_first_order_clause/)`wp-includes/class-wp-tax-query.php` |

Determines whether a clause is first-order.

  | 
| [WP_Tax_Query::sanitize_query()](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/)`wp-includes/class-wp-tax-query.php` |

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

  |

| Used by | Description | 
| [WP_Tax_Query::sanitize_query()](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/)`wp-includes/class-wp-tax-query.php` |

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

  | 
| [WP_Tax_Query::__construct()](https://developer.wordpress.org/reference/classes/wp_tax_query/__construct/)`wp-includes/class-wp-tax-query.php` |

Constructor.

  |

## 󠀁[Changelog](https://developer.wordpress.org/reference/classes/wp_tax_query/sanitize_query/?output_format=md#changelog)󠁿

| Version | Description | 
| [4.1.0](https://developer.wordpress.org/reference/since/4.1.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Fclasses%2Fwp_tax_query%2Fsanitize_query%2F)
before being able to contribute a note or feedback.