WordPress.org

Make WordPress Core

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

File get-tax-sql-or.diff, 2.2 KB (added by Otto42, 8 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 ) {