WordPress.org

Make WordPress Core

Ticket #12966: 12966.3.diff

File 12966.3.diff, 7.8 KB (added by scribu, 5 years ago)

add $operator argument

  • wp-includes/taxonomy.php

     
    6767 * @uses $wp_taxonomies 
    6868 * @see register_taxonomy 
    6969 * 
    70  * @param array $args An array of key => value arguments to match against the taxonomies. 
    71  *  Only taxonomies having attributes that match all arguments are returned. 
     70 * @param array $args An array of key => value arguments to match against the taxonomy objects. 
    7271 * @param string $output The type of output to return, either taxonomy 'names' or 'objects'. 'names' is the default. 
     72 * @param string $operator The logical operation to perform. 'or' means only one element  
     73 *  from the array needs to match; 'and' means all elements must match. The default is 'and'. 
    7374 * @return array A list of taxonomy names or objects 
    7475 */ 
    75 function get_taxonomies( $args = array(), $output = 'names' ) { 
     76function get_taxonomies( $args = array(), $output = 'names', $operator = 'and' ) { 
    7677        global $wp_taxonomies; 
    7778 
    78         $taxonomies = array(); 
    79         foreach ( (array) $wp_taxonomies as $taxname => $taxobj ) 
    80                 if ( empty($args) || array_intersect_assoc((array) $taxobj, $args) ) 
    81                         $taxonomies[$taxname] = $taxobj; 
     79        $field = ('names' == $output) ? 'name' : false; 
    8280 
    83         if ( 'names' == $output ) 
    84                 return array_keys($taxonomies); 
    85  
    86         return $taxonomies; 
     81        return wp_filter_object_list($wp_taxonomies, $args, $operator, $field); 
    8782} 
    8883 
     84 
    8985/** 
    9086 * Return all of the taxonomy names that are of $object_type. 
    9187 * 
  • wp-includes/post.php

     
    622622 * @see register_post_status 
    623623 * @see get_post_status_object 
    624624 * 
    625  * @param array|string $args An array of key => value arguments to match against the post statuses. 
    626  *  Only post statuses having attributes that match all arguments are returned. 
     625 * @param array|string $args An array of key => value arguments to match against the post status objects. 
    627626 * @param string $output The type of output to return, either post status 'names' or 'objects'. 'names' is the default. 
    628  * @param string $operator Whether the elements in $args should be logicallly 'or'ed or 'and'ed together. 'or' means only one element from the array needs to match. 'and' means all elements must match. The default is 'or'. 
     627 * @param string $operator The logical operation to perform. 'or' means only one element  
     628 *  from the array needs to match; 'and' means all elements must match. The default is 'and'. 
    629629 * @return array A list of post type names or objects 
    630630 */ 
    631 function get_post_stati( $args = array(), $output = 'names', $operator = 'or' ) { 
     631function get_post_stati( $args = array(), $output = 'names', $operator = 'and' ) { 
    632632        global $wp_post_statuses; 
    633633 
    634         $do_names = false; 
    635         if ( 'names' == $output ) 
    636                 $do_names = true; 
     634        $field = ('names' == $output) ? 'name' : false; 
    637635 
    638         if ( 'and' == $operator ) 
    639                 $arg_count = count($args); 
    640         else 
    641                 $arg_count = 0; 
    642  
    643         $post_statuses = array(); 
    644         foreach ( (array) $wp_post_statuses as $post_status ) { 
    645                 if ( empty($args) ) { 
    646                         if ( $do_names ) 
    647                                 $post_statuses[] = $post_status->name; 
    648                         else 
    649                                 $post_statuses[] = $post_status; 
    650                 } elseif ( $intersect = array_intersect_assoc((array) $post_status, $args) ) { 
    651                         if ( $arg_count && ( $arg_count != count($intersect) ) ) 
    652                                 continue; 
    653                         if ( $do_names ) 
    654                                 $post_statuses[] = $post_status->name; 
    655                         else 
    656                                 $post_statuses[] = $post_status; 
    657                 } 
    658         } 
    659  
    660         return $post_statuses; 
     636        return wp_filter_object_list($wp_post_statuses, $args, $operator, $field); 
    661637} 
    662638 
    663639/** 
     
    692668 * @param mixed $the_post Optional. Post object or post ID. 
    693669 * @return bool|string post type or false on failure. 
    694670 */ 
    695 function get_post_type($the_post = false) { 
     671function get_post_type( $the_post = false ) { 
    696672        global $post; 
    697673 
    698674        if ( false === $the_post ) 
     
    736712 * @since 2.9.0 
    737713 * @uses $wp_post_types 
    738714 * @see register_post_type 
    739  * @see get_post_types 
    740715 * 
    741  * @param array|string $args An array of key => value arguments to match against the post types. 
    742  *  Only post types having attributes that match all arguments are returned. 
     716 * @param array|string $args An array of key => value arguments to match against the post type objects. 
    743717 * @param string $output The type of output to return, either post type 'names' or 'objects'. 'names' is the default. 
     718 * @param string $operator The logical operation to perform. 'or' means only one element  
     719 *  from the array needs to match; 'and' means all elements must match. The default is 'and'. 
    744720 * @return array A list of post type names or objects 
    745721 */ 
    746 function get_post_types( $args = array(), $output = 'names' ) { 
     722function get_post_types( $args = array(), $output = 'names', $operator = 'and' ) { 
    747723        global $wp_post_types; 
    748724 
    749         $do_names = false; 
    750         if ( 'names' == $output ) 
    751                 $do_names = true; 
     725        $field = ('names' == $output) ? 'name' : false; 
    752726 
    753         $post_types = array(); 
    754         foreach ( (array) $wp_post_types as $post_type ) { 
    755                 if ( empty($args) ) { 
    756                         if ( $do_names ) 
    757                                 $post_types[] = $post_type->name; 
    758                         else 
    759                                 $post_types[] = $post_type; 
    760                 } elseif ( array_intersect_assoc((array) $post_type, $args) ) { 
    761                         if ( $do_names ) 
    762                                 $post_types[] = $post_type->name; 
    763                         else 
    764                                 $post_types[] = $post_type; 
    765                 } 
    766         } 
    767  
    768         return $post_types; 
     727        return wp_filter_object_list($wp_post_types, $args, $operator, $field); 
    769728} 
    770729 
    771730/** 
  • wp-includes/functions.php

     
    29012901 * @param array|string $list 
    29022902 * @return array Sanitized array of IDs 
    29032903 */ 
    2904 function wp_parse_id_list($list) { 
     2904function wp_parse_id_list( $list ) { 
    29052905        if ( !is_array($list) ) 
    29062906                $list = preg_split('/[\s,]+/', $list); 
    29072907 
     
    29092909} 
    29102910 
    29112911/** 
     2912 * Filters a list of objects, based on a set of key => value arguments 
     2913 * 
     2914 * @since 3.0.0 
     2915 * 
     2916 * @param array $list An array of objects to filter 
     2917 * @param array $args An array of key => value arguments to match against each object 
     2918 * @param string $operator The logical operation to perform. 'or' means only one element  
     2919 *      from the array needs to match; 'and' means all elements must match. The default is 'and'. 
     2920 * @param bool|string $field A field from the object to place instead of the entire object 
     2921 * @return array A list of objects or object fields 
     2922 */ 
     2923function wp_filter_object_list( $list, $args = array(), $operator = 'and', $field = false ) { 
     2924        if ( !is_array($list) ) 
     2925                return array(); 
     2926 
     2927        if ( empty($args) ) 
     2928                $args = array(); 
     2929 
     2930        if ( empty($args) && !$field ) 
     2931                return $list;   // nothing to do 
     2932 
     2933        $count = count($args); 
     2934 
     2935        $filtered = array(); 
     2936 
     2937        foreach ( $list as $key => $obj ) { 
     2938                $matched = count(array_intersect_assoc(get_object_vars($obj), $args)); 
     2939                if ( ('and' == $operator && $matched == $count) || ('or' == $operator && $matched <= $count) ) 
     2940                        $filtered[$key] = $field ? $obj->$field : $obj; 
     2941        } 
     2942 
     2943        return $filtered; 
     2944} 
     2945 
     2946/** 
    29122947 * Determines if default embed handlers should be loaded. 
    29132948 * 
    29142949 * Checks to make sure that the embeds library hasn't already been loaded. If 
  • wp-includes/query.php

     
    22552255 
    22562256                        if ( is_admin() ) { 
    22572257                                // Add protected states that should show in the admin all list. 
    2258                                 $admin_all_states = get_post_stati( array('protected' => true, 'show_in_admin_all_list' => true), 'names', 'and' ); 
     2258                                $admin_all_states = get_post_stati( array('protected' => true, 'show_in_admin_all_list' => true) ); 
    22592259                                foreach ( (array) $admin_all_states as $state ) 
    22602260                                        $where .= " OR $wpdb->posts.post_status = '$state'"; 
    22612261                        }