WordPress.org

Make WordPress Core

Ticket #18623: 18623.3.diff

File 18623.3.diff, 32.1 KB (added by obenland, 8 years ago)
  • wp-admin/css/wp-admin.css

     
    75197519        max-height: 300px;
    75207520}
    75217521
     7522.appearance_page_custom-background .available-backgrounds .default-background {
     7523        float: left;
     7524        margin: 0 20px 20px 0;
     7525}
     7526
     7527.appearance_page_custom-background .available-backgrounds label input {
     7528        margin-right: 10px;
     7529}
     7530
     7531.appearance_page_custom-background .available-backgrounds label img {
     7532        vertical-align: middle;
     7533}
     7534
     7535.appearance_page_custom-background .button + .description {
     7536        display: block;
     7537        margin-top: 10px;
     7538}
     7539
    75227540
    75237541/*------------------------------------------------------------------------------
    75247542  17.0 - Plugins
  • wp-admin/custom-background.php

     
    6969
    7070                $this->page = $page = add_theme_page(__('Background'), __('Background'), 'edit_theme_options', 'custom-background', array($this, 'admin_page'));
    7171
    72                 add_action("load-$page", array($this, 'admin_load'));
    73                 add_action("load-$page", array($this, 'take_action'), 49);
    74                 add_action("load-$page", array($this, 'handle_upload'), 49);
     72                add_action( "load-$page", array( $this, 'admin_load'    )     );
     73                add_action( "load-$page", array( $this, 'take_action'   ), 49 );
     74                add_action( "load-$page", array( $this, 'handle_upload' ), 49 );
     75                add_action( "load-$page", array( $this, 'settings'      ), 50 );
    7576
    7677                if ( $this->admin_header_callback )
    7778                        add_action("admin_head-$page", $this->admin_header_callback, 51);
     
    105106        }
    106107
    107108        /**
     109         * Adds settings sections and fields.
     110         *
     111         * @since 3.9.0
     112         */
     113        function settings() {
     114                add_settings_section( 'background-image', __( 'Background Image' ), '__return_false', 'background-image' );
     115                add_settings_section( 'display-options',  __( 'Display Options' ),  '__return_false', 'display-options'  );
     116
     117                if ( $this->admin_image_div_callback ) {
     118                        call_user_func( $this->admin_image_div_callback );
     119                } else {
     120                        add_settings_field( 'preview', __( 'Preview' ), array( $this, 'preview_field' ), 'background-image', 'background-image' );
     121                }
     122
     123                // If we have a background image, add the option to remove it.
     124                if ( get_background_image() ) {
     125                        add_settings_field( 'remove-background', __( 'Remove Image' ), array( $this, 'remove_background_field' ), 'background-image', 'background-image' );
     126                }
     127
     128                // If the theme has a default image specified, and it is not the
     129                // current background image, add the option to reset it to the default.
     130                if ( current_theme_supports( 'custom-background', 'default-image' ) && get_background_image() !== get_theme_support( 'custom-background', 'default-image' ) ) {
     131                        add_settings_field( 'reset-background', __( 'Restore Original Image' ), array( $this, 'reset_background_field' ), 'background-image', 'background-image' );
     132                }
     133
     134                if ( current_theme_supports( 'custom-background', 'uploads' ) ) {
     135                        add_settings_field( 'custom-background-upload', __( 'Upload Image' ), array( $this, 'upload_background_field' ), 'background-image', 'background-image' );
     136                }
     137
     138                // Uploaded background images.
     139                $uploaded_backgrounds = get_uploaded_background_images();
     140                if ( $uploaded_backgrounds ) {
     141                        add_settings_field( 'uploaded-backgrounds', __( 'Uploaded Images' ), array( $this, 'background_selection_field' ), 'display-options', 'display-options', array(
     142                                'backgrounds' => $uploaded_backgrounds,
     143                                'label'       => __( 'You can choose one of your previously uploaded backgrounds.' ),
     144                        ) );
     145                }
     146
     147                // Default background images, registered by the theme.
     148                $default_backgrounds = get_default_backgrounds();
     149                $label = __( 'You can use one of these cool backgrounds.' );
     150                if ( current_theme_supports( 'custom-background', 'uploads' ) ) {
     151                        $label = __( 'If you don‘t want to upload your own image, you can use one of these cool backgrounds.' );
     152                }
     153                if ( $default_backgrounds ) {
     154                        add_settings_field( 'default-backgrounds', __( 'Default Images' ), array( $this, 'background_selection_field' ), 'display-options', 'display-options', array(
     155                                'backgrounds' => $default_backgrounds,
     156                                'label'       => $label,
     157                        ) );
     158                }
     159
     160                if ( get_background_image() ) {
     161                        add_settings_field( 'background-position',   __( 'Position' ),   array( $this, 'background_position_field' ),   'display-options', 'display-options' );
     162                        add_settings_field( 'background-repeat',     __( 'Repeat' ),     array( $this, 'background_repeat_field' ),     'display-options', 'display-options' );
     163                        add_settings_field( 'background-attachment', __( 'Attachment' ), array( $this, 'background_attachment_field' ), 'display-options', 'display-options' );
     164                }
     165                add_settings_field( 'background-color', __( 'Background Color' ), array( $this, 'background_color_field' ), 'display-options', 'display-options' );
     166        }
     167
     168        /**
     169         * Renders the background preview settings field.
     170         *
     171         * @since 3.9.0
     172         */
     173        function preview_field() {
     174                $background_styles = '';
     175                if ( $bgcolor = get_background_color() ) {
     176                                $background_styles .= sprintf( 'background-color: #%s;', $bgcolor );
     177                }
     178
     179                if ( get_background_image() ) {
     180                        $background_styles .= sprintf(
     181                                ' background-image: url(%1$s); background-repeat: %2$s; background-position: top %3$s;',
     182                                esc_url( get_background_image() ),
     183                                get_theme_mod( 'background_repeat', 'repeat' ),
     184                                get_theme_mod( 'background_position_x', 'left' )
     185                        );
     186                }
     187                ?>
     188                <div id="custom-background-image" style="<?php echo $background_styles; ?>">
     189                        <?php if ( get_background_image() ) : ?>
     190                        <img class="custom-background-image" src="<?php echo get_theme_mod( 'background_image_thumb', '' ); ?>" style="visibility:hidden;" alt="" /><br />
     191                        <img class="custom-background-image" src="<?php echo get_theme_mod( 'background_image_thumb', '' ); ?>" style="visibility:hidden;" alt="" />
     192                        <?php endif; ?>
     193                </div>
     194                <?php
     195        }
     196
     197        /**
     198         * Renders the background upload settings field.
     199         *
     200         * @since 3.9.0
     201         */
     202        function upload_background_field() {
     203                ?>
     204                <fieldset>
     205                        <form enctype="multipart/form-data" id="upload-form" class="wp-upload-form" method="post" action="">
     206                                <p>
     207                                        <label for="upload"><?php _e( 'Choose an image from your computer:' ); ?></label><br />
     208                                        <input type="file" id="upload" name="import" />
     209                                        <input type="hidden" name="action" value="save" />
     210                                        <?php
     211                                                wp_nonce_field( 'custom-background-upload', '_wpnonce-custom-background-upload' );
     212                                                submit_button( __( 'Upload' ), 'button', 'submit', false );
     213                                        ?>
     214                                </p>
     215                                <p>
     216                                        <label for="choose-from-library-link"><?php _e( 'Or choose an image from your media library:' ); ?></label><br />
     217                                        <a id="choose-from-library-link" class="button" data-choose="<?php esc_attr_e( 'Choose a Background Image' ); ?>" data-update="<?php esc_attr_e( 'Set as background' ); ?>"><?php _e( 'Choose Image' ); ?></a>
     218                                </p>
     219                        </form>
     220                </fieldset>
     221                <?php
     222        }
     223
     224        /**
     225         * Renders the background removal settings field.
     226         *
     227         * @since 3.9.0
     228         */
     229        function remove_background_field() {
     230                ?>
     231                <form method="post" action="">
     232                        <?php
     233                                wp_nonce_field('custom-background-remove', '_wpnonce-custom-background-remove');
     234                                submit_button( __( 'Remove Background Image' ), 'button', 'remove-background', false );
     235                                printf( '<span class="description">%s</span>', __( 'This will remove the background image. You will not be able to restore any customizations.' ) );
     236                        ?>
     237                </form>
     238                <?php
     239        }
     240
     241        /**
     242         * Renders the background reset settings field.
     243         *
     244         * @since 3.9.0
     245         */
     246        function reset_background_field() {
     247                ?>
     248                <form method="post" action="">
     249                        <?php
     250                                wp_nonce_field('custom-background-reset', '_wpnonce-custom-background-reset');
     251                                submit_button( __( 'Restore Original Image' ), 'button', 'reset-background', false );
     252                                printf( '<span class="description">%s</span>', __( 'This will restore the original background image. You will not be able to restore any customizations.' ) );
     253                        ?>
     254                </form>
     255                <?php
     256        }
     257
     258        /**
     259         * Renders the background selection settings field.
     260         *
     261         * @param array $args {
     262         *     An array of background selection arguments.
     263         *
     264         *     @type string $label       Descriptive label to the selection field.
     265         *     @type array  $backgrounds Selectable backgrounds to be displayed.
     266         * }
     267         * @since 3.9.0
     268         */
     269        function background_selection_field( $args = array() ) {
     270                $args = wp_parse_args( $args, array(
     271                        'label'       => '',
     272                        'backgrounds' => array(),
     273                ) );
     274                ?>
     275                <fieldset>
     276                        <label><?php echo $args['label']; ?></label>
     277                        <div class="available-backgrounds">
     278
     279                                <?php
     280                                        foreach ( $args['backgrounds'] as $background_key => $background ) :
     281                                                $description = empty( $background['description'] )   ? '' : $background['description'];
     282                                ?>
     283                                <div class="default-background">
     284                                        <label>
     285                                                <input name="default-background" type="radio" value="<?php echo esc_attr( $background_key ); ?>" <?php checked( $background['url'], get_background_image() ); ?>/>
     286                                                <img src="<?php echo esc_url( $background['thumbnail_url'] ); ?>" alt="<?php echo esc_attr( $description ); ?>" width="<?php echo esc_attr( get_option( 'thumbnail_size_w' ) ); ?>" />
     287                                        </label>
     288                                </div>
     289                                <?php endforeach; ?>
     290
     291                                <div class="clear"></div>
     292                        </div>
     293                </fieldset>
     294                <?php
     295        }
     296
     297        /**
     298         * Renders the background position settings field.
     299         *
     300         * @since 3.9.0
     301         */
     302        function background_position_field() {
     303                $theme_mod = get_theme_mod( 'background_position_x', 'left' );
     304                ?>
     305                <fieldset>
     306                        <legend class="screen-reader-text"><span><?php _e( 'Background Position' ); ?></span></legend>
     307                        <label>
     308                                <input name="background-position-x" type="radio" value="left"<?php checked( 'left', $theme_mod ); ?> />
     309                                <?php _e( 'Left' ); ?>
     310                        </label>
     311                        <label>
     312                                <input name="background-position-x" type="radio" value="center"<?php checked( 'center', $theme_mod ); ?> />
     313                                <?php _e( 'Center' ); ?>
     314                        </label>
     315                        <label>
     316                                <input name="background-position-x" type="radio" value="right"<?php checked( 'right', $theme_mod ); ?> />
     317                                <?php _e( 'Right' ); ?>
     318                        </label>
     319                </fieldset>
     320                <?php
     321        }
     322
     323        /**
     324         * Renders the background repeat settings field.
     325         *
     326         * @since 3.9.0
     327         */
     328        function background_repeat_field() {
     329                $theme_mod = get_theme_mod( 'background_repeat', 'repeat' );
     330                ?>
     331                <fieldset>
     332                        <legend class="screen-reader-text"><span><?php _e( 'Background Repeat' ); ?></span></legend>
     333                        <label>
     334                                <input type="radio" name="background-repeat" value="no-repeat"<?php checked( 'no-repeat', $theme_mod ); ?> />
     335                                <?php _e( 'No Repeat' ); ?>
     336                        </label>
     337                        <label>
     338                                <input type="radio" name="background-repeat" value="repeat"<?php checked( 'repeat', $theme_mod ); ?> />
     339                                <?php _e( 'Tile' ); ?>
     340                        </label>
     341                        <label>
     342                                <input type="radio" name="background-repeat" value="repeat-x"<?php checked( 'repeat-x', $theme_mod ); ?> />
     343                                <?php _e( 'Tile Horizontally' ); ?>
     344                        </label>
     345                        <label>
     346                                <input type="radio" name="background-repeat" value="repeat-y"<?php checked( 'repeat-y', $theme_mod ); ?> />
     347                                <?php _e( 'Tile Vertically' ); ?>
     348                        </label>
     349                </fieldset>
     350                <?php
     351        }
     352
     353        /**
     354         * Renders the background attachment settings field.
     355         *
     356         * @since 3.9.0
     357         */
     358        function background_attachment_field() {
     359                $theme_mod = get_theme_mod( 'background_attachment', 'scroll' );
     360                ?>
     361                <fieldset>
     362                        <legend class="screen-reader-text"><span><?php _e( 'Background Attachment' ); ?></span></legend>
     363                        <label>
     364                                <input name="background-attachment" type="radio" value="scroll" <?php checked( 'scroll', $theme_mod ); ?> />
     365                                <?php _e( 'Scroll' ); ?>
     366                        </label>
     367                        <label>
     368                                <input name="background-attachment" type="radio" value="fixed" <?php checked( 'fixed', $theme_mod ); ?> />
     369                                <?php _e( 'Fixed' ); ?>
     370                        </label>
     371                </fieldset>
     372                <?php
     373        }
     374
     375        /**
     376         * Renders the background color settings field.
     377         *
     378         * @since 3.9.0
     379         */
     380        function background_color_field() {
     381                $default_color = '';
     382                if ( current_theme_supports( 'custom-background', 'default-color' ) ) {
     383                        $default_color = sprintf( ' data-default-color="#%s"', esc_attr( get_theme_support( 'custom-background', 'default-color' ) ) );
     384                }
     385
     386                printf( '<input type="text" name="background-color" id="background-color" value="#%1$s"%2$s />', esc_attr( get_background_color() ), $default_color );
     387        }
     388
     389        /**
     390         * Adds an update notice, if not already set.
     391         *
     392         * @since 3.9.0
     393         */
     394        function updated() {
     395                if ( ! get_settings_errors( 'custom-background' ) ) {
     396                        add_settings_error( 'custom-background', 'background-updated', sprintf( __( 'Background updated. <a href="%s">Visit your site</a> to see how it looks.' ), home_url( '/' ) ), 'updated' );
     397                }
     398        }
     399
     400        /**
    108401         * Execute custom background modification.
    109402         *
    110403         * @since 3.0.0
     
    118411                        check_admin_referer('custom-background-reset', '_wpnonce-custom-background-reset');
    119412                        remove_theme_mod('background_image');
    120413                        remove_theme_mod('background_image_thumb');
    121                         $this->updated = true;
     414                        $this->updated();
    122415                        return;
    123416                }
    124417
     
    127420                        check_admin_referer('custom-background-remove', '_wpnonce-custom-background-remove');
    128421                        set_theme_mod('background_image', '');
    129422                        set_theme_mod('background_image_thumb', '');
    130                         $this->updated = true;
    131                         wp_safe_redirect( $_POST['_wp_http_referer'] );
     423                        $this->updated();
     424                        set_transient( 'settings_errors', get_settings_errors(), 30 );
     425                        wp_safe_redirect( add_query_arg( 'settings-updated', true, $_POST['_wp_http_referer'] ) );
    132426                        return;
    133427                }
    134428
     
    168462                                set_theme_mod('background_color', '');
    169463                }
    170464
    171                 $this->updated = true;
     465                if ( isset( $_POST['default-background'] ) ) {
     466                        check_admin_referer( 'custom-background' );
     467                        $uploaded = get_uploaded_background_images();
     468                        $default  = get_default_backgrounds();
     469
     470                        if ( isset( $uploaded[ $_POST['default-background'] ] ) ) {
     471                                set_theme_mod( 'background_image',       esc_url_raw( $uploaded[ $_POST['default-background'] ]['url'] ) );
     472                                set_theme_mod( 'background_image_thumb', esc_url_raw( $uploaded[ $_POST['default-background'] ]['thumbnail_url'] ) );
     473                        }
     474                        elseif ( isset( $default[ $_POST['default-background'] ] ) ) {
     475                                set_theme_mod( 'background_image',       esc_url_raw( $default[ $_POST['default-background'] ]['url'] ) );
     476                                set_theme_mod( 'background_image_thumb', esc_url_raw( $default[ $_POST['default-background'] ]['thumbnail_url'] ) );
     477                        }
     478                        else {
     479                                return;
     480                        }
     481                }
     482
     483                $this->updated();
    172484        }
    173485
    174486        /**
     
    177489         * @since 3.0.0
    178490         */
    179491        function admin_page() {
    180 ?>
    181 <div class="wrap" id="custom-background">
    182 <h2><?php _e('Custom Background'); ?></h2>
    183 <?php if ( !empty($this->updated) ) { ?>
    184 <div id="message" class="updated">
    185 <p><?php printf( __( 'Background updated. <a href="%s">Visit your site</a> to see how it looks.' ), home_url( '/' ) ); ?></p>
    186 </div>
    187 <?php }
     492                ?>
     493                <div class="wrap" id="custom-background">
     494                        <h2><?php _e( 'Custom Background' ); ?></h2>
     495                        <?php settings_errors( 'custom-background' ); ?>
    188496
    189         if ( $this->admin_image_div_callback ) {
    190                 call_user_func($this->admin_image_div_callback);
    191         } else {
    192 ?>
    193 <h3><?php _e('Background Image'); ?></h3>
    194 <table class="form-table">
    195 <tbody>
    196 <tr valign="top">
    197 <th scope="row"><?php _e('Preview'); ?></th>
    198 <td>
    199 <?php
    200 $background_styles = '';
    201 if ( $bgcolor = get_background_color() )
    202         $background_styles .= 'background-color: #' . $bgcolor . ';';
    203 
    204 if ( get_background_image() ) {
    205         $background_image_thumb = esc_url( set_url_scheme( get_theme_mod( 'background_image_thumb', str_replace( '%', '%%', get_background_image() ) ) ) );
    206         // background-image URL must be single quote, see below
    207         $background_styles .= ' background-image: url(\'' . $background_image_thumb . '\');'
    208                 . ' background-repeat: ' . get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) ) . ';'
    209                 . ' background-position: top ' . get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) );
    210 }
    211 ?>
    212 <div id="custom-background-image" style="<?php echo $background_styles; ?>"><?php // must be double quote, see above ?>
    213 <?php if ( get_background_image() ) { ?>
    214 <img class="custom-background-image" src="<?php echo $background_image_thumb; ?>" style="visibility:hidden;" alt="" /><br />
    215 <img class="custom-background-image" src="<?php echo $background_image_thumb; ?>" style="visibility:hidden;" alt="" />
    216 <?php } ?>
    217 </div>
    218 <?php } ?>
    219 </td>
    220 </tr>
    221 <?php if ( get_background_image() ) : ?>
    222 <tr valign="top">
    223 <th scope="row"><?php _e('Remove Image'); ?></th>
    224 <td>
    225 <form method="post" action="">
    226 <?php wp_nonce_field('custom-background-remove', '_wpnonce-custom-background-remove'); ?>
    227 <?php submit_button( __( 'Remove Background Image' ), 'button', 'remove-background', false ); ?><br/>
    228 <?php _e('This will remove the background image. You will not be able to restore any customizations.') ?>
    229 </form>
    230 </td>
    231 </tr>
    232 <?php endif; ?>
    233 
    234 <?php $default_image = get_theme_support( 'custom-background', 'default-image' ); ?>
    235 <?php if ( $default_image && get_background_image() != $default_image ) : ?>
    236 <tr valign="top">
    237 <th scope="row"><?php _e('Restore Original Image'); ?></th>
    238 <td>
    239 <form method="post" action="">
    240 <?php wp_nonce_field('custom-background-reset', '_wpnonce-custom-background-reset'); ?>
    241 <?php submit_button( __( 'Restore Original Image' ), 'button', 'reset-background', false ); ?><br/>
    242 <?php _e('This will restore the original background image. You will not be able to restore any customizations.') ?>
    243 </form>
    244 </td>
    245 </tr>
     497                        <?php do_settings_sections( 'background-image' ); ?>
    246498
    247 <?php endif; ?>
    248 <tr valign="top">
    249 <th scope="row"><?php _e('Select Image'); ?></th>
    250 <td><form enctype="multipart/form-data" id="upload-form" class="wp-upload-form" method="post" action="">
    251         <p>
    252                 <label for="upload"><?php _e( 'Choose an image from your computer:' ); ?></label><br />
    253                 <input type="file" id="upload" name="import" />
    254                 <input type="hidden" name="action" value="save" />
    255                 <?php wp_nonce_field( 'custom-background-upload', '_wpnonce-custom-background-upload' ); ?>
    256                 <?php submit_button( __( 'Upload' ), 'button', 'submit', false ); ?>
    257         </p>
    258         <p>
    259                 <label for="choose-from-library-link"><?php _e( 'Or choose an image from your media library:' ); ?></label><br />
    260                 <a id="choose-from-library-link" class="button"
    261                         data-choose="<?php esc_attr_e( 'Choose a Background Image' ); ?>"
    262                         data-update="<?php esc_attr_e( 'Set as background' ); ?>"><?php _e( 'Choose Image' ); ?></a>
    263         </p>
    264         </form>
    265 </td>
    266 </tr>
    267 </tbody>
    268 </table>
    269 
    270 <h3><?php _e('Display Options') ?></h3>
    271 <form method="post" action="">
    272 <table class="form-table">
    273 <tbody>
    274 <?php if ( get_background_image() ) : ?>
    275 <tr valign="top">
    276 <th scope="row"><?php _e( 'Position' ); ?></th>
    277 <td><fieldset><legend class="screen-reader-text"><span><?php _e( 'Background Position' ); ?></span></legend>
    278 <label>
    279 <input name="background-position-x" type="radio" value="left"<?php checked( 'left', get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) ) ); ?> />
    280 <?php _e('Left') ?>
    281 </label>
    282 <label>
    283 <input name="background-position-x" type="radio" value="center"<?php checked( 'center', get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) ) ); ?> />
    284 <?php _e('Center') ?>
    285 </label>
    286 <label>
    287 <input name="background-position-x" type="radio" value="right"<?php checked( 'right', get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) ) ); ?> />
    288 <?php _e('Right') ?>
    289 </label>
    290 </fieldset></td>
    291 </tr>
    292 
    293 <tr valign="top">
    294 <th scope="row"><?php _e( 'Repeat' ); ?></th>
    295 <td><fieldset><legend class="screen-reader-text"><span><?php _e( 'Background Repeat' ); ?></span></legend>
    296 <label><input type="radio" name="background-repeat" value="no-repeat"<?php checked( 'no-repeat', get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) ) ); ?> /> <?php _e('No Repeat'); ?></label>
    297         <label><input type="radio" name="background-repeat" value="repeat"<?php checked( 'repeat', get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) ) ); ?> /> <?php _e('Tile'); ?></label>
    298         <label><input type="radio" name="background-repeat" value="repeat-x"<?php checked( 'repeat-x', get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) ) ); ?> /> <?php _e('Tile Horizontally'); ?></label>
    299         <label><input type="radio" name="background-repeat" value="repeat-y"<?php checked( 'repeat-y', get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) ) ); ?> /> <?php _e('Tile Vertically'); ?></label>
    300 </fieldset></td>
    301 </tr>
    302 
    303 <tr valign="top">
    304 <th scope="row"><?php _ex( 'Attachment', 'Background Attachment' ); ?></th>
    305 <td><fieldset><legend class="screen-reader-text"><span><?php _e( 'Background Attachment' ); ?></span></legend>
    306 <label>
    307 <input name="background-attachment" type="radio" value="scroll" <?php checked( 'scroll', get_theme_mod( 'background_attachment', get_theme_support( 'custom-background', 'default-attachment' ) ) ); ?> />
    308 <?php _e( 'Scroll' ); ?>
    309 </label>
    310 <label>
    311 <input name="background-attachment" type="radio" value="fixed" <?php checked( 'fixed', get_theme_mod( 'background_attachment', get_theme_support( 'custom-background', 'default-attachment' ) ) ); ?> />
    312 <?php _e( 'Fixed' ); ?>
    313 </label>
    314 </fieldset></td>
    315 </tr>
    316 <?php endif; // get_background_image() ?>
    317 <tr valign="top">
    318 <th scope="row"><?php _e( 'Background Color' ); ?></th>
    319 <td><fieldset><legend class="screen-reader-text"><span><?php _e( 'Background Color' ); ?></span></legend>
    320 <?php
    321 $default_color = '';
    322 if ( current_theme_supports( 'custom-background', 'default-color' ) )
    323         $default_color = ' data-default-color="#' . esc_attr( get_theme_support( 'custom-background', 'default-color' ) ) . '"';
    324 ?>
    325 <input type="text" name="background-color" id="background-color" value="#<?php echo esc_attr( get_background_color() ); ?>"<?php echo $default_color ?> />
    326 </fieldset></td>
    327 </tr>
    328 </tbody>
    329 </table>
    330 
    331 <?php wp_nonce_field('custom-background'); ?>
    332 <?php submit_button( null, 'primary', 'save-background-options' ); ?>
    333 </form>
    334 
    335 </div>
    336 <?php
     499                        <form method="post" action="">
     500                                <?php
     501                                        do_settings_sections( 'display-options' );
     502                                        wp_nonce_field( 'custom-background' );
     503                                        submit_button( null, 'primary', 'save-background-options' );
     504                                ?>
     505                        </form>
     506                </div>
     507                <?php
    337508        }
    338509
    339510        /**
     
    387558
    388559                /** This action is documented in wp-admin/custom-header.php */
    389560                do_action( 'wp_create_file_in_uploads', $file, $id ); // For replication
    390                 $this->updated = true;
     561                $this->updated();
    391562        }
    392563
    393564        /**
  • wp-includes/theme.php

     
    11081108}
    11091109
    11101110/**
    1111  * Get the header images uploaded for the current theme.
     1111 * Get the header or background images uploaded for the current theme.
    11121112 *
    1113  * @since 3.2.0
     1113 * @since 3.9.0
     1114 * @access private
    11141115 *
     1116 * @param string $context Either 'custom-header' or 'custom-background'.
    11151117 * @return array
    11161118 */
    1117 function get_uploaded_header_images() {
    1118         $header_images = array();
     1119function _get_uploaded_images( $context ) {
     1120        $images   = array();
     1121        $meta_key = '';
     1122
     1123        switch ( $context ) {
     1124                case 'custom-header':
     1125                        $meta_key = '_wp_attachment_is_custom_header';
     1126                        break;
     1127                case 'custom-background':
     1128                        $meta_key = '_wp_attachment_is_custom_background';
     1129                        break;
     1130        }
    11191131
    1120         // @todo caching
    1121         $headers = get_posts( array( 'post_type' => 'attachment', 'meta_key' => '_wp_attachment_is_custom_header', 'meta_value' => get_option('stylesheet'), 'orderby' => 'none', 'nopaging' => true ) );
     1132        $attachments = get_posts( array(
     1133                'post_type'  => 'attachment',
     1134                'meta_key'   => $meta_key,
     1135                'meta_value' => get_option( 'stylesheet' ),
     1136                'orderby'    => 'none',
     1137                'nopaging'   => true,
     1138        ) );
    11221139
    1123         if ( empty( $headers ) )
    1124                 return array();
     1140        if ( ! empty( $attachments ) ) {
     1141                foreach ( (array) $attachments as $attachment ) {
     1142                        $url   = esc_url_raw( $attachment->guid );
     1143                        $index = basename( $url );
     1144                        $data  = wp_get_attachment_metadata( $attachment->ID );
    11251145
    1126         foreach ( (array) $headers as $header ) {
    1127                 $url = esc_url_raw( $header->guid );
    1128                 $header_data = wp_get_attachment_metadata( $header->ID );
    1129                 $header_index = basename($url);
    1130                 $header_images[$header_index] = array();
    1131                 $header_images[$header_index]['attachment_id'] =  $header->ID;
    1132                 $header_images[$header_index]['url'] =  $url;
    1133                 $header_images[$header_index]['thumbnail_url'] =  $url;
    1134                 if ( isset( $header_data['width'] ) )
    1135                         $header_images[$header_index]['width'] = $header_data['width'];
    1136                 if ( isset( $header_data['height'] ) )
    1137                         $header_images[$header_index]['height'] = $header_data['height'];
     1146                        $images[ $index ] = array(
     1147                                'attachment_id' => $attachment->ID,
     1148                                'url'           => $url,
     1149                                'thumbnail_url' => wp_get_attachment_thumb_url( $attachment->ID ),
     1150                        );
     1151
     1152                        if ( isset( $data['width'] ) ) {
     1153                                $images[ $index ]['width'] = $data['width'];
     1154                        }
     1155                        if ( isset( $data['height'] ) ) {
     1156                                $images[ $index ]['height'] = $data['height'];
     1157                        }
     1158                }
    11381159        }
    11391160
    1140         return $header_images;
     1161        return $images;
     1162}
     1163
     1164/**
     1165 * Get the header images uploaded for the current theme.
     1166 *
     1167 * @since 3.2.0
     1168 *
     1169 * @return array
     1170 */
     1171function get_uploaded_header_images() {
     1172        return _get_uploaded_images( 'custom-header' );
    11411173}
    11421174
    11431175/**
     
    12191251}
    12201252
    12211253/**
     1254 * Register a selection of default backgrounds to be displayed by the custom
     1255 * backgrounds admin UI.
     1256 *
     1257 * @since 3.9.0
     1258 *
     1259 * @param array $backgrounds Array of backgrounds keyed by a string id. The ids
     1260 *                           point to arrays containing 'url', 'thumbnail_url',
     1261 *                           and 'description' keys.
     1262 */
     1263function register_default_backgrounds( $backgrounds ) {
     1264        global $_wp_default_backgrounds;
     1265
     1266        $_wp_default_backgrounds = array_merge( (array) $_wp_default_backgrounds, (array) $backgrounds );
     1267}
     1268
     1269/**
     1270 * Unregister default backgrounds.
     1271 *
     1272 * This function must be called after register_default_backgrounds() has
     1273 * already added the background you want to remove.
     1274 *
     1275 * @see register_default_backgrounds()
     1276 * @since 3.9.0
     1277 *
     1278 * @param string|array $background The background string id (key of array) to
     1279 *                                 remove, or an array thereof.
     1280 * @return True on success, false on failure.
     1281 */
     1282function unregister_default_backgrounds( $background ) {
     1283        global $_wp_default_backgrounds;
     1284
     1285        if ( is_array( $background ) ) {
     1286                array_map( 'unregister_default_backgrounds', $background );
     1287        } elseif ( isset( $_wp_default_backgrounds[ $background ] ) ) {
     1288                unset( $_wp_default_backgrounds[ $background ] );
     1289                return true;
     1290        } else {
     1291                return false;
     1292        }
     1293}
     1294
     1295/**
     1296 * Array of registered default background images.
     1297 *
     1298 * @since 3.9.0
     1299 *
     1300 * @return array Backgrounds keyed by a string id. The ids point to arrays
     1301 *               containing 'url', 'thumbnail_url', and 'description' keys.
     1302 */
     1303function get_default_backgrounds() {
     1304        global $_wp_default_backgrounds;
     1305        $default_backgrounds = array();
     1306
     1307        if ( isset( $_wp_default_backgrounds ) ) {
     1308                $directory_args      = array( get_template_directory_uri(), get_stylesheet_directory_uri() );
     1309                $default_backgrounds = $_wp_default_backgrounds;
     1310                foreach ( array_keys( $_wp_default_backgrounds ) as $background ) {
     1311                        $default_backgrounds[ $background ] = array(
     1312                                'url'           => vsprintf( $_wp_default_backgrounds[ $background ]['url'],           $directory_args ),
     1313                                'thumbnail_url' => vsprintf( $_wp_default_backgrounds[ $background ]['thumbnail_url'], $directory_args ),
     1314                        );
     1315                }
     1316        }
     1317
     1318        if ( current_theme_supports( 'custom-background', 'default-image' ) ) {
     1319                $default_background = sprintf( get_theme_support( 'custom-background', 'default-image' ), get_template_directory_uri(), get_stylesheet_directory_uri() );
     1320
     1321                // Only add the default background if it has not been registered.
     1322                if ( ! in_array( $default_background, wp_list_pluck( $default_backgrounds, 'url' ) ) ) {
     1323                        $default_backgrounds[ basename( $default_background ) ] = array(
     1324                                'url'           => $default_background,
     1325                                'thumbnail_url' => $default_background,
     1326                                'description'   => '',
     1327                        );
     1328                }
     1329        }
     1330
     1331        return $default_backgrounds;
     1332}
     1333
     1334/**
     1335 * Get the background images uploaded for the current theme.
     1336 *
     1337 * @since 3.9.0
     1338 *
     1339 * @return array
     1340 */
     1341function get_uploaded_background_images() {
     1342        return _get_uploaded_images( 'custom-background' );
     1343}
     1344
     1345/**
    12221346 * Retrieve background image for custom background.
    12231347 *
    12241348 * @since 3.0.0
     
    14001524                        return add_theme_support( 'custom-header', array( 'uploads' => true ) );
    14011525                        break;
    14021526
     1527                case 'custom-background-uploads' :
     1528                        return add_theme_support( 'custom-background', array( 'uploads' => true ) );
     1529                        break;
     1530
    14031531                case 'custom-header' :
    14041532                        if ( ! is_array( $args ) )
    14051533                                $args = array( 0 => array() );
     
    14871615                                'default-position-x'     => 'left',
    14881616                                'default-attachment'     => 'scroll',
    14891617                                'default-color'          => '',
     1618                                'uploads'                => true,
    14901619                                'wp-head-callback'       => '_custom_background_cb',
    14911620                                'admin-head-callback'    => '',
    14921621                                'admin-preview-callback' => '',
     
    16201749                                return false;
    16211750                        add_theme_support( 'custom-header', array( 'uploads' => false ) );
    16221751                        return; // Do not continue - custom-header-uploads no longer exists.
     1752
     1753                case 'custom-background-uploads' :
     1754                        if ( ! isset( $_wp_theme_features['custom-background'] ) ) {
     1755                                return false;
     1756                        }
     1757                        add_theme_support( 'custom-background', array( 'uploads' => false ) );
     1758                        return;
    16231759        }
    16241760
    16251761        if ( ! isset( $_wp_theme_features[ $feature ] ) )
     
    16631799        if ( 'custom-header-uploads' == $feature )
    16641800                return current_theme_supports( 'custom-header', 'uploads' );
    16651801
     1802        if ( 'custom-background-uploads' == $feature ) {
     1803                return current_theme_supports( 'custom-background', 'uploads' );
     1804        }
     1805
    16661806        if ( !isset( $_wp_theme_features[$feature] ) )
    16671807                return false;
    16681808
  • wp-includes/class-wp-customize-control.php

     
    642642class WP_Customize_Background_Image_Control extends WP_Customize_Image_Control {
    643643
    644644        /**
     645         * The processed default backgrounds.
     646         * @since 3.9.0
     647         * @var array
     648         */
     649        protected $default_backgrounds;
     650
     651        /**
    645652         * Constructor.
    646653         *
    647654         * @since 3.4.0
     
    657664                        'get_url'  => 'get_background_image',
    658665                ) );
    659666
    660                 if ( $this->setting->default )
    661                         $this->add_tab( 'default',  __('Default'),  array( $this, 'tab_default_background' ) );
     667                $this->default_backgrounds = get_default_backgrounds();
     668
     669                if ( $this->default_backgrounds ) {
     670                        $this->add_tab( 'default', __('Default'), array( $this, 'tab_default_background' ) );
     671                }
     672
     673                if ( ! current_theme_supports( 'custom-background', 'uploads' ) ) {
     674                        $this->remove_tab( 'upload-new' );
     675                }
    662676        }
    663677
    664678        /**
    665679         * @since 3.4.0
     680         * @uses WP_Customize_Image_Control::print_tab_image()
    666681         */
    667682        public function tab_uploaded() {
    668                 $backgrounds = get_posts( array(
    669                         'post_type'  => 'attachment',
    670                         'meta_key'   => '_wp_attachment_is_custom_background',
    671                         'meta_value' => $this->manager->get_stylesheet(),
    672                         'orderby'    => 'none',
    673                         'nopaging'   => true,
    674                 ) );
    675 
    676683                ?><div class="uploaded-target"></div><?php
    677684
    678                 if ( empty( $backgrounds ) )
    679                         return;
    680 
    681                 foreach ( (array) $backgrounds as $background )
    682                         $this->print_tab_image( esc_url_raw( $background->guid ) );
     685                foreach ( get_uploaded_background_images() as $background ) {
     686                        $this->print_tab_image( esc_url_raw( $background['url'] ), esc_url_raw( $background['thumbnail_url'] ) );
     687                }
    683688        }
    684689
    685690        /**
     
    687692         * @uses WP_Customize_Image_Control::print_tab_image()
    688693         */
    689694        public function tab_default_background() {
    690                 $this->print_tab_image( $this->setting->default );
     695                foreach ( $this->default_backgrounds as $background ) {
     696                        $this->print_tab_image( esc_url_raw( $background['url'] ), esc_url_raw( $background['thumbnail_url'] ) );
     697                }
    691698        }
    692699}
    693700