Make WordPress Core

Ticket #40922: 40922.diff

File 40922.diff, 6.3 KB (added by dlh, 7 years ago)
  • src/wp-admin/customize.php

     
    135135                        <?php
    136136                        $save_text = $wp_customize->is_theme_active() ? __( 'Save &amp; Publish' ) : __( 'Save &amp; Activate' );
    137137                        $save_attrs = array();
    138                         if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->publish_posts ) ) {
    139                                 $save_attrs['style'] = 'display: none';
     138                        if ( $wp_customize->changeset_post_id() ) {
     139                                if ( ! current_user_can( 'publish_post', $wp_customize->changeset_post_id() ) ) {
     140                                        $save_attrs['style'] = 'display: none';
     141                                }
     142                        } else {
     143                                if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->publish_posts ) ) {
     144                                        $save_attrs['style'] = 'display: none';
     145                                }
    140146                        }
    141147                        submit_button( $save_text, 'primary save', 'save', false, $save_attrs );
    142148                        ?>
  • src/wp-includes/class-wp-customize-manager.php

     
    21352135                                wp_send_json_error( 'bad_customize_changeset_status', 400 );
    21362136                        }
    21372137                        $is_publish = ( 'publish' === $changeset_status || 'future' === $changeset_status );
    2138                         if ( $is_publish && ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->publish_posts ) ) {
     2138                        if ( $is_publish && ! current_user_can( 'publish_post', $changeset_post_id ) ) {
    21392139                                wp_send_json_error( 'changeset_publish_unauthorized', 403 );
    21402140                        }
    21412141                }
  • src/wp-includes/post.php

     
    175175                'can_export' => false,
    176176                'delete_with_user' => false,
    177177                'supports' => array( 'title', 'author' ),
    178                 'capability_type' => 'customize_changeset',
     178                'capability_type' => 'post',
    179179                'capabilities' => array(
    180180                        'create_posts' => 'customize',
    181                         'delete_others_posts' => 'customize',
    182                         'delete_post' => 'customize',
    183                         'delete_posts' => 'customize',
    184                         'delete_private_posts' => 'customize',
    185                         'delete_published_posts' => 'customize',
    186                         'edit_others_posts' => 'customize',
    187                         'edit_post' => 'customize',
    188                         'edit_posts' => 'customize',
    189                         'edit_private_posts' => 'customize',
     181                        'delete_others_posts' => 'edit_theme_options',
     182                        'delete_posts' => 'edit_theme_options',
     183                        'delete_private_posts' => 'edit_theme_options',
     184                        'delete_published_posts' => 'edit_theme_options',
     185                        'edit_others_posts' => 'edit_theme_options',
     186                        'edit_posts' => 'edit_theme_options',
     187                        'edit_private_posts' => 'edit_theme_options',
    190188                        'edit_published_posts' => 'do_not_allow',
    191                         'publish_posts' => 'customize',
    192                         'read' => 'read',
    193                         'read_post' => 'customize',
    194                         'read_private_posts' => 'customize',
     189                        'publish_posts' => 'edit_theme_options',
     190                        'read' => 'edit_theme_options',
     191                        'read_private_posts' => 'edit_theme_options',
    195192                ),
    196193        ) );
    197194
  • tests/phpunit/tests/ajax/CustomizeManager.php

     
    150150                $nonce = wp_create_nonce( 'save-customize_' . $wp_customize->get_stylesheet() );
    151151                $_POST['nonce'] = $_GET['nonce'] = $_REQUEST['nonce'] = $nonce;
    152152                $post_type_obj = get_post_type_object( 'customize_changeset' );
     153                $previous_create_posts_cap = $post_type_obj->cap->create_posts;
    153154                $post_type_obj->cap->create_posts = 'create_customize_changesets';
    154155                $this->make_ajax_call( 'customize_save' );
    155156                $this->assertFalse( $this->_last_response_parsed['success'] );
     
    157158                $this->overridden_caps[ $post_type_obj->cap->create_posts ] = true;
    158159                $this->make_ajax_call( 'customize_save' );
    159160                $this->assertTrue( $this->_last_response_parsed['success'] );
    160                 $post_type_obj->cap->create_posts = 'customize'; // Restore.
     161                $post_type_obj->cap->create_posts = $previous_create_posts_cap; // Restore.
    161162
    162163                // Changeset already published.
    163164                $wp_customize->set_post_value( 'blogname', 'Hello' );
     
    164165                $wp_customize->save_changeset_post( array( 'status' => 'publish' ) );
    165166                $this->make_ajax_call( 'customize_save' );
    166167                $this->assertFalse( $this->_last_response_parsed['success'] );
    167                 $this->assertEquals( 'changeset_already_published', $this->_last_response_parsed['data']['code'] );
     168                $this->assertEquals( 'cannot_edit_changeset_post', $this->_last_response_parsed['data'] );
    168169                wp_update_post( array( 'ID' => $wp_customize->changeset_post_id(), 'post_status' => 'auto-draft' ) );
    169170
    170171                // User cannot edit.
    171172                $post_type_obj = get_post_type_object( 'customize_changeset' );
     173                $previous_edit_post_cap = $post_type_obj->cap->edit_post;
    172174                $post_type_obj->cap->edit_post = 'edit_customize_changesets';
    173175                $this->make_ajax_call( 'customize_save' );
    174176                $this->assertFalse( $this->_last_response_parsed['success'] );
     
    176178                $this->overridden_caps[ $post_type_obj->cap->edit_post ] = true;
    177179                $this->make_ajax_call( 'customize_save' );
    178180                $this->assertTrue( $this->_last_response_parsed['success'] );
    179                 $post_type_obj->cap->edit_post = 'customize'; // Restore.
     181                $post_type_obj->cap->edit_post = $previous_edit_post_cap; // Restore.
    180182
    181183                // Bad customize_changeset_data.
    182184                $_POST['customize_changeset_data'] = '[MALFORMED]';
     
    193195
    194196                // Disallowed publish posts if not allowed.
    195197                $post_type_obj = get_post_type_object( 'customize_changeset' );
     198                $previous_publish_posts_cap = $post_type_obj->cap->publish_posts;
    196199                $post_type_obj->cap->publish_posts = 'publish_customize_changesets';
    197200                $_POST['customize_changeset_status'] = 'publish';
    198201                $this->make_ajax_call( 'customize_save' );
     
    202205                $this->make_ajax_call( 'customize_save' );
    203206                $this->assertFalse( $this->_last_response_parsed['success'] );
    204207                $this->assertEquals( 'changeset_publish_unauthorized', $this->_last_response_parsed['data'] );
    205                 $post_type_obj->cap->publish_posts = 'customize'; // Restore.
     208                $post_type_obj->cap->publish_posts = $previous_publish_posts_cap; // Restore.
    206209
    207210                // Validate date.
    208211                $_POST['customize_changeset_status'] = 'draft';