WordPress.org

Make WordPress Core

Ticket #20152: user-roles-option-plus-regeneration.diff

File user-roles-option-plus-regeneration.diff, 15.4 KB (added by wonderboymusic, 6 years ago)
  • wp-includes/user.php

     
    865865                foreach ( $avail_roles as $this_role => $name ) {
    866866                        $select_count[] = "COUNT(NULLIF(`meta_value` LIKE '%\"" . like_escape( $this_role ) . "\"%', false))";
    867867                }
    868                 $select_count = implode(', ', $select_count);
    869 
     868               
     869                if ( ! empty( $select_count ) )
     870                        $select_count = implode(', ', $select_count) . ',';
     871                else
     872                        $select_count = '';
     873               
    870874                // Add the meta_value index to the selection list, then run the query.
    871                 $row = $wpdb->get_row( "SELECT $select_count, COUNT(*) FROM $wpdb->usermeta WHERE meta_key = '{$blog_prefix}capabilities'", ARRAY_N );
     875                $row = $wpdb->get_row( "SELECT $select_count COUNT(*) FROM $wpdb->usermeta WHERE meta_key = '{$blog_prefix}capabilities'", ARRAY_N );
    872876
    873877                // Run the previous loop again to associate results with role names.
    874878                $col = 0;
  • wp-includes/capabilities.php

     
    6161         * @access public
    6262         * @var string
    6363         */
    64         var $role_key;
     64        var $role_key = 'user_roles';
    6565
    6666        /**
    6767         * Whether to use the database for retrieval and storage.
     
    8484        /**
    8585         * Set up the object properties.
    8686         *
    87          * The role key is set to the current prefix for the $wpdb object with
    88          * 'user_roles' appended. If the $wp_user_roles global is set, then it will
     87         * If the $wp_user_roles global is set, then it will
    8988         * be used and the role option will not be updated or used.
    9089         *
    9190         * @since 2.1.0
     
    9493         * @global array $wp_user_roles Used to set the 'roles' property value.
    9594         */
    9695        function _init () {
    97                 global $wpdb, $wp_user_roles;
    98                 $this->role_key = $wpdb->prefix . 'user_roles';
     96                global $wp_user_roles;
     97
    9998                if ( ! empty( $wp_user_roles ) ) {
    10099                        $this->roles = $wp_user_roles;
    101100                        $this->use_db = false;
    102101                } else {
    103102                        $this->roles = get_option( $this->role_key );
     103                        if ( empty( $this->roles ) )
     104                                $this->roles = _WP_User_Roles::init();
    104105                }
    105106
    106107                if ( empty( $this->roles ) )
     
    128129                if ( ! $this->use_db )
    129130                        return;
    130131
    131                 global $wpdb, $wp_user_roles;
    132 
    133132                // Duplicated from _init() to avoid an extra function call.
    134                 $this->role_key = $wpdb->prefix . 'user_roles';
    135133                $this->roles = get_option( $this->role_key );
    136134                if ( empty( $this->roles ) )
     135                        $this->roles = _WP_User_Roles::init();
     136               
     137                if ( empty( $this->roles ) )
    137138                        return;
    138139
    139140                $this->role_objects = array();
     
    14441445
    14451446        return false;
    14461447}
     1448
     1449/**
     1450 * WordPress Default User Roles.
     1451 *
     1452 * Allows regeneration of the required 'user_roles' option
     1453 *
     1454 * @acccess private
     1455 *
     1456 * @since 3.5.0
     1457 * @package WordPress
     1458 * @subpackage User
     1459 */
     1460class _WP_User_Roles {
     1461        static $instance;
     1462        private $roles = array();
     1463       
     1464        private function __construct() {
     1465                if ( empty( $this->roles ) )
     1466                        $this->populate();
     1467        }
     1468       
     1469        static function init() {
     1470                if ( ! isset( self::$instance ) )
     1471                        self::$instance = new _WP_User_Roles;
     1472               
     1473                return self::$instance->roles;
     1474        }
     1475       
     1476        private function populate() {
     1477                $roles = array();
     1478               
     1479                /**
     1480                 * @since 2.1.0
     1481                 */
     1482                $caps_210 = array(
     1483                        'edit_others_pages' => 1,
     1484                        'edit_published_pages' => 1,
     1485                        'publish_pages' => 1,
     1486                        'delete_pages' => 1,
     1487                        'delete_others_pages' => 1,
     1488                        'delete_published_pages' => 1,
     1489                        'delete_posts' => 1,
     1490                        'delete_others_posts' => 1,
     1491                        'delete_published_posts' => 1,
     1492                        'delete_private_posts' => 1,
     1493                        'edit_private_posts' => 1,
     1494                        'read_private_posts' => 1,
     1495                        'delete_private_pages' => 1,
     1496                        'edit_private_pages' => 1,
     1497                        'read_private_pages' => 1                       
     1498                );
     1499               
     1500                $admin_caps = array(
     1501                        /**
     1502                         * @since 1.6.0
     1503                         */
     1504                        'switch_themes' => 1,
     1505                        'edit_themes' => 1,
     1506                        'activate_plugins' => 1,
     1507                        'edit_plugins' => 1,
     1508                        'edit_users' => 1,
     1509                        'edit_files' => 1,
     1510                        'manage_options' => 1,
     1511                        'moderate_comments' => 1,
     1512                        'manage_categories' => 1,
     1513                        'manage_links' => 1,
     1514                        'upload_files' => 1,
     1515                        'import',
     1516                        'unfiltered_html' => 1,
     1517                        'edit_posts' => 1,
     1518                        'edit_others_posts' => 1,
     1519                        'edit_published_posts' => 1,
     1520                        'publish_posts' => 1,
     1521                        'edit_pages' => 1,
     1522                        'read' => 1,
     1523                        /**
     1524                         * @since 2.1.0
     1525                         */
     1526                        'delete_users' => 1,
     1527                        'create_users' => 1,                   
     1528                        /**
     1529                         * @since 2.3.0
     1530                         */
     1531                        'unfiltered_upload' => 1,
     1532                        /**
     1533                         * @since 2.5.0
     1534                         */
     1535                        'edit_dashboard' => 1,
     1536                        /**
     1537                         * @since 2.6.0
     1538                         */
     1539                        'update_plugins' => 1,
     1540                        'delete_plugins' => 1,
     1541                        /**
     1542                         * @since 2.7.0
     1543                         */
     1544                        'install_plugins' => 1,
     1545                        'update_themes' => 1,
     1546                        /**
     1547                         * @since 2.8.0
     1548                         */
     1549                        'install_themes' => 1,
     1550                        /**
     1551                         * @since 3.0.0
     1552                         */
     1553                        'update_core' => 1,
     1554                        'list_users' => 1,
     1555                        'remove_users' => 1,
     1556                        'add_users' => 1,
     1557                        'promote_users' => 1,
     1558                        'edit_theme_options' => 1,
     1559                        'delete_themes' => 1,
     1560                        'export' => 1,
     1561                );
     1562               
     1563                /**
     1564                 * @since 1.6.0
     1565                 */
     1566                for ( $i = 0; $i <= 10; $i++ )
     1567                        $admin_caps['level_' . $i] = 1;
     1568               
     1569                /**
     1570                 * @since 2.1.0
     1571                 */
     1572                $admin_caps = array_merge( $admin_caps, $caps_210 );
     1573               
     1574                $roles[] = array(
     1575                        'administrator',
     1576                        /* translators: user role */
     1577                        _x( 'Administrator', 'User role' ),
     1578                        $admin_caps
     1579                );
     1580               
     1581                $editor_caps = array(
     1582                        /**
     1583                         * @since 1.6.0
     1584                         */
     1585                        'moderate_comments' => 1,
     1586                        'manage_categories' => 1,
     1587                        'manage_links' => 1,
     1588                        'upload_files' => 1,
     1589                        'import' => 1,
     1590                        'unfiltered_html' => 1,
     1591                        'edit_posts' => 1,
     1592                        'edit_others_posts' => 1,
     1593                        'edit_published_posts' => 1,
     1594                        'publish_posts' => 1,
     1595                        'edit_pages' => 1,
     1596                        'read' => 1,
     1597                );
     1598                /**
     1599                 * @since 1.6.0
     1600                 */
     1601                for ( $i = 0; $i <= 7; $i++ )
     1602                        $editor_caps['level_' . $i] = 1;               
     1603               
     1604                /**
     1605                 * @since 2.1.0
     1606                 */
     1607                $editor_caps = array_merge( $editor_caps, $caps_210 );
     1608               
     1609                $roles[] = array(
     1610                        'editor',
     1611                        /* translators: user role */
     1612                        _x( 'Editor', 'User role' ),
     1613                        $editor_caps
     1614                );
     1615
     1616                $author_caps = array(
     1617                        /**
     1618                         * @since 1.6.0
     1619                         */
     1620                        'upload_files' => 1,
     1621                        'edit_posts' => 1,
     1622                        'edit_published_posts' => 1,
     1623                        'publish_posts' => 1,
     1624                        'read' => 1,
     1625                        /**
     1626                         * @since 2.1.0
     1627                         */
     1628                        'delete_posts' => 1,
     1629                        'delete_published_posts' => 1
     1630                );
     1631                /**
     1632                 * @since 1.6.0
     1633                 */
     1634                for ( $i = 0; $i <= 2; $i++ )
     1635                        $author_caps['level_' . $i] = 1;               
     1636               
     1637                $roles[] = array(
     1638                        'author',
     1639                        /* translators: user role */
     1640                        _x( 'Author', 'User role' ),
     1641                        $author_caps
     1642                );             
     1643               
     1644                $contributor_caps = array(
     1645                        /**
     1646                         * @since 1.6.0
     1647                         */
     1648                        'edit_posts' => 1,
     1649                        'read' => 1,
     1650                        'level_0' => 1,
     1651                        'level_1' => 1,
     1652                        /**
     1653                         * @since 2.1.0
     1654                         */
     1655                        'delete_posts' => 1,
     1656                );
     1657               
     1658                $roles[] = array(
     1659                        'contributor',
     1660                        /* translators: user role */
     1661                        _x( 'Contributor', 'User role' ),
     1662                        $contributor_caps
     1663                );
     1664               
     1665                $subscriber_caps = array(
     1666                        /**
     1667                         * @since 1.6.0
     1668                         */
     1669                        'read' => 1,
     1670                        'level_0' => 1
     1671                );
     1672               
     1673                $roles[] = array(
     1674                        'subscriber',
     1675                        /* translators: user role */
     1676                        _x( 'Subscriber', 'User role' ),
     1677                        $subscriber_caps
     1678                );             
     1679               
     1680                foreach ( $roles as $role ) {
     1681                        list( $slug, $name, $caps ) = $role;
     1682                       
     1683                        $this->roles[$slug] = array(
     1684                                'name'                  => $name,
     1685                                'capabilities'  => $caps
     1686                        );                     
     1687                }
     1688               
     1689                update_option( 'user_roles', $this->roles );
     1690        }
     1691}
     1692 No newline at end of file
  • wp-admin/includes/schema.php

     
    556556 * @since 2.0.0
    557557 */
    558558function populate_roles() {
    559         populate_roles_160();
    560         populate_roles_210();
    561         populate_roles_230();
    562         populate_roles_250();
    563         populate_roles_260();
    564         populate_roles_270();
    565         populate_roles_280();
    566         populate_roles_300();
     559        /**
     560         * @since 3.5.0
     561         *
     562         */
     563        _WP_User_Roles::init();
     564       
     565        if ( is_multisite() ) {
     566                global $wpdb;
     567                $blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
     568                foreach ( $blog_ids as $blog_id ) {
     569                        if ( 1 === (int) $blog_id )
     570                                delete_option( 'wp_user_roles' );
     571                        else
     572                                delete_option( "wp_{$blog_id}_user_roles" );
     573                }
     574        }               
    567575}
    568576
    569577/**
    570  * Create the roles for WordPress 2.0
    571  *
    572  * @since 2.0.0
    573  */
    574 function populate_roles_160() {
    575         // Add roles
    576 
    577         // Dummy gettext calls to get strings in the catalog.
    578         /* translators: user role */
    579         _x('Administrator', 'User role');
    580         /* translators: user role */
    581         _x('Editor', 'User role');
    582         /* translators: user role */
    583         _x('Author', 'User role');
    584         /* translators: user role */
    585         _x('Contributor', 'User role');
    586         /* translators: user role */
    587         _x('Subscriber', 'User role');
    588 
    589         add_role('administrator', 'Administrator');
    590         add_role('editor', 'Editor');
    591         add_role('author', 'Author');
    592         add_role('contributor', 'Contributor');
    593         add_role('subscriber', 'Subscriber');
    594 
    595         // Add caps for Administrator role
    596         $role =& get_role('administrator');
    597         $role->add_cap('switch_themes');
    598         $role->add_cap('edit_themes');
    599         $role->add_cap('activate_plugins');
    600         $role->add_cap('edit_plugins');
    601         $role->add_cap('edit_users');
    602         $role->add_cap('edit_files');
    603         $role->add_cap('manage_options');
    604         $role->add_cap('moderate_comments');
    605         $role->add_cap('manage_categories');
    606         $role->add_cap('manage_links');
    607         $role->add_cap('upload_files');
    608         $role->add_cap('import');
    609         $role->add_cap('unfiltered_html');
    610         $role->add_cap('edit_posts');
    611         $role->add_cap('edit_others_posts');
    612         $role->add_cap('edit_published_posts');
    613         $role->add_cap('publish_posts');
    614         $role->add_cap('edit_pages');
    615         $role->add_cap('read');
    616         $role->add_cap('level_10');
    617         $role->add_cap('level_9');
    618         $role->add_cap('level_8');
    619         $role->add_cap('level_7');
    620         $role->add_cap('level_6');
    621         $role->add_cap('level_5');
    622         $role->add_cap('level_4');
    623         $role->add_cap('level_3');
    624         $role->add_cap('level_2');
    625         $role->add_cap('level_1');
    626         $role->add_cap('level_0');
    627 
    628         // Add caps for Editor role
    629         $role =& get_role('editor');
    630         $role->add_cap('moderate_comments');
    631         $role->add_cap('manage_categories');
    632         $role->add_cap('manage_links');
    633         $role->add_cap('upload_files');
    634         $role->add_cap('unfiltered_html');
    635         $role->add_cap('edit_posts');
    636         $role->add_cap('edit_others_posts');
    637         $role->add_cap('edit_published_posts');
    638         $role->add_cap('publish_posts');
    639         $role->add_cap('edit_pages');
    640         $role->add_cap('read');
    641         $role->add_cap('level_7');
    642         $role->add_cap('level_6');
    643         $role->add_cap('level_5');
    644         $role->add_cap('level_4');
    645         $role->add_cap('level_3');
    646         $role->add_cap('level_2');
    647         $role->add_cap('level_1');
    648         $role->add_cap('level_0');
    649 
    650         // Add caps for Author role
    651         $role =& get_role('author');
    652         $role->add_cap('upload_files');
    653         $role->add_cap('edit_posts');
    654         $role->add_cap('edit_published_posts');
    655         $role->add_cap('publish_posts');
    656         $role->add_cap('read');
    657         $role->add_cap('level_2');
    658         $role->add_cap('level_1');
    659         $role->add_cap('level_0');
    660 
    661         // Add caps for Contributor role
    662         $role =& get_role('contributor');
    663         $role->add_cap('edit_posts');
    664         $role->add_cap('read');
    665         $role->add_cap('level_1');
    666         $role->add_cap('level_0');
    667 
    668         // Add caps for Subscriber role
    669         $role =& get_role('subscriber');
    670         $role->add_cap('read');
    671         $role->add_cap('level_0');
    672 }
    673 
    674 /**
    675  * Create and modify WordPress roles for WordPress 2.1.
    676  *
    677  * @since 2.1.0
    678  */
    679 function populate_roles_210() {
    680         $roles = array('administrator', 'editor');
    681         foreach ($roles as $role) {
    682                 $role =& get_role($role);
    683                 if ( empty($role) )
    684                         continue;
    685 
    686                 $role->add_cap('edit_others_pages');
    687                 $role->add_cap('edit_published_pages');
    688                 $role->add_cap('publish_pages');
    689                 $role->add_cap('delete_pages');
    690                 $role->add_cap('delete_others_pages');
    691                 $role->add_cap('delete_published_pages');
    692                 $role->add_cap('delete_posts');
    693                 $role->add_cap('delete_others_posts');
    694                 $role->add_cap('delete_published_posts');
    695                 $role->add_cap('delete_private_posts');
    696                 $role->add_cap('edit_private_posts');
    697                 $role->add_cap('read_private_posts');
    698                 $role->add_cap('delete_private_pages');
    699                 $role->add_cap('edit_private_pages');
    700                 $role->add_cap('read_private_pages');
    701         }
    702 
    703         $role =& get_role('administrator');
    704         if ( ! empty($role) ) {
    705                 $role->add_cap('delete_users');
    706                 $role->add_cap('create_users');
    707         }
    708 
    709         $role =& get_role('author');
    710         if ( ! empty($role) ) {
    711                 $role->add_cap('delete_posts');
    712                 $role->add_cap('delete_published_posts');
    713         }
    714 
    715         $role =& get_role('contributor');
    716         if ( ! empty($role) ) {
    717                 $role->add_cap('delete_posts');
    718         }
    719 }
    720 
    721 /**
    722  * Create and modify WordPress roles for WordPress 2.3.
    723  *
    724  * @since 2.3.0
    725  */
    726 function populate_roles_230() {
    727         $role =& get_role( 'administrator' );
    728 
    729         if ( !empty( $role ) ) {
    730                 $role->add_cap( 'unfiltered_upload' );
    731         }
    732 }
    733 
    734 /**
    735  * Create and modify WordPress roles for WordPress 2.5.
    736  *
    737  * @since 2.5.0
    738  */
    739 function populate_roles_250() {
    740         $role =& get_role( 'administrator' );
    741 
    742         if ( !empty( $role ) ) {
    743                 $role->add_cap( 'edit_dashboard' );
    744         }
    745 }
    746 
    747 /**
    748  * Create and modify WordPress roles for WordPress 2.6.
    749  *
    750  * @since 2.6.0
    751  */
    752 function populate_roles_260() {
    753         $role =& get_role( 'administrator' );
    754 
    755         if ( !empty( $role ) ) {
    756                 $role->add_cap( 'update_plugins' );
    757                 $role->add_cap( 'delete_plugins' );
    758         }
    759 }
    760 
    761 /**
    762  * Create and modify WordPress roles for WordPress 2.7.
    763  *
    764  * @since 2.7.0
    765  */
    766 function populate_roles_270() {
    767         $role =& get_role( 'administrator' );
    768 
    769         if ( !empty( $role ) ) {
    770                 $role->add_cap( 'install_plugins' );
    771                 $role->add_cap( 'update_themes' );
    772         }
    773 }
    774 
    775 /**
    776  * Create and modify WordPress roles for WordPress 2.8.
    777  *
    778  * @since 2.8.0
    779  */
    780 function populate_roles_280() {
    781         $role =& get_role( 'administrator' );
    782 
    783         if ( !empty( $role ) ) {
    784                 $role->add_cap( 'install_themes' );
    785         }
    786 }
    787 
    788 /**
    789  * Create and modify WordPress roles for WordPress 3.0.
    790  *
    791  * @since 3.0.0
    792  */
    793 function populate_roles_300() {
    794         $role =& get_role( 'administrator' );
    795 
    796         if ( !empty( $role ) ) {
    797                 $role->add_cap( 'update_core' );
    798                 $role->add_cap( 'list_users' );
    799                 $role->add_cap( 'remove_users' );
    800                 $role->add_cap( 'add_users' );
    801                 $role->add_cap( 'promote_users' );
    802                 $role->add_cap( 'edit_theme_options' );
    803                 $role->add_cap( 'delete_themes' );
    804                 $role->add_cap( 'export' );
    805         }
    806 }
    807 
    808 /**
    809578 * Install Network.
    810579 *
    811580 * @since 3.0.0
  • wp-admin/includes/template.php

     
    759759
    760760        $editable_roles = get_editable_roles();
    761761
     762        if ( empty( $editable_roles ) )
     763                return;
     764               
    762765        foreach ( $editable_roles as $role => $details ) {
    763766                $name = translate_user_role($details['name'] );
    764767                if ( $selected == $role ) // preselect specified role
  • wp-admin/network/site-settings.php

     
    113113        <table class="form-table">
    114114                <?php
    115115                $blog_prefix = $wpdb->get_blog_prefix( $id );
    116                 $options = $wpdb->get_results( "SELECT * FROM {$blog_prefix}options WHERE option_name NOT LIKE '\_%' AND option_name NOT LIKE '%user_roles'" );
     116                $options = $wpdb->get_results( "SELECT * FROM {$blog_prefix}options WHERE option_name NOT LIKE '\_%' AND option_name != 'user_roles'" );
    117117                foreach ( $options as $option ) {
    118118                        if ( $option->option_name == 'default_role' )
    119119                                $editblog_default_role = $option->option_value;