Make WordPress Core

Ticket #2709: category-query.diff

File category-query.diff, 3.5 KB (added by skeltoac, 20 years ago)
  • wp-includes/query.php

     
    499499                $q = &$this->query_vars;
    500500
    501501                // First let's clear some variables
     502                $distinct = '';
    502503                $whichcat = '';
    503504                $whichauthor = '';
    504505                $whichpage = '';
     
    692693                } else {
    693694                        $q['cat'] = ''.urldecode($q['cat']).'';
    694695                        $q['cat'] = addslashes_gpc($q['cat']);
    695                         if (stristr($q['cat'],'-')) {
    696                                 // Note: if we have a negative, we ignore all the positives. It must
    697                                 // always mean 'everything /except/ this one'. We should be able to do
    698                                 // multiple negatives but we don't :-(
    699                                 $eq = '!=';
    700                                 $andor = 'AND';
    701                                 $q['cat'] = explode('-',$q['cat']);
    702                                 $q['cat'] = intval($q['cat'][1]);
    703                         } else {
    704                                 $eq = '=';
    705                                 $andor = 'OR';
    706                         }
    707696                        $join = " LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) ";
    708697                        $cat_array = preg_split('/[,\s]+/', $q['cat']);
    709                         $whichcat .= ' AND (category_id '.$eq.' '.intval($cat_array[0]);
    710                         $whichcat .= get_category_children($cat_array[0], ' '.$andor.' category_id '.$eq.' ');
    711                         for ($i = 1; $i < (count($cat_array)); $i = $i + 1) {
    712                                 $whichcat .= ' '.$andor.' category_id '.$eq.' '.intval($cat_array[$i]);
    713                                 $whichcat .= get_category_children($cat_array[$i], ' '.$andor.' category_id '.$eq.' ');
     698                        $in_cats = $out_cats = '';
     699                        foreach ( $cat_array as $cat ) {
     700                                $in = strstr($cat, '-') ? false : true;
     701                                $cat = trim($cat, '-');
     702                                if ( $in )
     703                                        $in_cats .= "$cat, " . get_category_children($cat, '', ', ');
     704                                else
     705                                        $out_cats .= "$cat, " . get_category_children($cat, '', ', ');                         
    714706                        }
    715                         $whichcat .= ')';
    716                         if ($eq == '!=') {
    717                                 $q['cat'] = '-'.$q['cat']; // Put back the knowledge that we are excluding a category.
    718                         }
     707                        $in_cats = substr($in_cats, 0, -2);
     708                        $out_cats = substr($out_cats, 0, -2);
     709                        if ( strlen($in_cats) > 0 )
     710                                $in_cats = " AND category_id IN ($in_cats)";
     711                        if ( strlen($out_cats) > 0 )
     712                                $out_cats = " AND category_id NOT IN ($out_cats)";
     713                        $whichcat = $in_cats . $out_cats;
     714                        $distinct = 'DISTINCT';
    719715                }
    720716
    721717                // Category stuff for nice URIs
     
    746742                               
    747743                        $tables = ", $wpdb->post2cat, $wpdb->categories";
    748744                        $join = " LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) LEFT JOIN $wpdb->categories ON ($wpdb->post2cat.category_id = $wpdb->categories.cat_ID) ";
    749                         $whichcat = " AND (category_id = '" . $q['cat'] . "'";
    750                         $whichcat .= get_category_children($q['cat'], " OR category_id = ");
     745                        $whichcat = " AND category_id IN ({$q['cat']}, ";
     746                        $whichcat .= get_category_children($q['cat'], '', ', ');
     747                        $whichcat = substr($whichcat, 0, -2);
    751748                        $whichcat .= ")";
     749                        $distinct = 'DISTINCT';
    752750                }
    753751
    754752                // Author/user stuff
     
    877875                if ( ! empty($groupby) )
    878876                        $groupby = 'GROUP BY ' . $groupby;
    879877                $join = apply_filters('posts_join_paged', $join);
    880                 $orderby = apply_filters('posts_orderby', $q['orderby']);
    881                 $request = " SELECT * FROM $wpdb->posts $join WHERE 1=1 $where $groupby ORDER BY $orderby $limits";
     878                $orderby = apply_filters('posts_orderby', $q['orderby']);
     879                $distinct = apply_filters('posts_distinct', $distinct);
     880                $fields = apply_filters('posts_fields', "$wpdb->posts.*");
     881                $request = " SELECT $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby ORDER BY $orderby $limits";
    882882                $this->request = apply_filters('posts_request', $request);
    883883
    884884                $this->posts = $wpdb->get_results($this->request);