Make WordPress Core

Ticket #2825: true-cat-exclusion.diff

File true-cat-exclusion.diff, 1.2 KB (added by skeltoac, 20 years ago)
  • wp-includes/query.php

     
    708708                        $q['cat'] = addslashes_gpc($q['cat']);
    709709                        $join = " LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) ";
    710710                        $cat_array = preg_split('/[,\s]+/', $q['cat']);
    711                         $in_cats = $out_cats = '';
     711                        $in_cats = $out_cats = $out_posts = '';
    712712                        foreach ( $cat_array as $cat ) {
    713713                                $cat = intval($cat);
    714714                                $in = strstr($cat, '-') ? false : true;
     
    722722                        $out_cats = substr($out_cats, 0, -2);
    723723                        if ( strlen($in_cats) > 0 )
    724724                                $in_cats = " AND category_id IN ($in_cats)";
    725                         if ( strlen($out_cats) > 0 )
    726                                 $out_cats = " AND category_id NOT IN ($out_cats)";
     725                        if ( strlen($out_cats) > 0 ) {
     726                                $ids = $wpdb->get_col("SELECT post_id FROM $wpdb->post2cat WHERE category_id IN ($out_cats)");
     727                                if ( is_array($ids) && count($ids > 0) ) {
     728                                        foreach ( $ids as $id )
     729                                                $out_posts .= "$id, ";
     730                                        $out_posts = substr($out_posts, 0, -2);
     731                                }
     732                                if ( strlen($out_posts) > 0 )
     733                                        $out_cats = " AND ID NOT IN ($out_posts)";
     734                        }
    727735                        $whichcat = $in_cats . $out_cats;
    728736                        $distinct = 'DISTINCT';
    729737                }