WordPress.org

Make WordPress Core

Ticket #16854: 16854.patch

File 16854.patch, 1.9 KB (added by boonebgorges, 7 years ago)
  • wp-includes/query.php

     
    22612261                if ( empty($q['author']) || ($q['author'] == '0') ) {
    22622262                        $whichauthor = '';
    22632263                } else {
    2264                         $q['author'] = (string)urldecode($q['author']);
    2265                         $q['author'] = addslashes_gpc($q['author']);
    2266                         if ( strpos($q['author'], '-') !== false ) {
    2267                                 $eq = '!=';
    2268                                 $andor = 'AND';
    2269                                 $q['author'] = explode('-', $q['author']);
    2270                                 $q['author'] = (string)absint($q['author'][1]);
     2264                        if ( is_array( $q['author'] ) ) {
     2265                                $author_array = $q['author'];
    22712266                        } else {
    2272                                 $eq = '=';
    2273                                 $andor = 'OR';
     2267                                // String values have to be sanitized and turn into an array
     2268                                $q['author'] = (string)urldecode($q['author']);
     2269                                $q['author'] = addslashes_gpc($q['author']);
     2270                                $author_array = preg_split('/[,\s]+/', $q['author']);
    22742271                        }
    2275                         $author_array = preg_split('/[,\s]+/', $q['author']);
     2272                       
    22762273                        $_author_array = array();
    2277                         foreach ( $author_array as $key => $_author )
    2278                                 $_author_array[] = "$wpdb->posts.post_author " . $eq . ' ' . absint($_author);
    2279                         $whichauthor .= ' AND (' . implode(" $andor ", $_author_array) . ')';
     2274                        $op = 'NOT IN';
     2275                        foreach ( $author_array as $key => $_author ) {
     2276                                if ( 'NOT IN' == $op ) {
     2277                                        if ( strpos($_author, '-') === false ) {
     2278                                                // A single non-negative author switches the query
     2279                                                // from NOT IN to IN
     2280                                                $_author_array = array( absint( $_author ) );
     2281                                                $op = 'IN';
     2282                                        } else {
     2283                                                // Add to the NOT IN array
     2284                                                $_author_array[] = absint( $_author );
     2285                                        }
     2286                                } else {
     2287                                        // Once the query becomes IN, we can skip NOT IN authors
     2288                                        if ( strpos($_author, '-') === false ) {
     2289                                                $_author_array[] = absint( $_author );
     2290                                        }       
     2291                                }
     2292                        }
     2293                       
     2294                        $whichauthor .= " AND $wpdb->posts.post_author $op (" . implode(',', $_author_array) . ")";
    22802295                        unset($author_array, $_author_array);
    22812296                }
    22822297