WordPress.org

Make WordPress Core

Ticket #5316: extended-options.php

File extended-options.php, 6.7 KB (added by DD32, 8 years ago)

Patch in Plugin form

Line 
1<?php
2/*
3Plugin Name: Extended Options
4Version: 1.0-alpha
5Description: Adds delete and Viewing(for serialized data) to the <a href='options.php'>Options page</a>.
6Author: Dion Hulse
7
8Author URI: http://dd32.id.au/
9Plugin URI: http://dd32.id.au/wordpress-plugins/
10*/
11
12add_action('load-options.php', 'eo_load');
13function eo_load(){
14global $title, $this_file, $parent_file, $menu, $submenu, $action, $option;
15
16$title = __('Options');
17$this_file = 'options.php';
18$parent_file = 'options-general.php';
19
20wp_reset_vars(array('action','option'));
21
22if ( !current_user_can('manage_options') )
23        wp_die(__('Cheatin&#8217; uh?'));
24
25switch( $action ){
26        case 'update':
27                check_admin_referer('update-options');
28       
29                if ( !$_POST['page_options'] ) {
30                        foreach ( (array) $_POST as $key => $value) {
31                                if ( !in_array($key, array('_wpnonce', '_wp_http_referer', 'delete', 'Update', 'action')) )
32                                        $options[] = $key;
33                        }
34                } else {
35                        $options = explode(',', stripslashes($_POST['page_options']));
36                }
37       
38                if ($options) {
39                        foreach ($options as $option) {
40                                $option = trim($option);
41                                $value = $_POST[$option];
42                                if( !is_array($value))
43                                        $value = trim($value);
44                                $value = stripslashes_deep($value);
45                                update_option($option, $value);
46                        }
47                }
48                $goback = wp_get_referer();
49                $goback = add_query_arg('updated', 'true', $goback);
50                $goback = remove_query_arg('deleted', $goback);
51               
52                if( isset($_POST['delete']) ){
53                        //Delete stuff
54                        $deleted_options = array();
55                        foreach( (array) $_POST['delete'] as $group){
56                                foreach($group as $option => $val){
57                                        if( 'on' != $val ) //Just some extra added stuff
58                                                continue;
59                                        delete_option($option);
60                                        $deleted_options[] = $option;
61                                }
62                        }
63                        $goback = add_query_arg('deleted', implode(',',$deleted_options), $goback);
64                }
65               
66                wp_redirect($goback);
67                break;
68        case 'view':
69                check_admin_referer('view-option');
70                include('admin-header.php'); ?>
71                <div class="wrap">
72                        <h2><?php printf(__('Viewing Option: %s'),$option); ?></h2>
73                        <pre><?php
74                                $option_value = get_option($option);
75                                print_r($option_value);
76                        ?></pre>
77                </div>
78                <?php
79                include('admin-footer.php');
80                break;
81        default:
82                wp_enqueue_script('jquery');
83                add_action('admin_head','option_head');
84                function option_head(){ ?>
85<script type="text/javascript">
86        function toggleSection(section) {
87                jQuery("input:checkbox[@name^='delete[" + section + "]']").each( function(){ this.checked = !this.checked; } );
88                return false;
89        }
90        function submitForm(){
91                var deleteItems = jQuery("input:checkbox:checked");
92                if( deleteItems.size() == 0)
93                        return true;
94                var messagePrompt = "<?php _e('Are you sure you wish to delete the following options?'); ?>";
95                deleteItems.each( function() { messagePrompt += "\n" + this.title; });
96                return confirm(messagePrompt);
97        }
98</script>
99<?php
100        }
101       
102        include('admin-header.php'); ?>
103        <?php
104                if( isset($_GET['deleted']) )
105                        echo '<div id="deleted" class="updated fade"><p>' . sprintf(__('The following options were <strong>deleted</strong>: <em>%s</em>'),str_replace(',',', ',$_GET['deleted'])) . '</p></div>';
106        ?>
107<div class="wrap">
108        <form name="form" action="options.php" method="post" id="all-options" onsubmit="return submitForm();">
109        <?php wp_nonce_field('update-options'); ?>
110        <input type="hidden" name="action" value="update" />
111        <p class="submit"><input type="submit" name="Update" value="<?php _e('Update Options &raquo;') ?>" /></p>
112        <table width="98%">
113<?php
114global $wpdb;
115$raw_options = $wpdb->get_results("SELECT * FROM $wpdb->options ORDER BY option_name");
116
117$groupedOptions = array('general'=>array());
118//Group options.
119foreach( (array) $raw_options as $option ){
120        $group = substr($option->option_name,0,strpos($option->option_name,'_'));
121        if( empty($group) ) 
122                $group = 'general';
123        $groupedOptions[ $group ][] = $option;
124}
125
126//Only have group options if there is > 3 options.
127$wp_options = array('default', 'wp');
128foreach ( (array) $groupedOptions as $group => $options){
129        if( count($options) < 3 || in_array($group, $wp_options) ){
130                $groupedOptions['general'] = array_merge($groupedOptions['general'], $options);
131                unset( $groupedOptions[$group] );
132        }
133}
134
135foreach ( (array) $groupedOptions as $group => $options){
136        //Sort the options alphabetically by option name.
137        usort($options, create_function('$a, $b', 'return strcasecmp($a->option_name, $b->option_name);'));
138       
139        echo "<tr><td colspan='3'><h2>'" . ucwords($group) ."' " .  __('Options') . "</h2></td></tr>";
140        echo '<tr><th style="text-align:left">' . __('Delete?') . '</th><th colspan="2">&nbsp;</th></tr>';
141       
142        foreach ( (array) $options as $option){
143                $disabled = '';
144                $serialized_view = '';
145                $option->option_name = attribute_escape($option->option_name);
146                if ( is_serialized($option->option_value) ) {
147                        if ( is_serialized_string($option->option_value) ) {
148                                // this is a serialized string, so we should display it
149                                $value = maybe_unserialize($option->option_value);
150                                $options_to_update[] = $option->option_name;
151                                $class = 'all-options';
152                        } else {
153                                $value = __('SERIALIZED DATA');
154                                $disabled = ' disabled="disabled"';
155                                $class = 'all-options disabled';
156                                $serialized_view = sprintf(' <a href="%s">%s</a>', 
157                                                                                        wp_nonce_url('options.php?action=view&option=' . urlencode($option->option_name), 'view-option'),
158                                                                                        __('View &raquo;'));
159                        }
160                } else {
161                        $value = $option->option_value;
162                        $options_to_update[] = $option->option_name;
163                        $class = 'all-options';
164                }
165                echo "
166        <tr>
167                <td class='delete'><input type='checkbox' name='delete[$group][$option->option_name]' title='$option->option_name' /></td>
168                <th scope='row'><label for='$option->option_name'>$option->option_name</label></th>
169        <td>";
170       
171                if (strpos($value, "\n") !== false)
172                        echo "<textarea class='$class' name='$option->option_name' id='$option->option_name' cols='30' rows='5'>" . wp_specialchars($value) . "</textarea>$serialized_view";
173                else
174                        echo "<input class='$class' type='text' name='$option->option_name' id='$option->option_name' size='30' value='" . attribute_escape($value) . "'$disabled />$serialized_view";
175                echo "</td>";
176                echo "</tr>";
177        }
178        //Group footer
179        echo "<tr><td><a href='#' onclick='return toggleSection(\"$group\");'>" . __('Invert Selection') . "</a></td><td colspan='2'>&nbsp;</td></tr>";
180}
181?>
182        </table>
183        <p class="submit">
184                <input type="hidden" name="page_options" value="<?php echo implode(',', $options_to_update); ?>" />
185                <input type="submit" name="Update" value="<?php _e('Update Options &raquo;') ?>" />
186        </p>
187        </form>
188</div>
189<?php
190        include('admin-footer.php');
191}//End switch
192die();//We do not want the real options page to load.
193}//End function eo_load()
194?>