WordPress.org

Make WordPress Core

Ticket #15016: wp_list_filter.3.diff

File wp_list_filter.3.diff, 2.8 KB (added by scribu, 5 years ago)

Check $field before calling wp_list_pluck()

  • wp-includes/functions.php

     
    30193019 * @return array A list of objects or object fields 
    30203020 */ 
    30213021function wp_filter_object_list( $list, $args = array(), $operator = 'and', $field = false ) { 
    3022         if ( !is_array($list) ) 
    3023                 return array(); 
     3022        $list = wp_list_filter( $list, $args, $operator ); 
    30243023 
    3025         if ( empty($args) ) 
    3026                 $args = array(); 
     3024        if ( $field ) 
     3025                $list = wp_list_pluck( $list, $field ); 
    30273026 
    3028         if ( empty($args) && !$field ) 
    3029                 return $list;   // nothing to do 
     3027        return $list; 
     3028} 
    30303029 
    3031         $count = count($args); 
     3030/** 
     3031 * Filters a list of objects, based on a set of key => value arguments 
     3032 * 
     3033 * @since 3.1.0 
     3034 * 
     3035 * @param array $list An array of objects to filter 
     3036 * @param array $args An array of key => value arguments to match against each object 
     3037 * @param string $operator The logical operation to perform. 'or' means only one element 
     3038 *      from the array needs to match; 'and' means all elements must match. The default is 'and'. 
     3039 * @return array 
     3040 */ 
     3041function wp_list_filter( $list, $args = array(), $operator = 'and' ) { 
     3042        if ( empty( $args ) ) 
     3043                return $list; 
    30323044 
     3045        $count = count( $args ); 
     3046 
    30333047        $filtered = array(); 
    30343048 
    30353049        foreach ( $list as $key => $obj ) { 
    3036                 $matched = count( array_intersect_assoc( (array) ($obj), $args ) ); 
     3050                $matched = count( array_intersect_assoc( (array) $obj, $args ) ); 
    30373051                if ( ('and' == $operator && $matched == $count) || ('or' == $operator && $matched <= $count) ) { 
    3038                         if ( $field ) 
    3039                                 $filtered[] = $obj->$field; 
    3040                         else 
    3041                                 $filtered[$key] = $obj; 
     3052                        $filtered[$key] = $obj; 
    30423053                } 
    30433054        } 
    30443055 
     
    30463057} 
    30473058 
    30483059/** 
     3060 * Pluck a certain field out of each object in a list 
     3061 * 
     3062 * @since 3.1.0 
     3063 * 
     3064 * @param array $list A list of objects or arrays 
     3065 * @param int|string $field A field from the object to place instead of the entire object 
     3066 * @return array 
     3067 */ 
     3068function wp_list_pluck( $list, $field ) { 
     3069        foreach ( $list as $key => $value ) { 
     3070                $value = (array) $value; 
     3071                $list[ $key ] = $value[ $field ]; 
     3072        } 
     3073 
     3074        return $list; 
     3075} 
     3076 
     3077/** 
    30493078 * Determines if default embed handlers should be loaded. 
    30503079 * 
    30513080 * Checks to make sure that the embeds library hasn't already been loaded. If 
  • wp-includes/query.php

     
    19511951 
    19521952                        // Back-compat 
    19531953                        if ( !empty( $ids ) ) { 
    1954                                 $cat_query = wp_filter_object_list( $tax_query, array( 'taxonomy' => 'category' ) ); 
     1954                                $cat_query = wp_list_filter( $tax_query, array( 'taxonomy' => 'category' ) ); 
    19551955                                if ( !empty( $cat_query ) ) { 
    19561956                                        $cat_query = reset( $cat_query ); 
    19571957                                        $cat = get_term_by( $cat_query['field'], $cat_query['terms'][0], 'category' );