wppaste
WordPress

WP_Tax_Query::get_sql_for_clause( array $clause, array $parent_query ): array

Since
4.1.0
Source
wp-includes/class-wp-tax-query.php:384
Generates SQL JOIN and WHERE clauses for a "first-order" query clause.

Parameters

$clausearray
Query clause (passed by reference).
$parent_queryarray
Parent query array.

Return

array
Array containing JOIN and WHERE SQL clauses to append to a first-order query.
  • $joinstring[]

    Array of SQL fragments to append to the main JOIN clause.
  • $wherestring[]

    Array of SQL fragments to append to the main WHERE clause.

Uses · 3

Used by · 1

Source

	public function get_sql_for_clause( &$clause, $parent_query ) {		global $wpdb; 		$sql = array(			'where' => array(),			'join'  => array(),		); 		$join  = '';		$where = ''; 		$this->clean_query( $clause ); 		if ( is_wp_error( $clause ) ) {			return self::$no_results;		} 		$terms    = $clause['terms'];		$operator = strtoupper( $clause['operator'] ); 		if ( 'IN' === $operator ) { 			if ( empty( $terms ) ) {				return self::$no_results;			} 			$terms = implode( ',', $terms ); 			/*			 * Before creating another table join, see if this clause has a			 * sibling with an existing join that can be shared.			 */			$alias = $this->find_compatible_table_alias( $clause, $parent_query );			if ( false === $alias ) {				$i     = count( $this->table_aliases );				$alias = $i ? 'tt' . $i : $wpdb->term_relationships; 				// Store the alias as part of a flat array to build future iterators.				$this->table_aliases[] = $alias; 				// Store the alias with this clause, so later siblings can use it.				$clause['alias'] = $alias; 				$join .= " LEFT JOIN $wpdb->term_relationships";				$join .= $i ? " AS $alias" : '';				$join .= " ON ($this->primary_table.$this->primary_id_column = $alias.object_id)";			} 			$where = "$alias.term_taxonomy_id $operator ($terms)"; 		} elseif ( 'NOT IN' === $operator ) { 			if ( empty( $terms ) ) {				return $sql;			} 			$terms = implode( ',', $terms ); 			$where = "$this->primary_table.$this->primary_id_column NOT IN (				SELECT object_id				FROM $wpdb->term_relationships				WHERE term_taxonomy_id IN ($terms)			)"; 		} elseif ( 'AND' === $operator ) { 			if ( empty( $terms ) ) {				return $sql;			} 			$num_terms = count( $terms ); 			$terms = implode( ',', $terms ); 			$where = "(				SELECT COUNT(1)				FROM $wpdb->term_relationships				WHERE term_taxonomy_id IN ($terms)				AND object_id = $this->primary_table.$this->primary_id_column			) = $num_terms";

History

Introduced in 4.1.0. Unchanged from 6.7.7 through 7.1.0.

  1. 6.7.7
  2. 6.8.8
  3. 6.9.7
  4. 7.0.4
  5. 7.1.0

Signature, return type and hooks compared across 5 parsed releases.

About this page

Parsed data
Generated from the wordpress-develop 6.8.8 tag, from src/wp-includes/class-wp-tax-query.php, and regenerated for each WordPress release so it tracks the code rather than a snapshot of it.
Corrections
Something wrong on this page? Report it and it gets fixed in the next regeneration.