Make WordPress Core

Ticket #12821: post.diff

File post.diff, 8.5 KB (added by dbernar1, 13 years ago)
  • post.php

     
    33143314 * Retrieve a list of pages.
    33153315 *
    33163316 * The defaults that can be overridden are the following: 'child_of',
    3317  * 'sort_order', 'sort_column', 'post_title', 'hierarchical', 'exclude',
     3317 * 'sort_order', 'sort_column', 'hierarchical', 'exclude',
    33183318 * 'include', 'meta_key', 'meta_value','authors', 'number', and 'offset'.
    33193319 *
    33203320 * @since 1.5.0
     
    33243324 * @return array List of pages matching defaults or $args
    33253325 */
    33263326function &get_pages($args = '') {
    3327         global $wpdb;
    33283327
    33293328        $defaults = array(
    33303329                'child_of' => 0, 'sort_order' => 'ASC',
     
    33373336        );
    33383337
    33393338        $r = wp_parse_args( $args, $defaults );
    3340         extract( $r, EXTR_SKIP );
    3341         $number = (int) $number;
    3342         $offset = (int) $offset;
     3339  extract( $r, EXTR_SKIP );
    33433340
     3341  //ignore child_of, parent, exclude, meta_key, and meta_value params if using include
     3342        if ( !empty($include) ) {
     3343                $child_of = 0;
     3344                $parent = -1;
     3345                $exclude = '';
     3346                $meta_key = '';
     3347                $meta_value = '';
     3348                $hierarchical = false;
     3349        }
     3350 
    33443351        // Make sure the post type is hierarchical
     3352  // TODO extract this to something like is_a_hierarchical_post_type( $post_type )
    33453353        $hierarchical_post_types = get_post_types( array( 'hierarchical' => true ) );
    33463354        if ( !in_array( $post_type, $hierarchical_post_types ) )
    33473355                return false;
    33483356
    3349         // Make sure we have a valid post status
    3350         if ( !is_array( $post_status ) )
    3351                 $post_status = explode( ',', $post_status );
    3352         if ( array_diff( $post_status, get_post_stati() ) )
    3353                 return false;
     3357        $sort_order = strtoupper( $sort_order );
     3358        if ( empty( $sort_order ) && ! in_array( $sort_order, array( 'ASC', 'DESC' ) ) )
     3359                $sort_order = 'ASC';
    33543360
     3361  // Check whether we have cached the results of the same query
    33553362        $cache = array();
    33563363        $key = md5( serialize( compact(array_keys($defaults)) ) );
    33573364        if ( $cache = wp_cache_get( 'get_pages', 'posts' ) ) {
    3358                 if ( is_array($cache) && isset( $cache[ $key ] ) ) {
    3359                         $pages = apply_filters('get_pages', $cache[ $key ], $r );
     3365                if ( is_array( $cache ) && isset( $cache[ $key ] ) ) {
     3366                        $pages = apply_filters( 'get_pages', $cache[ $key ], $r );
    33603367                        return $pages;
    33613368                }
    33623369        }
    33633370
    3364         if ( !is_array($cache) )
     3371        if ( ! is_array( $cache ) )
    33653372                $cache = array();
    33663373
    3367         $inclusions = '';
    3368         if ( !empty($include) ) {
    3369                 $child_of = 0; //ignore child_of, parent, exclude, meta_key, and meta_value params if using include
    3370                 $parent = -1;
    3371                 $exclude = '';
    3372                 $meta_key = '';
    3373                 $meta_value = '';
    3374                 $hierarchical = false;
    3375                 $incpages = wp_parse_id_list( $include );
    3376                 if ( ! empty( $incpages ) ) {
    3377                         foreach ( $incpages as $incpage ) {
    3378                                 if (empty($inclusions))
    3379                                         $inclusions = $wpdb->prepare(' AND ( ID = %d ', $incpage);
    3380                                 else
    3381                                         $inclusions .= $wpdb->prepare(' OR ID = %d ', $incpage);
    3382                         }
    3383                 }
    3384         }
    3385         if (!empty($inclusions))
    3386                 $inclusions .= ')';
     3374  // TODO Rename $post_authors to $requested_authors
     3375        if ( ! empty( $authors ) ) {
     3376                $post_authors = preg_split( '/[\s,]+/',$authors );
    33873377
    3388         $exclusions = '';
    3389         if ( !empty($exclude) ) {
    3390                 $expages = wp_parse_id_list( $exclude );
    3391                 if ( ! empty( $expages ) ) {
    3392                         foreach ( $expages as $expage ) {
    3393                                 if (empty($exclusions))
    3394                                         $exclusions = $wpdb->prepare(' AND ( ID <> %d ', $expage);
    3395                                 else
    3396                                         $exclusions .= $wpdb->prepare(' AND ID <> %d ', $expage);
    3397                         }
    3398                 }
    3399         }
    3400         if (!empty($exclusions))
    3401                 $exclusions .= ')';
    3402 
    3403         $author_query = '';
    3404         if (!empty($authors)) {
    3405                 $post_authors = preg_split('/[\s,]+/',$authors);
    3406 
    34073378                if ( ! empty( $post_authors ) ) {
    34083379                        foreach ( $post_authors as $post_author ) {
    34093380                                //Do we have an author id or an author login?
    3410                                 if ( 0 == intval($post_author) ) {
    3411                                         $post_author = get_user_by('login', $post_author);
    3412                                         if ( empty($post_author) )
     3381                                if ( 0 == intval( $post_author ) ) {
     3382                                        $post_author = get_user_by( 'login', $post_author );
     3383                                        if ( empty( $post_author ) || empty( $post_author->ID ) )
    34133384                                                continue;
    3414                                         if ( empty($post_author->ID) )
    3415                                                 continue;
    3416                                         $post_author = $post_author->ID;
    3417                                 }
    3418 
    3419                                 if ( '' == $author_query )
    3420                                         $author_query = $wpdb->prepare(' post_author = %d ', $post_author);
    3421                                 else
    3422                                         $author_query .= $wpdb->prepare(' OR post_author = %d ', $post_author);
    3423                         }
    3424                         if ( '' != $author_query )
    3425                                 $author_query = " AND ($author_query)";
     3385                                        $author_ids[] = $post_author->ID;
     3386                                } else {
     3387          $author_ids[] = $post_author;
     3388        }
     3389      }
    34263390                }
     3391    $r['author'] = join( ',', $author_ids );
    34273392        }
    34283393
    3429         $join = '';
    3430         $where = "$exclusions $inclusions ";
    3431         if ( ! empty( $meta_key ) || ! empty( $meta_value ) ) {
    3432                 $join = " LEFT JOIN $wpdb->postmeta ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id )";
     3394  // get_pages() API supports both post_author and author for sorting, and WP_Query only supports the version without the post_ prefix
     3395  // get_pages accepts comma-separated list of sort_columns, and WP_Query accepts a space-separated one
     3396        // TODO get_pages had this additional sorting field. Figure out what to do about this one: $allowed_keys = array( 'modified_gmt', 'post_modified_gmt' );
     3397  $sort_column = str_replace( array( 'post_', ',' ), array( '', ' ' ), $sort_column );
    34333398
    3434                 // meta_key and meta_value might be slashed
    3435                 $meta_key = stripslashes($meta_key);
    3436                 $meta_value = stripslashes($meta_value);
    3437                 if ( ! empty( $meta_key ) )
    3438                         $where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_key = %s", $meta_key);
    3439                 if ( ! empty( $meta_value ) )
    3440                         $where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_value = %s", $meta_value);
     3399        if ( ! empty( $r['number'] ) && empty( $r['posts_per_page'] ) )
     3400                $r['posts_per_page'] = $r['number'];
     3401        if ( ! empty( $include ) ) {
     3402                $incposts = wp_parse_id_list( $include );
     3403                $r['posts_per_page'] = count($incposts);  // only the number of posts included
     3404                $r['post__in'] = $incposts;
     3405        } elseif ( ! empty( $exclude ) )
     3406                $r['post__not_in'] = wp_parse_id_list( $exclude );
    34413407
    3442         }
     3408  if ( ! empty( $sort_order ) )
     3409    $r['order'] = $sort_order;
    34433410
    3444         if ( $parent >= 0 )
    3445                 $where .= $wpdb->prepare(' AND post_parent = %d ', $parent);
     3411  if ( ! empty( $sort_column ) )
     3412    $r['orderby'] = $sort_column;
     3413  if ( $parent >= 0 )
     3414    $r['post_parent'] = $parent;
    34463415
    3447         if ( 1 == count( $post_status ) ) {
    3448                 $where_post_type = $wpdb->prepare( "post_type = %s AND post_status = %s", $post_type, array_shift( $post_status ) );
    3449         } else {
    3450                 $post_status = implode( "', '", $post_status );
    3451                 $where_post_type = $wpdb->prepare( "post_type = %s AND post_status IN ('$post_status')", $post_type );
    3452         }
     3416        $r['ignore_sticky_posts'] = true;
     3417        $r['no_found_rows'] = true;
    34533418
    3454         $orderby_array = array();
    3455         $allowed_keys = array('author', 'post_author', 'date', 'post_date', 'title', 'post_title', 'name', 'post_name', 'modified',
    3456                                                   'post_modified', 'modified_gmt', 'post_modified_gmt', 'menu_order', 'parent', 'post_parent',
    3457                                                   'ID', 'rand', 'comment_count');
    3458         foreach ( explode( ',', $sort_column ) as $orderby ) {
    3459                 $orderby = trim( $orderby );
    3460                 if ( !in_array( $orderby, $allowed_keys ) )
    3461                         continue;
     3419  $get_pages = new WP_Query;
     3420        $pages = $get_pages->query( $r );
    34623421
    3463                 switch ( $orderby ) {
    3464                         case 'menu_order':
    3465                                 break;
    3466                         case 'ID':
    3467                                 $orderby = "$wpdb->posts.ID";
    3468                                 break;
    3469                         case 'rand':
    3470                                 $orderby = 'RAND()';
    3471                                 break;
    3472                         case 'comment_count':
    3473                                 $orderby = "$wpdb->posts.comment_count";
    3474                                 break;
    3475                         default:
    3476                                 if ( 0 === strpos( $orderby, 'post_' ) )
    3477                                         $orderby = "$wpdb->posts." . $orderby;
    3478                                 else
    3479                                         $orderby = "$wpdb->posts.post_" . $orderby;
    3480                 }
    3481 
    3482                 $orderby_array[] = $orderby;
    3483 
    3484         }
    3485         $sort_column = ! empty( $orderby_array ) ? implode( ',', $orderby_array ) : "$wpdb->posts.post_title";
    3486 
    3487         $sort_order = strtoupper( $sort_order );
    3488         if ( '' !== $sort_order && !in_array( $sort_order, array( 'ASC', 'DESC' ) ) )
    3489                 $sort_order = 'ASC';
    3490 
    3491         $query = "SELECT * FROM $wpdb->posts $join WHERE ($where_post_type) $where ";
    3492         $query .= $author_query;
    3493         $query .= " ORDER BY " . $sort_column . " " . $sort_order ;
    3494 
    3495         if ( !empty($number) )
    3496                 $query .= ' LIMIT ' . $offset . ',' . $number;
    3497 
    3498         $pages = $wpdb->get_results($query);
    3499 
    35003422        if ( empty($pages) ) {
    35013423                $pages = apply_filters('get_pages', array(), $r);
    35023424                return $pages;
    35033425        }
    35043426
    3505         // Sanitize before caching so it'll only get done once
    3506         $num_pages = count($pages);
    3507         for ($i = 0; $i < $num_pages; $i++) {
    3508                 $pages[$i] = sanitize_post($pages[$i], 'raw');
    3509         }
    3510 
    35113427        // Update cache.
    35123428        update_page_cache($pages);
    35133429
     
    35283444                }
    35293445        }
    35303446
     3447  // TODO rename $key to unique_id_for_a_given_set_of_params
    35313448        $cache[ $key ] = $pages;
    35323449        wp_cache_set( 'get_pages', $cache, 'posts' );
    35333450