- $where_clauses = $this->sql_clauses['where'];
- unset(
- $where_clauses['parent'],
- $where_clauses['parent__in'],
- $where_clauses['parent__not_in']
- );
+ /*
+ * The WHERE clause for the descendant query is the same as for the top-level
+ * query, minus the `parent`, `parent__in`, and `parent__not_in` sub-clauses.
+ */
+ $_where = $this->filtered_where_clause;
+ $exclude_keys = array( 'parent', 'parent__in', 'parent__not_in' );
+ foreach ( $exclude_keys as $exclude_key ) {
+ if ( isset( $this->sql_clauses['where'][ $exclude_key ] ) ) {
+ $clause = $this->sql_clauses['where'][ $exclude_key ];
+
+ // Strip the clause as well as any adjacent ANDs.
+ $pattern = '|(?:AND)?\s*' . $clause . '\s*(?:AND)?|';
+ $_where_parts = preg_split( $pattern, $_where );
+
+ // Remove empties.
+ $_where_parts = array_filter( array_map( 'trim', $_where_parts ) );
+
+ // Reassemble with an AND.
+ $_where = implode( ' AND ', $_where_parts );
+ }
+ }