WordPress.org

Make WordPress Core

Ticket #12891: get-tax-sql-or.diff

File get-tax-sql-or.diff, 2.2 KB (added by Otto42, 3 years ago)

Improved example of using relationship parameter in array

  • query.php

     
    19481948                        $clauses = call_user_func_array( 'get_tax_sql', array( $this->tax_query, $wpdb->posts, 'ID', &$this) ); 
    19491949 
    19501950                        $join .= $clauses['join']; 
    1951                         $where .= $clauses['where']; 
     1951                        $where .= ' AND ' . $clauses['where']; 
    19521952 
    19531953                        if ( empty($post_type) ) { 
    19541954                                $post_type = 'any'; 
  • taxonomy.php

     
    520520 * @param string $primary_id_column 
    521521 * @return string 
    522522 */ 
    523 function get_tax_sql( $tax_query, $primary_table, $primary_id_column ) { 
     523function get_tax_sql( $tax_query, $primary_table, $primary_id_column, $ignore='', $relationship = 'AND', $i = 0 ) { 
    524524        global $wpdb; 
    525525 
    526526        $join = ''; 
    527527        $where = ''; 
    528         $i = 0; 
    529528        foreach ( $tax_query as $query ) { 
     529                 
     530                if ( is_array( $query ) && array_key_exists ( 'relationship', $query ) ) { 
     531                        $rel = $query['relationship']; 
     532                        unset($query['relationship']); 
     533                        $ret = get_tax_sql($query, $primary_table, $primary_id_column, $ignore, $rel, $i); 
     534 
     535                        $join .= $ret['join']; 
     536                        $where .= '( ' . $ret['where'] . ' )'; 
     537                        $i = $ret['i']; 
     538                        continue; 
     539                } 
     540                 
    530541                extract( wp_parse_args( $query, array( 
    531542                        'taxonomy' => array(), 
    532543                        'terms' => array(), 
     
    539550 
    540551                foreach ( $taxonomies as $taxonomy ) { 
    541552                        if ( ! taxonomy_exists( $taxonomy ) ) 
    542                                 return ' AND 0 = 1'; 
     553                                return '0 = 1'; 
    543554                } 
    544555 
    545556                $taxonomies = "'" . implode( "', '", $taxonomies ) . "'"; 
     
    579590                        $join .= " INNER JOIN $wpdb->term_relationships"; 
    580591                        $join .= $i ? " AS $alias" : ''; 
    581592                        $join .= " ON ($primary_table.$primary_id_column = $alias.object_id)"; 
     593                         
     594                        if ($i) $where .= " $relationship"; 
     595                        $where .= " $alias.term_taxonomy_id $operator ($terms)"; 
    582596 
    583                         $where .= " AND $alias.term_taxonomy_id $operator ($terms)"; 
    584  
    585597                        $i++; 
    586598                } 
    587599                elseif ( 'NOT IN' == $operator ) { 
     
    592604                        )"; 
    593605                } 
    594606        } 
    595         return compact( 'join', 'where' ); 
     607        return compact( 'join', 'where', 'i' ); 
    596608} 
    597609 
    598610function _transform_terms( &$terms, $taxonomies, $field, $resulting_field ) {