WordPress.org

Make WordPress Core

Ticket #5316: 5316.5.diff

File 5316.5.diff, 16.3 KB (added by DD32, 6 years ago)
  • wp-admin/js/common.js

     
    55        // Reveal 
    66        jQuery('.wp-no-js-hidden').removeClass( 'wp-no-js-hidden' ); 
    77 
     8        // Hide elements which are shown via Javascript. (Show by default for non-js viewers) 
     9        jQuery('.wp-js-hide').hide() 
     10 
    811        // Basic form validation 
    912        if ( ( 'undefined' != typeof wpAjax ) && jQuery.isFunction( wpAjax.validateForm ) ) { 
    1013                jQuery('form.validate').submit( function() { return wpAjax.validateForm( jQuery(this) ); } ); 
  • wp-admin/js/forms.js

     
    11function checkAll(jQ) { // use attr( checked, fn ) 
    2         jQuery(jQ).find( 'tbody :checkbox' ).attr( 'checked', function() { 
     2        jQuery(jQ).find( 'tbody tr:visible :checkbox' ).attr( 'checked', function() { 
    33                return jQuery(this).attr( 'checked' ) ? '' : 'checked'; 
    44        } ); 
    55} 
     
    1010                if ( 'undefined' == e.shiftKey ) { return true; } 
    1111                if ( e.shiftKey ) { 
    1212                        if ( !lastClicked ) { return true; } 
    13                         var checks = $( lastClicked ).parents( 'form:first' ).find( ':checkbox' ); 
     13                        var checks = $( lastClicked ).parents( 'form:first' ).find( 'tr:visible :checkbox' ); 
    1414                        var first = checks.index( lastClicked ); 
    1515                        var last = checks.index( this ); 
    1616                        if ( 0 < first && 0 < last && first != last ) { 
  • wp-admin/options.php

     
    55$this_file = 'options.php'; 
    66$parent_file = 'options-general.php'; 
    77 
    8 wp_reset_vars(array('action')); 
     8wp_reset_vars(array('action', 'show', 'view')); 
    99 
    1010if ( !current_user_can('manage_options') ) 
    1111        wp_die(__('Cheatin&#8217; uh?')); 
    1212 
     13if ( isset($_POST['show-submit']) ) 
     14        $action = ''; //Prevent action=update firing if its a show-submit. 
     15else if ( isset($_POST['delete-submit']) ) 
     16        $action = 'delete'; 
     17 
     18function options_javascript(){ 
     19?> 
     20<script type="text/javascript"> 
     21        function filterTable(force_filter){ 
     22                var phrase = jQuery('#show').val(); 
     23                var callback = function(){ //Uncheck any checkbox's which are now hidden 
     24                        jQuery('tr:not(:visible) :checkbox').each( function(){ jQuery(this).attr('checked',''); } ); 
     25                } 
     26                 
     27                if( phrase != ''){ 
     28                        if( phrase.length > 2 || force_filter) 
     29                                jQuery.uiTableFilter(jQuery('#options-table'), phrase, null, callback); //Perform a filter 
     30                } else { //Else lets do a more efficient show-all 
     31                        jQuery('#options-table tr').show(); 
     32                } 
     33 
     34                return false; //Prevent pagereload. 
     35        } 
     36         
     37        function confirmDelete(){ 
     38                delete_items = Array(); 
     39                jQuery(':checked').each( function(){ delete_items.push(jQuery(this).val()); }); 
     40                if( delete_items.length == 0 ) 
     41                        return false; 
     42                else if( delete_items.length == 1 ) 
     43                        var strConfirm = '<?php _e('Are you sure you want to delete the Setting "%s"') ?>'; 
     44                else 
     45                        var strConfirm = '<?php _e('Are you sure you want to delete the Settings "%s"') ?>'; 
     46                strConfirm = strConfirm.replace('%s', delete_items.join('", "')); 
     47                return confirm(strConfirm); 
     48        } 
     49         
     50        //Only perform a filter if a key hasnt been pressed for 250ms. 
     51        var search_timeout = undefined; 
     52        addLoadEvent( function() { 
     53                jQuery('#show').bind('keyup', function() { 
     54                        if( typeof(search_timeout) != undefined) 
     55                                clearTimeout(search_timeout); 
     56 
     57                        search_timeout = window.setTimeout(function() { 
     58                                search_timeout = undefined; 
     59                                filterTable(); 
     60                        }, 250); 
     61                }); 
     62        }); 
     63         
     64</script> 
     65<?php 
     66} 
     67 
    1368switch($action) { 
    1469 
     70case 'delete': 
     71 
     72        check_admin_referer('update-options'); 
     73 
     74        $delete = (array)$_POST['checked']; 
     75        $goback = remove_query_arg('updated', wp_get_referer()); 
     76 
     77        if( count($delete) > 0 ){ 
     78                foreach( (array) $delete as $option) 
     79                        delete_option($option); 
     80                update_option('deleted_options', $delete); 
     81                $goback = add_query_arg('deleted', 'true', $goback); 
     82        } 
     83 
     84        if( !empty($show) ) 
     85                $goback = add_query_arg('show', $show, $goback); 
     86        wp_redirect($goback); 
     87    break; 
     88 
    1589case 'update': 
    16         $any_changed = 0; 
    1790 
    1891        check_admin_referer('update-options'); 
    1992 
    2093        if ( !$_POST['page_options'] ) { 
    2194                foreach ( (array) $_POST as $key => $value) { 
    22                         if ( !in_array($key, array('_wpnonce', '_wp_http_referer')) ) 
     95                        if ( !in_array($key, array('_wpnonce', '_wp_http_referer', 'action')) ) 
    2396                                $options[] = $key; 
    2497                } 
    2598        } else { 
     
    30103                foreach ($options as $option) { 
    31104                        $option = trim($option); 
    32105                        $value = $_POST[$option]; 
    33                         if(!is_array($value))   $value = trim($value); 
     106                        if( ! is_array($value) ) 
     107                                $value = trim($value); 
    34108                        $value = stripslashes_deep($value); 
    35109                        update_option($option, $value); 
    36110                } 
    37111        } 
    38  
    39         $goback = add_query_arg('updated', 'true', wp_get_referer()); 
     112        $goback = remove_query_arg('deleted', wp_get_referer()); 
     113        $goback = add_query_arg('updated', 'true', $goback); 
     114        if( !empty($show) ) 
     115                $goback = add_query_arg('show', $show, $goback); 
    40116        wp_redirect($goback); 
    41     break; 
     117        break; 
    42118 
    43119default: 
    44         include('admin-header.php'); ?> 
    45120 
     121        wp_enqueue_script('admin-forms'); 
     122        wp_enqueue_script('ui-table-filter'); 
     123        add_action('admin_head', 'options_javascript'); 
     124 
     125        include('admin-header.php'); 
     126 
     127        if( isset($_GET['deleted']) ){ 
     128                $deleted = get_option('deleted_options'); 
     129                if( ! empty($deleted) ) 
     130                        echo '<div id="message" class="updated fade"><p>' . sprintf(__('<strong>Settings Deleted:</strong> The following settings have been deleted: <em>%s</em>'), implode(', ', $deleted) ) . '</p></div>'; 
     131                delete_option('deleted_options'); 
     132        } 
     133        ?> 
    46134<div class="wrap"> 
    47   <h2><?php _e('All Settings'); ?></h2> 
    48   <form name="form" action="options.php" method="post" id="all-options"> 
    49   <?php wp_nonce_field('update-options') ?> 
    50   <input type="hidden" name="action" value="update" /> 
    51   <table class="form-table"> 
     135        <form name="form" action="options.php" method="post" id="settings-filter"> 
     136         
     137        <h2><?php _e('All Settings'); ?></h2> 
     138         
     139        <?php wp_nonce_field('update-options') ?> 
     140        <input type="hidden" name="action" value="update" /> 
     141         
     142        <p id="settings-search"> 
     143                <label class="hidden" for="show"><?php _e('Search Settings:') ?></label> 
     144                <input name="show" id="show" type="text" value="<?php echo wp_specialchars($show) ?>" /> 
     145                <input type="submit" name="show-submit" class="button" onclick="return filterTable(true);" value="<?php _e('Search Settings'); ?>" /> 
     146        </p> 
     147         
     148        <div class="tablenav"> 
     149                <input type="submit" name="delete-submit" id="delete-submit" class="button-secondary delete" onclick="return confirmDelete();" value="<?php _e('Delete Selected Settings') ?>" /> 
     150        </div> 
     151        <br class="clear" /> 
     152        <table class="widefat" id="options-table"> 
     153        <thead> 
     154                <tr> 
     155                        <th scope="col" class="check-column"><input type="checkbox" /></th> 
     156                        <th scope="col" style="width: 200px;"><?php _e('Setting Name') ?></th> 
     157                        <th scope="col"><?php _e('Setting Value') ?></th> 
     158                </tr> 
     159        </thead> 
     160        <tbody> 
    52161<?php 
    53 $options = $wpdb->get_results("SELECT * FROM $wpdb->options ORDER BY option_name"); 
     162$where = ''; 
     163if( ! empty($show) ) 
     164        $where = $wpdb->prepare("WHERE option_name LIKE '%s'", "%$show%"); 
    54165 
    55 foreach ( (array) $options as $option) : 
    56         $disabled = ''; 
     166$options = $wpdb->get_results("SELECT * FROM $wpdb->options $where ORDER BY option_name"); 
     167 
     168foreach ( (array)$options as $option) { 
     169 
    57170        $option->option_name = attribute_escape($option->option_name); 
    58171        if ( is_serialized($option->option_value) ) { 
    59                 if ( is_serialized_string($option->option_value) ) { 
    60                         // this is a serialized string, so we should display it 
     172                if ( is_serialized_string($option->option_value) ) 
     173                        $type = 'string'; 
     174                elseif ( is_serialized_array($option->option_value) ) 
     175                        $type = 'array'; 
     176                else 
     177                        $type = 'other'; 
     178        } else { 
     179                $type = 'string'; 
     180        } 
     181         
     182        echo " 
     183        <tr> 
     184                <th scope='row' class='check-column'><input type='checkbox' name='checked[]' value='$option->option_name' /></th> 
     185                <th scope='row'><label for='$option->option_name'>$option->option_name</label></th> 
     186                <td>"; 
     187        switch( $type ){ 
     188                case 'string': 
    61189                        $value = maybe_unserialize($option->option_value); 
     190                        if (strpos($value, "\n") !== false) 
     191                                echo "<textarea name='$option->option_name' id='$option->option_name' cols='30' rows='5'>" . wp_specialchars($value) . "</textarea>"; 
     192                        else 
     193                                echo "<input type='text' name='$option->option_name' id='$option->option_name' size='30' value='" . attribute_escape($value) . "' />"; 
    62194                        $options_to_update[] = $option->option_name; 
    63                         $class = 'all-options'; 
    64                 } else { 
    65                         $value = 'SERIALIZED DATA'; 
    66                         $disabled = ' disabled="disabled"'; 
    67                         $class = 'all-options disabled'; 
    68                 } 
    69         } else { 
    70                 $value = $option->option_value; 
    71                 $options_to_update[] = $option->option_name; 
    72                 $class = 'all-options'; 
     195                        break; 
     196                case 'array': 
     197                        echo "<p><a href='#$option->option_name' onclick='jQuery(\"#$option->option_name\").show(); jQuery(this).parent().hide(); return false;'>" . __('View Serialzed Data') . '</a></p>'; 
     198                        echo "<pre id='$option->option_name' class='wp-js-hide'>"; 
     199                        print_r( unserialize($option->option_value) ); 
     200                        echo '</pre>'; 
     201                        break; 
     202                case 'other': //Generally Objects, Objects are quite large usually, And as such, Its not worth loading them. (think RSS caches etc) 
     203                default: 
     204                        echo "<input type='text' name='$option->option_name' id='$option->option_name' size='30' class='disabled' disabled='disabled' value='" . attribute_escape(__('Unable to display Data')) . "' />"; 
     205                        break; 
    73206        } 
    74         echo " 
    75 <tr> 
    76         <th scope='row'><label for='$option->option_name'>$option->option_name</label></th> 
    77 <td>"; 
    78207 
    79         if (strpos($value, "\n") !== false) echo "<textarea class='$class' name='$option->option_name' id='$option->option_name' cols='30' rows='5'>" . wp_specialchars($value) . "</textarea>"; 
    80         else echo "<input class='$class' type='text' name='$option->option_name' id='$option->option_name' size='30' value='" . attribute_escape($value) . "'$disabled />"; 
    81  
    82208        echo "</td> 
    83 </tr>"; 
    84 endforeach; 
     209        </tr>"; 
     210} 
    85211?> 
    86   </table> 
    87 <?php $options_to_update = implode(',', $options_to_update); ?> 
    88 <p class="submit"><input type="hidden" name="page_options" value="<?php echo $options_to_update; ?>" /><input type="submit" name="Update" value="<?php _e('Save Changes') ?>" /></p> 
    89   </form> 
     212        </tbody> 
     213        </table> 
     214        <p class="submit"> 
     215                <input type="hidden" name="page_options" value="<?php echo implode(',', (array)$options_to_update); ?>" /> 
     216                <input type="submit" name="Update" value="<?php _e('Save Changes') ?>" /> 
     217        </p> 
     218        </form> 
    90219</div> 
    91220 
    92  
    93221<?php 
     222include('admin-footer.php'); 
    94223break; 
    95224} // end switch 
    96  
    97 include('admin-footer.php'); 
    98 ?> 
     225?> 
     226 No newline at end of file 
  • wp-admin/wp-admin.css

     
    212212        text-align: center; 
    213213} 
    214214 
    215 textarea.all-options, input.all-options { 
    216         width: 250px; 
     215#options-table td textarea, #options-table td input { 
     216        width: 350px; 
    217217} 
    218218 
    219219#postdiv, #titlediv, #guiddiv, #poststuff .stuffbox { 
     
    12841284} 
    12851285 
    12861286/* pasitioning etc. */ 
    1287 form#tags-filter { 
     1287form#tags-filter, form#posts-filter, form#settings-filter { 
    12881288        position: relative; 
    12891289} 
    12901290 
    1291 p#tag-search { 
     1291p#tag-search, p#post-search, p#settings-search { 
    12921292        position: absolute; 
    12931293        right: 0; 
    12941294        top: 0; 
    12951295        margin: 0; 
    12961296} 
    12971297 
    1298 form#posts-filter { 
    1299         position: relative; 
    1300 } 
    1301  
    1302 p#post-search { 
    1303         position: absolute; 
    1304         right: 0; 
    1305         top: 0; 
    1306         margin: 0; 
    1307 } 
    1308  
    1309 #post-search .button, #widget-search .button { 
     1298#post-search .button, #widget-search .button, #settings-search .button { 
    13101299        padding: 3px; 
    13111300        font-size: 13px; 
    13121301} 
  • wp-includes/functions.php

     
    190190        return false; 
    191191} 
    192192 
     193function is_serialized_array( $data ){ 
     194        // if it isn't a string, it isn't serialized 
     195        if ( !is_string( $data ) ) 
     196                return false; 
     197        $data = trim( $data ); 
     198        if ( preg_match( '/^a:[0-9]+:{.*}$/s', $data ) ) // this should match all lists(arrays) 
     199                return true; 
     200        return false; 
    193201 
     202} 
     203 
     204 
    194205/* Options functions */ 
    195206 
    196207// expects $setting to already be SQL-escaped 
  • wp-includes/js/jquery/jquery.uitablefilter.js

     
     1/* 
     2 * Copyright (c) 2008 Greg Weber greg at gregweber.info 
     3 * Dual licensed under the MIT and GPL licenses: 
     4 * http://www.opensource.org/licenses/mit-license.php 
     5 * http://www.gnu.org/licenses/gpl.html 
     6 * 
     7 * documentation at http://gregweber.info/projects/uitablefilter 
     8 * 
     9 * allows table rows to be filtered (made invisible) 
     10 * <code> 
     11 * t = $('table') 
     12 * $.uiTableFilter( t, phrase ) 
     13 * </code> 
     14 * arguments: 
     15 *   jQuery object containing table rows 
     16 *   phrase to search for 
     17 *   optional arguments: 
     18 *     column to limit search too (the column title in the table header) 
     19 *     ifHidden - callback to execute if one or more elements was hidden 
     20 */ 
     21jQuery.uiTableFilter = function(jq, phrase, column, ifHidden){ 
     22  var new_hidden = false; 
     23  if( this.last_phrase === phrase ) return false; 
     24 
     25  var phrase_length = phrase.length; 
     26  var words = phrase.toLowerCase().split(" "); 
     27 
     28  var success = function(elem) { elem.show() } 
     29  var failure = function(elem) { elem.hide() } 
     30 
     31  if( column ) { 
     32    var index = null; 
     33    jq.find("thead > tr:last > th").each( function(i){ 
     34      if( $(this).text() == column ){ 
     35        index = i; 
     36        return false; 
     37      } 
     38    }); 
     39    var iselector = "td:eq(" + index + ")"; 
     40   
     41    var search_text = function( ){ 
     42      var elem = jQuery(this); 
     43      jQuery.uiTableFilter.has_words( jQuery(elem.find(iselector)).text(), words ) ? 
     44        success(elem) : failure(elem); 
     45    } 
     46  } 
     47  else { 
     48    var search_text = function(){ 
     49        var elem = jQuery(this); 
     50        jQuery.uiTableFilter.has_words( elem.text(), words ) ? elem.show() : elem.hide(); 
     51    } 
     52  } 
     53 
     54  // if added one letter to last time, 
     55  // just check newest word and only need to hide 
     56  if( (words.size > 1) && (phrase.substr(0, phrase_length - 1) === 
     57        this.last_phrase) ) { 
     58 
     59    if( phrase[-1] === " " ) 
     60    { this.last_phrase = phrase; return false; } 
     61 
     62    success = function(elem) { elem.hide(); new_hidden = true; } 
     63    failure = function(elem) {;} 
     64    var words = words[-1]; 
     65    jq.find("tbody tr:visible").each( search_text ) 
     66  } 
     67  else { 
     68    new_hidden = true; 
     69    jq.find("tbody > tr").each( search_text ); 
     70  } 
     71 
     72  last_phrase = phrase; 
     73  if( ifHidden && new_hidden ) ifHidden(); 
     74  return jq; 
     75}; 
     76jQuery.uiTableFilter.last_phrase = "" 
     77 
     78// not jQuery dependent 
     79// "" [""] -> Boolean 
     80// "" [""] Boolean -> Boolean 
     81jQuery.uiTableFilter.has_words = function( str, words, caseSensitive ) 
     82{ 
     83  var text = caseSensitive ? str : str.toLowerCase(); 
     84  for (var i=0; i < words.length; i++) { 
     85    if (text.indexOf(words[i]) === -1) return false; 
     86  } 
     87  return true; 
     88} 
     89 No newline at end of file 
  • wp-includes/script-loader.php

     
    1111        } 
    1212 
    1313        function default_scripts() { 
    14                 $this->add( 'common', '/wp-admin/js/common.js', array('jquery'), '20080318' ); 
     14                $this->add( 'common', '/wp-admin/js/common.js', array('jquery'), '20080517' ); 
    1515                $this->add( 'sack', '/wp-includes/js/tw-sack.js', false, '1.6.1' ); 
    1616 
    1717                $this->add( 'quicktags', '/wp-includes/js/quicktags.js', false, '3958' ); 
     
    205205                                'updateCompleted' => __('Update completed.'), 
    206206                                'error' => __('Error:') 
    207207                        )); 
     208                        $this->add( 'ui-table-filter', '/wp-includes/js/jquery/jquery.uitablefilter.js', array( 'jquery' ), '20080517' ); 
    208209                } 
    209210        } 
    210211