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

---

# WP_Tax_Query::get_sql_for_query( array $query, int $depth ): string[]

## In this article

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

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

Generates SQL clauses for a single query array.

## 󠀁[Description](https://developer.wordpress.org/reference/classes/wp_tax_query/get_sql_for_query/?output_format=md#description)󠁿

If nested subqueries are found, this method recurses the tree to produce the properly
nested SQL.

## 󠀁[Parameters](https://developer.wordpress.org/reference/classes/wp_tax_query/get_sql_for_query/?output_format=md#parameters)󠁿

 `$query`arrayrequired

Query to parse (passed by reference).

`$depth`intoptional

Number of tree levels deep we currently are.
 Used to calculate indentation. Default
0.

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

 string[] Array containing JOIN and WHERE SQL clauses to append to a single query
array.

 * `join` string
 * SQL fragment to append to the main JOIN clause.
 * `where` string
 * SQL fragment to append to the main WHERE clause.

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

    ```php
    protected function get_sql_for_query( &$query, $depth = 0 ) {
    	$sql_chunks = array(
    		'join'  => array(),
    		'where' => array(),
    	);

    	$sql = array(
    		'join'  => '',
    		'where' => '',
    	);

    	$indent = '';
    	for ( $i = 0; $i < $depth; $i++ ) {
    		$indent .= '  ';
    	}

    	foreach ( $query as $key => &$clause ) {
    		if ( 'relation' === $key ) {
    			$relation = $query['relation'];
    		} elseif ( is_array( $clause ) ) {

    			// This is a first-order clause.
    			if ( $this->is_first_order_clause( $clause ) ) {
    				$clause_sql = $this->get_sql_for_clause( $clause, $query );

    				$where_count = count( $clause_sql['where'] );
    				if ( ! $where_count ) {
    					$sql_chunks['where'][] = '';
    				} elseif ( 1 === $where_count ) {
    					$sql_chunks['where'][] = $clause_sql['where'][0];
    				} else {
    					$sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )';
    				}

    				$sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] );
    				// This is a subquery, so we recurse.
    			} else {
    				$clause_sql = $this->get_sql_for_query( $clause, $depth + 1 );

    				$sql_chunks['where'][] = $clause_sql['where'];
    				$sql_chunks['join'][]  = $clause_sql['join'];
    			}
    		}
    	}

    	// Filter to remove empties.
    	$sql_chunks['join']  = array_filter( $sql_chunks['join'] );
    	$sql_chunks['where'] = array_filter( $sql_chunks['where'] );

    	if ( empty( $relation ) ) {
    		$relation = 'AND';
    	}

    	// Filter duplicate JOIN clauses and combine into a single string.
    	if ( ! empty( $sql_chunks['join'] ) ) {
    		$sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) );
    	}

    	// Generate a single WHERE clause with proper brackets and indentation.
    	if ( ! empty( $sql_chunks['where'] ) ) {
    		$sql['where'] = '( ' . "\n  " . $indent . implode( ' ' . "\n  " . $indent . $relation . ' ' . "\n  " . $indent, $sql_chunks['where'] ) . "\n" . $indent . ')';
    	}

    	return $sql;
    }
    ```

[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#L302)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-includes/class-wp-tax-query.php#L302-L366)

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

| Uses | Description | 
| [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::get_sql_for_clause()](https://developer.wordpress.org/reference/classes/wp_tax_query/get_sql_for_clause/)`wp-includes/class-wp-tax-query.php` |

Generates SQL JOIN and WHERE clauses for a “first-order” query clause.

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

Generates SQL clauses for a single query array.

  |

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

Generates SQL clauses to be appended to a main query.

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

Generates SQL clauses for a single query array.

  |

## 󠀁[Changelog](https://developer.wordpress.org/reference/classes/wp_tax_query/get_sql_for_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%2Fget_sql_for_query%2F)
before being able to contribute a note or feedback.