Ticket #9951: tax-experimental.diff

File tax-experimental.diff, 8.4 KB (added by joehoyle, 2 years ago)

Added experimental patch which replaces all the category*, tag* to use all registered taxonomies. (not working)

  • query.php

     
    17941794                        $q['cat'] = implode(',', $req_cats); 
    17951795                } 
    17961796 
    1797                 if ( !empty($q['category__in']) ) { 
    1798                         $join = " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) "; 
    1799                         $whichcat .= " AND $wpdb->term_taxonomy.taxonomy = 'category' "; 
    1800                         $include_cats = "'" . implode("', '", $q['category__in']) . "'"; 
    1801                         $whichcat .= " AND $wpdb->term_taxonomy.term_id IN ($include_cats) "; 
    1802                 } 
    1803  
    1804                 if ( !empty($q['category__not_in']) ) { 
    1805                         $cat_string = "'" . implode("', '", $q['category__not_in']) . "'"; 
    1806                         $whichcat .= " AND $wpdb->posts.ID NOT IN ( SELECT tr.object_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = 'category' AND tt.term_id IN ($cat_string) )"; 
    1807                 } 
    1808  
    18091797                // Category stuff for nice URLs 
    18101798                if ( '' != $q['category_name'] && !$this->is_singular ) { 
    18111799                        $q['category_name'] = implode('/', array_map('sanitize_title', explode('/', $q['category_name']))); 
     
    18601848                                $q['tag_slug__in'][] = $q['tag']; 
    18611849                        } 
    18621850                } 
     1851                 
     1852                // Set up the arrays for querying by taxonomy (tag and category included) 
     1853                $this->taxonomies__in = array(); 
     1854                $this->taxonomies__not_in = array(); 
     1855                $this->taxonomies__and = array(); 
     1856                $this->taxonomies_slug__in = array(); 
     1857                $this->taxonomies_slug__and = array(); 
     1858                         
     1859                // loop through registered taxonomies to check for respective query vars (must be done after 'tag' and 'cat') 
     1860                foreach ( $GLOBALS['wp_taxonomies'] as $taxonomy => $t ) { 
     1861                     
     1862                    // check if query vars have been passed for the taxonomy (annoying explicit check for tag as the taxonomy is called post_tag) 
     1863                    if( array_key_exists( $taxonomy . '__in', $q ) && !empty($qv[$taxonomy . '__in']) ) { 
     1864                        $is = 'is_' . $taxonomy; 
     1865                        $this->$is = true; 
     1866                        $this->taxonomies__in[$taxonomy . '__in'] = $taxonomy; 
     1867                         
     1868                        // cast the array to integers, again annoying check for tag passed instead of post_tag 
     1869                        $q[$taxonomy . '__in'] = array_map('absint', $q[$taxonomy . '__in']); 
     1870                    } 
     1871                    elseif( array_key_exists( $taxonomy . '__not_in', $q ) && !empty($q[$taxonomy . '__not_in']) ) { 
     1872                        $is = 'is_' . $taxonomy; 
     1873                        $this->taxonomies__not_in[$taxonomy . '__not_in'] = $taxonomy; 
     1874                        $q[$taxonomy . '__not_in'] = array_map('absint', $q[$taxonomy . '__not_in']); 
    18631875 
    1864                 if ( !empty($q['category__in']) || !empty($q['meta_key']) || !empty($q['tag__in']) || !empty($q['tag_slug__in']) ) { 
    1865                         $groupby = "{$wpdb->posts}.ID"; 
    1866                 } 
     1876                    } 
     1877                    elseif( array_key_exists( $taxonomy . '__and', $q ) && !empty($q[$taxonomy . '__and']) ) { 
     1878                        $is = 'is_' . $taxonomy; 
     1879                        $this->$is = true; 
     1880                        $this->taxonomies__and[$taxonomy . '__and'] = $taxonomy; 
     1881                        $q[$taxonomy . '__and'] = array_map('absint', $q[$taxonomy . '__and']); 
     1882                    } 
     1883                    elseif( array_key_exists( $taxonomy . '_slug__in', $q ) && !empty($q[$taxonomy . '_slug__in']) ) { 
     1884                        $is = 'is_' . $taxonomy; 
     1885                        $this->$is = true; 
     1886                        $this->taxonomies_slug__in[$taxonomy . '_slug__in'] = $taxonomy; 
     1887                        $q[$taxonomy . '_slug__in'] = array_map('sanitize_title', $q[$taxonomy . '_slug__in']); 
    18671888 
    1868                 if ( !empty($q['tag__in']) && empty($q['cat']) ) { 
    1869                         $join = " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) "; 
    1870                         $whichcat .= " AND $wpdb->term_taxonomy.taxonomy = 'post_tag' "; 
    1871                         $include_tags = "'" . implode("', '", $q['tag__in']) . "'"; 
    1872                         $whichcat .= " AND $wpdb->term_taxonomy.term_id IN ($include_tags) "; 
    1873                         $reqtag = is_term( $q['tag__in'][0], 'post_tag' ); 
    1874                         if ( !empty($reqtag) ) 
    1875                                 $q['tag_id'] = $reqtag['term_id']; 
     1889                    } 
     1890                    elseif( array_key_exists( $taxonomy . '_slug__and', $q ) && !empty($q[$taxonomy . '_slug__and']) ) { 
     1891                        $is = 'is_' . $taxonomy; 
     1892                        $this->$is = true; 
     1893                        $this->taxonomies_slug__and[$taxonomy . '_slug__and'] = $taxonomy; 
     1894                        $qv[$taxonomy . '_slug__and'] = array_map('sanitize_title', $q[$taxonomy . '_slug__and']); 
     1895                    } 
    18761896                } 
    18771897 
    1878                 if ( !empty($q['tag_slug__in']) && empty($q['cat']) ) { 
    1879                         $join = " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) INNER JOIN $wpdb->terms ON ($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id) "; 
    1880                         $whichcat .= " AND $wpdb->term_taxonomy.taxonomy = 'post_tag' "; 
    1881                         $include_tags = "'" . implode("', '", $q['tag_slug__in']) . "'"; 
    1882                         $whichcat .= " AND $wpdb->terms.slug IN ($include_tags) "; 
    1883                         $reqtag = get_term_by( 'slug', $q['tag_slug__in'][0], 'post_tag' ); 
    1884                         if ( !empty($reqtag) ) 
    1885                                 $q['tag_id'] = $reqtag->term_id; 
     1898                //Taxonomies not in 
     1899                foreach( (array) $this->taxonomies__not_in as $taxonomy ) { 
     1900                        $term_string = "'" . implode("', '", $q[$taxonomy . '__not_in']) . "'"; 
     1901                        $whichcat .= " AND $wpdb->posts.ID NOT IN ( SELECT tr.object_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = '$taxonomy' AND tt.term_id IN ($term_string) )"; 
    18861902                } 
    18871903 
    1888                 if ( !empty($q['tag__not_in']) ) { 
    1889                         $tag_string = "'" . implode("', '", $q['tag__not_in']) . "'"; 
    1890                         $whichcat .= " AND $wpdb->posts.ID NOT IN ( SELECT tr.object_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = 'post_tag' AND tt.term_id IN ($tag_string) )"; 
    1891                 } 
    1892  
    1893                 // Tag and slug intersections. 
    1894                 $intersections = array('category__and' => 'category', 'tag__and' => 'post_tag', 'tag_slug__and' => 'post_tag', 'tag__in' => 'post_tag', 'tag_slug__in' => 'post_tag'); 
    1895                 $tagin = array('tag__in', 'tag_slug__in'); // These are used to make some exceptions below 
     1904                // Term and slug intersections. 
     1905                $intersections = array(); 
     1906                $intersections = array_merge( $intersections, $this->taxonomies__in, $this->taxonomies__and, $this->taxonomies_slug__in, $this->taxonomies_slug__and ); 
     1907                $intersections = array_merge( $intersections, array('tag__and' => 'post_tag', 'tag_slug__and' => 'post_tag', 'tag__in' => 'post_tag', 'tag_slug__in' => 'post_tag') ); 
     1908                 
     1909                $tagin = array_merge( array_keys( $this->taxonomies__in ), array('tag__in', 'tag_slug__in') ); // These are used to make some exceptions below 
    18961910                foreach ($intersections as $item => $taxonomy) { 
     1911                         
    18971912                        if ( empty($q[$item]) ) continue; 
    1898                         if ( in_array($item, $tagin) && empty($q['cat']) ) continue; // We should already have what we need if categories aren't being used 
    1899  
     1913                         
    19001914                        if ( $item != 'category__and' ) { 
    19011915                                $reqtag = is_term( $q[$item][0], 'post_tag' ); 
    19021916                                if ( !empty($reqtag) ) 
    19031917                                        $q['tag_id'] = $reqtag['term_id']; 
    19041918                        } 
    19051919 
    1906                         if ( in_array( $item, array('tag_slug__and', 'tag_slug__in' ) ) ) 
     1920                        if ( in_array( $item, array_merge( array_keys( $this->taxonomies_slug__in ), array_keys( $this->taxonomies_slug__and ), array('tag_slug__and', 'tag_slug__in' ) ) ) ) 
    19071921                                $taxonomy_field = 'slug'; 
    19081922                        else 
    19091923                                $taxonomy_field = 'term_id'; 
    1910  
    19111924                        $q[$item] = array_unique($q[$item]); 
    19121925                        $tsql = "SELECT p.ID FROM $wpdb->posts p INNER JOIN $wpdb->term_relationships tr ON (p.ID = tr.object_id) INNER JOIN $wpdb->term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) INNER JOIN $wpdb->terms t ON (tt.term_id = t.term_id)"; 
    19131926                        $tsql .= " WHERE tt.taxonomy = '$taxonomy' AND t.$taxonomy_field IN ('" . implode("', '", $q[$item]) . "')"; 
     
    21542167                if ( ! empty($q['meta_key']) ) 
    21552168                        $where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_key = %s ", $q['meta_key']); 
    21562169                if ( ! empty($q['meta_value']) ) { 
    2157                         if ( ! isset($q['meta_compare']) || empty($q['meta_compare']) || ! in_array($q['meta_compare'], array('=', '!=', '>', '>=', '<', '<=')) ) 
     2170                        if ( ! isset($q['meta_compare']) || empty($q['meta_compare']) || ! in_array($q['meta_compare'], array('=', '!=', '>', '>=', '<', '<=', 'LIKE')) ) 
    21582171                                $q['meta_compare'] = '='; 
    21592172 
    21602173                        $where .= $wpdb->prepare("AND $wpdb->postmeta.meta_value {$q['meta_compare']} %s ", $q['meta_value']); 
     
    27252738        return true; 
    27262739} 
    27272740 
    2728 ?> 
     2741?> 
     2742 No newline at end of file