WordPress.org

Make WordPress Core

Ticket #35926: 35926.1.diff

File 35926.1.diff, 7.5 KB (added by westonruter, 5 years ago)
  • src/wp-admin/js/customize-controls.js

    diff --git src/wp-admin/js/customize-controls.js src/wp-admin/js/customize-controls.js
    index 270770d..7f68c13 100644
     
    15211521                        settings = $.map( control.params.settings, function( value ) {
    15221522                                return value;
    15231523                        });
    1524                         api.apply( api, settings.concat( function () {
    1525                                 var key;
    15261524
    1527                                 control.settings = {};
    1528                                 for ( key in control.params.settings ) {
    1529                                         control.settings[ key ] = api( control.params.settings[ key ] );
    1530                                 }
     1525                        if ( 0 === settings.length ) {
     1526                                control.embed();
     1527                        } else {
     1528                                api.apply( api, settings.concat( function() {
     1529                                        var key;
    15311530
    1532                                 control.setting = control.settings['default'] || null;
     1531                                        control.settings = {};
     1532                                        for ( key in control.params.settings ) {
     1533                                                control.settings[ key ] = api( control.params.settings[ key ] );
     1534                                        }
    15331535
    1534                                 control.embed();
    1535                         }) );
     1536                                        control.setting = control.settings['default'] || null;
     1537
     1538                                        control.embed();
     1539                                }) );
     1540                        }
    15361541
    15371542                        // After the control is embedded on the page, invoke the "ready" method.
    15381543                        control.deferred.embedded.done( function () {
  • src/wp-includes/class-wp-customize-control.php

    diff --git src/wp-includes/class-wp-customize-control.php src/wp-includes/class-wp-customize-control.php
    index a892b10..59b4a8c 100644
    class WP_Customize_Control { 
    6565        public $setting = 'default';
    6666
    6767        /**
     68         * Capability required to use this control.
     69         *
     70         * Normally this is empty and the capability is derived from the capabilities
     71         * of the associated `$settings`.
     72         *
     73         * @since 4.5.0
     74         * @access public
     75         * @var string
     76         */
     77        public $capability;
     78
     79        /**
    6880         * @access public
    6981         * @var int
    7082         */
    class WP_Customize_Control { 
    187199                $this->instance_number = self::$instance_count;
    188200
    189201                // Process settings.
    190                 if ( empty( $this->settings ) ) {
     202                if ( ! isset( $this->settings ) ) {
    191203                        $this->settings = $id;
    192204                }
    193205
    class WP_Customize_Control { 
    196208                        foreach ( $this->settings as $key => $setting ) {
    197209                                $settings[ $key ] = $this->manager->get_setting( $setting );
    198210                        }
    199                 } else {
     211                } else if ( is_string( $this->settings ) ) {
    200212                        $this->setting = $this->manager->get_setting( $this->settings );
    201213                        $settings['default'] = $this->setting;
    202214                }
    class WP_Customize_Control { 
    306318         * @return bool False if theme doesn't support the control or user doesn't have the required permissions, otherwise true.
    307319         */
    308320        final public function check_capabilities() {
     321                if ( ! empty( $this->capability ) && ! current_user_can( $this->capability ) ) {
     322                        return false;
     323                }
     324
    309325                foreach ( $this->settings as $setting ) {
    310                         if ( ! $setting->check_capabilities() )
     326                        if ( ! $setting->check_capabilities() ) {
    311327                                return false;
     328                        }
    312329                }
    313330
    314331                $section = $this->manager->get_section( $this->section );
    315                 if ( isset( $section ) && ! $section->check_capabilities() )
     332                if ( isset( $section ) && ! $section->check_capabilities() ) {
    316333                        return false;
     334                }
    317335
    318336                return true;
    319337        }
  • src/wp-includes/class-wp-customize-nav-menus.php

    diff --git src/wp-includes/class-wp-customize-nav-menus.php src/wp-includes/class-wp-customize-nav-menus.php
    index b4bd0fd..b0318d6 100644
    final class WP_Customize_Nav_Menus { 
    596596                        'priority' => 999,
    597597                ) ) );
    598598
    599                 $this->manager->add_setting( 'new_menu_name', array(
    600                         'type'      => 'new_menu',
    601                         'default'   => '',
    602                         'transport' => isset( $this->manager->selective_refresh ) ? 'postMessage' : 'refresh',
    603                 ) );
    604 
    605599                $this->manager->add_control( 'new_menu_name', array(
    606600                        'label'       => '',
    607601                        'section'     => 'add_menu',
    608602                        'type'        => 'text',
     603                        'settings'    => array(),
    609604                        'input_attrs' => array(
    610605                                'class'       => 'menu-name-field',
    611606                                'placeholder' => __( 'New menu name' ),
    612607                        ),
    613608                ) );
    614609
    615                 $this->manager->add_setting( 'create_new_menu', array(
    616                         'type' => 'new_menu',
    617                 ) );
    618 
    619610                $this->manager->add_control( new WP_Customize_New_Menu_Control( $this->manager, 'create_new_menu', array(
    620                         'section' => 'add_menu',
     611                        'section'  => 'add_menu',
     612                        'settings' => array(),
    621613                ) ) );
    622614        }
    623615
    final class WP_Customize_Nav_Menus { 
    841833                                        'type'                => 'nav_menu_instance',
    842834                                        'render_callback'     => array( $this, 'render_nav_menu_partial' ),
    843835                                        'container_inclusive' => true,
     836                                        'settings'            => array(), // Empty because the nav menu instance may relate to a menu or a location.
     837                                        'capability'          => 'edit_theme_options',
    844838                                )
    845839                        );
    846840                }
  • src/wp-includes/class-wp-customize-widgets.php

    diff --git src/wp-includes/class-wp-customize-widgets.php src/wp-includes/class-wp-customize-widgets.php
    index f65e7bf..69cfcc1 100644
    final class WP_Customize_Widgets { 
    14851485         */
    14861486        public function customize_dynamic_partial_args( $partial_args, $partial_id ) {
    14871487
    1488                 if ( preg_match( '/^widget\[.+\]$/', $partial_id ) ) {
     1488                if ( preg_match( '/^widget\[(?P<widget_id>.+)\]$/', $partial_id, $matches ) ) {
    14891489                        if ( false === $partial_args ) {
    14901490                                $partial_args = array();
    14911491                        }
    14921492                        $partial_args = array_merge(
    14931493                                $partial_args,
    14941494                                array(
    1495                                         'type' => 'widget',
    1496                                         'render_callback' => array( $this, 'render_widget_partial' ),
     1495                                        'type'                => 'widget',
     1496                                        'render_callback'     => array( $this, 'render_widget_partial' ),
    14971497                                        'container_inclusive' => true,
     1498                                        'settings'            => array( $this->get_setting_id( $matches['widget_id'] ) ),
     1499                                        'capability'          => 'edit_theme_options',
    14981500                                )
    14991501                        );
    15001502                }
  • src/wp-includes/customize/class-wp-customize-partial.php

    diff --git src/wp-includes/customize/class-wp-customize-partial.php src/wp-includes/customize/class-wp-customize-partial.php
    index 3cb410b..c27b3f0 100644
    class WP_Customize_Partial { 
    9090        public $primary_setting;
    9191
    9292        /**
     93         * Capability required to edit this partial.
     94         *
     95         * Normally this is empty and the capability is derived from the capabilities
     96         * of the associated `$settings`.
     97         *
     98         * @since 4.5.0
     99         * @access public
     100         * @var string
     101         */
     102        public $capability;
     103
     104        /**
    93105         * Render callback.
    94106         *
    95107         * @since 4.5.0
    class WP_Customize_Partial { 
    157169                }
    158170
    159171                // Process settings.
    160                 if ( empty( $this->settings ) ) {
     172                if ( ! isset( $this->settings ) ) {
    161173                        $this->settings = array( $id );
    162174                } else if ( is_string( $this->settings ) ) {
    163175                        $this->settings = array( $this->settings );
    class WP_Customize_Partial { 
    299311         *                    or if one of the associated settings does not exist.
    300312         */
    301313        final public function check_capabilities() {
     314                if ( ! empty( $this->capability ) && ! current_user_can( $this->capability ) ) {
     315                        return false;
     316                }
    302317                foreach ( $this->settings as $setting_id ) {
    303318                        $setting = $this->component->manager->get_setting( $setting_id );
    304319                        if ( ! $setting || ! $setting->check_capabilities() ) {
  • tests/qunit/fixtures/customize-menus.js

    diff --git tests/qunit/fixtures/customize-menus.js tests/qunit/fixtures/customize-menus.js
    index 5fdd892..f3ac0a1 100755
    window._wpCustomizeSettings.controls.new_menu_name = { 
    394394        'description': '',
    395395        'instanceNumber': 46
    396396};
    397 window._wpCustomizeSettings.settings.new_menu_name = {
    398         'value': '',
    399         'transport': 'postMessage',
    400         'dirty': false
    401 };
    402397
    403398// From nav-menu.js
    404399window.wpNavMenu = {