Automattic\WooCommerce\Internal\ProductAttributesLookup
TaxQuery::get_sql_for_clause
Generates SQL JOIN and WHERE clauses for a "first-order" query clause.
Method of the class: TaxQuery{}
No Hooks.
Returns
Array. Array containing JOIN and WHERE SQL clauses to append to a first-order query.
Usage
$TaxQuery = new TaxQuery(); $TaxQuery->get_sql_for_clause( $clause, $parent_query );
- $clause(array) (required) (passed by reference — &)
- Query clause (passed by reference).
- $parent_query(array) (required)
- Parent query array.
Changelog
| Since 10.9.0 | Introduced. |
TaxQuery::get_sql_for_clause() TaxQuery::get sql for clause code WC 10.9.1
public function get_sql_for_clause( &$clause, $parent_query ) {
global $wpdb;
// Optimization note: targeting only the 'IN' operator, where the default 'LEFT JOIN' causes performance issues.
if ( 'IN' !== $clause['operator'] ) {
return parent::get_sql_for_clause( $clause, $parent_query );
}
// Call the parent method so it does necessary cleanup with its private APIs.
$fallback = parent::get_sql_for_clause( $clause, $parent_query );
if ( array( '' ) === $fallback['join'] && array( '0 = 1' ) === $fallback['where'] ) {
return $fallback;
}
// Optimization note: 'fan-out LEFT JOIN' -> 'pre-materialized subquery' transition for better SQL performance.
$terms = implode( ',', array_map( 'absint', $clause['terms'] ) );
return array(
'join' => array( '' ),
'where' => array( "$this->primary_table.$this->primary_id_column IN ( SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id IN ( $terms ) )" ),
);
}