Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 42 additions & 48 deletions src/wp-includes/class-wp-tax-query.php
Original file line number Diff line number Diff line change
Expand Up @@ -383,87 +383,80 @@
*/
public function get_sql_for_clause( &$clause, $parent_query ) {
global $wpdb;

Check failure on line 386 in src/wp-includes/class-wp-tax-query.php

View workflow job for this annotation

GitHub Actions / Coding standards / PHP checks

Whitespace found at end of line
$sql = array(
'where' => array(),
'join' => array(),
);

Check failure on line 391 in src/wp-includes/class-wp-tax-query.php

View workflow job for this annotation

GitHub Actions / Coding standards / PHP checks

Whitespace found at end of line
$join = '';
$where = '';

Check failure on line 394 in src/wp-includes/class-wp-tax-query.php

View workflow job for this annotation

GitHub Actions / Coding standards / PHP checks

Whitespace found at end of line
$this->clean_query( $clause );

Check failure on line 396 in src/wp-includes/class-wp-tax-query.php

View workflow job for this annotation

GitHub Actions / Coding standards / PHP checks

Whitespace found at end of line
if ( is_wp_error( $clause ) ) {
return self::$no_results;
}

Check failure on line 400 in src/wp-includes/class-wp-tax-query.php

View workflow job for this annotation

GitHub Actions / Coding standards / PHP checks

Whitespace found at end of line
$terms = $clause['terms'];
$operator = strtoupper( $clause['operator'] );


Check failure on line 403 in src/wp-includes/class-wp-tax-query.php

View workflow job for this annotation

GitHub Actions / Coding standards / PHP checks

Whitespace found at end of line
/**
* FIX: Handle WP 6.9 regression
* An empty "include" or "exclude" (or passing "all") must NOT filter terms.
*/
if ( isset( $clause['include'] ) && ( $clause['include'] === 'all' ) ) {

Check failure on line 408 in src/wp-includes/class-wp-tax-query.php

View workflow job for this annotation

GitHub Actions / Coding standards / PHP checks

Use Yoda Condition checks, you must.
return $sql; // no filtering
}
if ( isset( $clause['exclude'] ) && ( $clause['exclude'] === 'all' ) ) {

Check failure on line 411 in src/wp-includes/class-wp-tax-query.php

View workflow job for this annotation

GitHub Actions / Coding standards / PHP checks

Use Yoda Condition checks, you must.
return $sql; // no filtering
}
if ( empty( $terms ) ) {
return $sql; // empty = no filtering (correct behavior)
}

Check failure on line 417 in src/wp-includes/class-wp-tax-query.php

View workflow job for this annotation

GitHub Actions / Coding standards / PHP checks

Whitespace found at end of line
// Convert term array to CSV
$terms_csv = implode( ',', array_map( 'intval', (array) $terms ) );

Check failure on line 420 in src/wp-includes/class-wp-tax-query.php

View workflow job for this annotation

GitHub Actions / Coding standards / PHP checks

Whitespace found at end of line
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.
*/

// standard IN logic
$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;

$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)";

$where = "$alias.term_taxonomy_id IN ($terms_csv)";
} 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)
WHERE term_taxonomy_id IN ($terms_csv)
)";

} 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)
WHERE term_taxonomy_id IN ($terms_csv)
AND object_id = $this->primary_table.$this->primary_id_column
) = $num_terms";

} elseif ( 'NOT EXISTS' === $operator || 'EXISTS' === $operator ) {

$where = $wpdb->prepare(
"$operator (
SELECT 1
Expand All @@ -475,11 +468,12 @@
)",
$clause['taxonomy']
);

}

$sql['join'][] = $join;
$sql['where'][] = $where;

return $sql;
}

Expand Down
Loading