WordPress.org

Make WordPress Core

Ticket #6239: 6239.diff

File 6239.diff, 7.9 KB (added by mdawaffe, 6 years ago)
  • wp-includes/widgets.php

     
    11891189                $show_author = 0; 
    11901190                $show_date = 0; 
    11911191        } else { 
    1192                 extract( $options[$number] ); 
     1192                extract( (array) $options[$number] ); 
    11931193        } 
    11941194 
    11951195        wp_widget_rss_form( compact( 'number', 'title', 'url', 'items', 'error', 'show_summary', 'show_author', 'show_date' ) ); 
  • wp-admin/includes/widgets.php

     
    22 
    33// $_search is unsanitized 
    44function wp_list_widgets( $show = 'all', $_search = false ) { 
    5         global $wp_registered_widgets, $sidebars_widgets; 
     5        global $wp_registered_widgets, $sidebars_widgets, $wp_registered_widget_controls; 
    66        if ( $_search ) { 
    77                // sanitize 
    88                $search = preg_replace( '/[^\w\s]/', '', $_search ); 
     
    5252                        $widget_control_template = ob_get_contents(); 
    5353                        ob_end_clean(); 
    5454 
     55                        $widget_id = $widget['id']; // save this for later in case we mess with $widget['id'] 
     56 
    5557                        $is_multi = false !== strpos( $widget_control_template, '%i%' ); 
    5658                        if ( !$sidebar || $is_multi ) { 
    57                                 if ( $is_multi ) 
    58                                         $already_shown[] = $widget['callback']; // it's a multi-widget.  We only need to show it in the list once. 
    59                                 $action = 'add'; 
    60                                 $add_url = wp_nonce_url( add_query_arg( array( 
     59                                $add_query = array( 
    6160                                        'sidebar' => $sidebar, 
    62                                         'add' => $widget['id'], 
    6361                                        'key' => false, 
    6462                                        'edit' => false 
    65                                 ) ), "add-widget_$widget[id]" ); 
     63                                ); 
     64                                if ( $is_multi ) { 
     65                                        // it's a multi-widget.  We only need to show it in the list once. 
     66                                        $already_shown[] = $widget['callback']; 
     67                                        $num = array_pop( explode( '-', $widget['id'] ) ); 
     68                                        $id_base = $wp_registered_widget_controls[$widget['id']]['id_base']; 
     69                                        // so that we always add a new one when clicking "add" 
     70                                        while ( isset($wp_registered_widgets["$id_base-$num"]) ) 
     71                                                $num++; 
     72                                        $widget['id'] = "$id_base-$num"; 
     73                                        $add_query['base'] = $id_base; 
     74                                        $add_query['key'] = $num; 
     75                                        $add_query['sidebar'] = $GLOBALS['sidebar']; 
     76                                } 
     77                                $add_query['add'] = $widget['id']; 
     78                                $action = 'add'; 
     79                                $add_url = wp_nonce_url( add_query_arg( $add_query ), "add-widget_$widget[id]" ); 
    6680                        } else { 
    6781                                $action = 'edit'; 
    6882                                $edit_url = clean_url( add_query_arg( array( 
     
    110124                        <?php endif; ?> 
    111125 
    112126                        <div class="widget-description"> 
    113                                 <?php echo ( $widget_description = wp_widget_description( $widget['id'] ) ) ? $widget_description : '&nbsp;'; ?> 
     127                                <?php echo ( $widget_description = wp_widget_description( $widget_id ) ) ? $widget_description : '&nbsp;'; ?> 
    114128                        </div> 
    115129 
    116130                        <br class="clear" /> 
     
    174188 
    175189        $key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[$sidebar_id] ) : 'no-key'; // position of widget in sidebar 
    176190 
    177         $edit = $edit_widget > 0 && $key && $edit_widget == $key; // (bool) are we currently editing this widget 
     191        $edit = -1 <  $edit_widget && is_numeric($key) && $edit_widget === $key; // (bool) are we currently editing this widget 
    178192 
    179193        $id_format = $widget['id']; 
    180194        // We aren't showing a widget control, we're outputing a template for a mult-widget control 
     
    240254 
    241255                                <?php endif; ?> 
    242256 
    243                                 <a class="widget-action widget-control-remove delete alignright" href="<?php echo clean_url( add_query_arg( array( 'remove' => $id_format, 'key' => $key ), wp_nonce_url( null, "remove-widget_$widget[id]" ) ) ); ?>"><?php _e('Remove'); ?></a> 
     257                                <a class="widget-action widget-control-remove delete alignright" href="<?php echo clean_url( wp_nonce_url( add_query_arg( array( 'remove' => $id_format, 'key' => $key ) ), "remove-widget_$widget[id]" ) ); ?>"><?php _e('Remove'); ?></a> 
    244258                                <br class="clear" /> 
    245259                        </div> 
    246260                </div> 
  • wp-admin/widgets.php

     
    4646if ( empty( $sidebars_widgets[$sidebar] ) ) 
    4747        $sidebars_widgets[$sidebar] = array(); 
    4848 
    49 $http_post = ( 'POST' == $_SERVER['REQUEST_METHOD'] ); 
     49$http_post = 'post' == strtolower($_SERVER['REQUEST_METHOD']); 
    5050 
    5151// We're updating a sidebar 
    5252if ( $http_post && isset($sidebars_widgets[$_POST['sidebar']]) ) { 
     53        check_admin_referer( 'edit-sidebar_' . $_POST['sidebar'] ); 
    5354 
    5455        /* Hack #1 
    5556         * The widget_control is overloaded.  It updates the widget's options AND echoes out the widget's HTML form. 
     
    8182                if ( !$val ) 
    8283                        unset($_POST['widget-id'][$key]); 
    8384 
    84         // Reset the key numbering and stare 
     85        // Reset the key numbering and store 
    8586        $new_sidebar = isset( $_POST['widget-id'] ) && is_array( $_POST['widget-id'] ) ? array_values( $_POST['widget-id'] ) : array(); 
    8687        $sidebars_widgets[$_POST['sidebar']] = $new_sidebar; 
    8788        wp_set_sidebars_widgets( $sidebars_widgets ); 
     
    9697// What widget (if any) are we editing 
    9798$edit_widget = -1; 
    9899 
    99 $query_args = array('add', 'remove', 'key', 'edit', '_wpnonce', 'message' ); 
     100$query_args = array('add', 'remove', 'key', 'edit', '_wpnonce', 'message', 'base' ); 
    100101 
    101102if ( isset($_GET['add']) && $_GET['add'] ) { 
    102103        // Add to the end of the sidebar 
     104        $control_callback; 
    103105        if ( isset($wp_registered_widgets[$_GET['add']]) ) { 
    104106                check_admin_referer( "add-widget_$_GET[add]" ); 
    105107                $sidebars_widgets[$sidebar][] = $_GET['add']; 
    106108                wp_set_sidebars_widgets( $sidebars_widgets ); 
     109        } elseif ( isset($_GET['base']) && isset($_GET['key']) ) { // It's a multi-widget 
     110                check_admin_referer( "add-widget_$_GET[add]" ); 
     111                // Copy minimal info from an existing instance of this widget to a new instance 
     112                foreach ( $wp_registered_widget_controls as $control ) { 
     113                        if ( $_GET['base'] === $control['id_base'] ) { 
     114                                $control_callback = $control['callback']; 
     115                                $num = (int) $_GET['key']; 
     116                                $control['params'][0]['number'] = $num; 
     117                                $control['id'] = $control['id_base'] . '-' . $num; 
     118                                $wp_registered_widget_controls[$control['id']] = $control; 
     119                                $sidebars_widgets[$sidebar][] = $control['id']; 
     120                                break; 
     121                        } 
     122                } 
    107123        } 
     124 
     125        // it's a multi-widget.  The only way to add multi-widgets without JS is to actually submit POST content... 
     126        // so here we go 
     127        if ( is_callable( $control_callback ) ) { 
     128                require_once( 'admin-header.php' ); 
     129        ?> 
     130                <div class="wrap"> 
     131                <h2><?php _e( 'Add Widget' ); ?></h2> 
     132                <br /> 
     133                <form action="<?php echo clean_url( remove_query_arg( $query_args ) ); ?>" method="post"> 
     134                 
     135                        <ul class="widget-control-list"> 
     136                                <li class="widget-list-control-item"> 
     137                                        <h4 class="widget-title"><?php echo $control['name']; ?></h4> 
     138                                        <div class="widget-control" style="display: block;"> 
     139        <?php 
     140                                                call_user_func_array( $control_callback, $control['params'] ); 
     141        ?> 
     142                                                <div class="widget-control-actions"> 
     143                                                        <input type="submit" class="button" value="<?php _e( 'Add Widget' ); ?>" /> 
     144                                                        <input type="hidden" id='sidebar' name='sidebar' value="<?php echo $sidebar; ?>" /> 
     145        <?php   wp_nonce_field ( 'edit-sidebar_' . $sidebar ); 
     146                foreach ( $sidebars_widgets[$sidebar] as $sidebar_widget_id ) : ?> 
     147                                                        <input type="hidden" name='widget-id[]' value="<?php echo $sidebar_widget_id; ?>" /> 
     148        <?php   endforeach; ?> 
     149                                                </div> 
     150                                        </div> 
     151                                </li> 
     152                        </ul> 
     153                </form> 
     154                </div> 
     155        <?php 
     156 
     157                require_once( 'admin-footer.php' ); 
     158                exit; 
     159        } 
    108160        wp_redirect( remove_query_arg( $query_args ) ); 
    109161        exit; 
    110162} elseif ( isset($_GET['remove']) && $_GET['remove'] && isset($_GET['key']) && is_numeric($_GET['key']) ) { 
     
    253305                        <input type="hidden" id='sidebar' name='sidebar' value="<?php echo $sidebar; ?>" /> 
    254306                        <input type="hidden" id="generated-time" name="generated-time" value="<?php echo time() - 1199145600; // Jan 1, 2008 ?>" /> 
    255307                        <input type="submit" name="save-widgets" value="<?php _e( 'Save Changes' ); ?>" /> 
     308<?php 
     309                        wp_nonce_field( 'edit-sidebar_' . $sidebar ); 
     310?> 
    256311                </p> 
    257312        </div> 
    258313