Widget CSS Classes - Version 1.4.0

Version Description

  • Feature: Sort Pre-defined classes (thanks Jory Hogeveen)
  • Security: Prevent unauthenticated import of settings
  • Fix: Notice message when classes is empty (thanks Jory Hogeveen)
Download this release

Release Info

Developer elusivelight
Plugin Icon 128x128 Widget CSS Classes
Version 1.4.0
Comparing to
See all releases

Code changes from version 1.3.0 to 1.4.0

README.md ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ # Widget CSS Classes
2
+
3
+ **Version:** see [widget-css-classes.php](/widget-css-classes.php)
4
+ **Description:** Add custom, first, last, even, odd, and numbered classes to your widgets.
5
+ **Author:** C.M. Kendrick
6
+ **Author URI:** http://cleverness.org
7
+ **Plugin URI:** http://cleverness.org/plugins/widget-css-classes
8
+ **Text Domain:** widget-css-classes
css/widget-css-classes.css CHANGED
@@ -1,8 +1,20 @@
1
- .wcssc_copy span, .wcssc_remove span {
2
- vertical-align: middle;
3
  margin: 0;
4
  padding: 0;
5
  }
6
- .wcssc_copy, .wcssc_remove {
7
  text-decoration: none;
 
 
 
 
 
 
 
 
 
 
 
 
8
  }
1
+ .wcssc_copy span, .wcssc_remove span, .wcssc_sort span {
2
+ vertical-align: text-bottom;
3
  margin: 0;
4
  padding: 0;
5
  }
6
+ .wcssc_copy, .wcssc_remove, .wcssc_sort {
7
  text-decoration: none;
8
+ }
9
+ .wcssc_sort {
10
+ display: none;
11
+ cursor: move;
12
+ }
13
+ .wcssc_sort_fixed .wcssc_sort {
14
+ visibility: hidden;
15
+ }
16
+
17
+ .wcssc_sortable .wcssc_drop_placeholder {
18
+ background: #e5e5e5;
19
+ height: 30px;
20
  }
includes/widget-css-classes-settings.class.php CHANGED
@@ -21,21 +21,21 @@ class WCSSC_Settings {
21
  private $plugin_tabs = array();
22
  private $general_settings = array();
23
 
24
- function __construct() {
25
  add_action( 'admin_init', array( $this, 'load_settings' ) );
26
  add_action( 'admin_init', array( $this, 'register_general_settings' ) );
27
  add_action( 'admin_init', array( $this, 'register_importexport_settings' ) );
28
  add_action( 'admin_menu', array( $this, 'add_admin_menus' ) );
29
  }
30
 
31
- function load_settings() {
32
  $this->general_settings = get_option( $this->general_key );
33
  }
34
 
35
- function section_general_desc() {
36
  }
37
 
38
- function register_general_settings() {
39
  $this->plugin_tabs[$this->general_key] = esc_attr__( 'Widget CSS Classes Settings', 'widget-css-classes' );
40
 
41
  register_setting( $this->general_key, $this->general_key, array( $this, 'validate_input' ) );
@@ -49,34 +49,34 @@ class WCSSC_Settings {
49
  do_action( 'widget_css_classes_settings' );
50
  }
51
 
52
- function show_number_option() { ?>
53
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_number]'; ?>" value="1" <?php checked( $this->general_settings['show_number'], 1 ); ?> /> <?php esc_attr_e( 'Yes', 'widget-css-classes' ); ?>&nbsp;&nbsp;
54
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_number]'; ?>" value="0" <?php checked( $this->general_settings['show_number'], 0 ); ?> /> <?php esc_attr_e( 'No', 'widget-css-classes' ); ?>
55
  <?php
56
  }
57
 
58
- function show_location_option() {
59
  ?>
60
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_location]'; ?>" value="1" <?php checked( $this->general_settings['show_location'], 1 ); ?> /> <?php esc_attr_e( 'Yes', 'widget-css-classes' ); ?>&nbsp;&nbsp;
61
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_location]'; ?>" value="0" <?php checked( $this->general_settings['show_location'], 0 ); ?> /> <?php esc_attr_e( 'No', 'widget-css-classes' ); ?>
62
  <?php
63
  }
64
 
65
- function show_evenodd_option() {
66
  ?>
67
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_evenodd]'; ?>" value="1" <?php checked( $this->general_settings['show_evenodd'], 1 ); ?> /> <?php esc_attr_e( 'Yes', 'widget-css-classes' ); ?>&nbsp;&nbsp;
68
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_evenodd]'; ?>" value="0" <?php checked( $this->general_settings['show_evenodd'], 0 ); ?> /> <?php esc_attr_e( 'No', 'widget-css-classes' ); ?>
69
  <?php
70
  }
71
 
72
- function show_id_option() {
73
  ?>
74
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_id]'; ?>" value="1" <?php checked( $this->general_settings['show_id'], 1 ); ?> /> <?php esc_attr_e( 'Yes', 'widget-css-classes' ); ?>&nbsp;&nbsp;
75
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_id]'; ?>" value="0" <?php checked( $this->general_settings['show_id'], 0 ); ?> /> <?php esc_attr_e( 'No', 'widget-css-classes' ); ?>
76
  <?php
77
  }
78
 
79
- function type_option() {
80
  ?>
81
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[type]'; ?>" value="1" <?php checked( $this->general_settings['type'], 1 ); ?> /> <?php esc_attr_e( 'Text', 'widget-css-classes' ); ?>&nbsp;&nbsp;
82
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[type]'; ?>" value="2" <?php checked( $this->general_settings['type'], 2 ); ?> /> <?php esc_attr_e( 'Predefined', 'widget-css-classes' ); ?>&nbsp;&nbsp;
@@ -85,19 +85,27 @@ class WCSSC_Settings {
85
  <?php
86
  }
87
 
88
- function defined_classes_option() {
 
89
  $presets = explode( ';', $this->general_settings['defined_classes'] );
 
 
 
90
  if ( count( $presets ) > 1 ) {
91
  foreach ( $presets as $key => $preset ) {
92
  if ( $preset != '' ) {
93
  ?>
94
- <p><input type="text" name="<?php echo esc_attr( $this->general_key ).'[defined_classes]['.esc_attr( $key ).']'; ?>" value="<?php echo esc_attr( $preset ); ?>" />
95
- <a class="wcssc_remove" href="#"><span class="dashicons dashicons-dismiss"></span></a></p>
 
 
 
96
  <?php
97
  }
98
  }
99
  ?>
100
- <p class="wcssc_defined_classes">
 
101
  <input type="text" name="<?php echo esc_attr( $this->general_key ).'[defined_classes][]'; ?>" value="" />
102
  <a href="#" class="wcssc_copy" rel=".wcssc_defined_classes"><span class="dashicons dashicons-plus-alt"></span></a>
103
  <a class="wcssc_remove" href="#"><span class="dashicons dashicons-dismiss"></span></a>
@@ -105,79 +113,96 @@ class WCSSC_Settings {
105
  <?php
106
  } else {
107
  ?>
108
- <p class="wcssc_defined_classes"><input type="text" name="<?php echo esc_attr( $this->general_key ).'[defined_classes][]'; ?>" value="<?php echo esc_attr( $this->general_settings['defined_classes'] ); ?>" />
109
- <a href="#" class="wcssc_copy" rel=".wcssc_defined_classes"><span class="dashicons dashicons-plus-alt"></span></a>
110
- <a class="wcssc_remove" href="#"><span class="dashicons dashicons-dismiss"></span></a></p>
 
 
 
111
  <?php
112
  }
 
 
 
113
  }
114
 
115
- function register_importexport_settings() {
116
- $this->plugin_tabs['importexport'] = esc_attr__( 'Import/Export', 'widget-css-classes' );
117
-
118
- if ( isset( $_GET['wcssc_message'] ) ) {
119
- switch ( $_GET['wcssc_message'] ) {
120
- case 1:
121
- $wcssc_message = esc_attr__( 'Settings Imported', 'widget-css-classes' );
122
- break;
123
- case 2:
124
- $wcssc_message = esc_attr__( 'Invalid Settings File', 'widget-css-classes' );
125
- break;
126
- case 3:
127
- $wcssc_message = esc_attr__( 'No Settings File Selected', 'widget-css-classes' );
128
- break;
129
- default:
130
- $wcssc_message = '';
131
- break;
 
 
 
 
 
 
 
 
132
  }
133
- }
134
 
135
- if ( isset( $wcssc_message ) && $wcssc_message != '' ) {
136
- echo '<div class="updated"><p>'.esc_html( $wcssc_message ).'</p></div>';
137
- }
138
 
139
- // export settings
140
- if ( isset( $_GET['widget-css-classes-settings-export'] ) ) {
141
- header( "Content-Disposition: attachment; filename=widget-css-classes-settings.txt" );
142
- header( 'Content-Type: text/plain; charset=utf-8' );
143
- $general = get_option( 'WCSSC_options' );
144
-
145
- echo "[START=WCSSC SETTINGS]\n";
146
- foreach ( $general as $id => $text )
147
- echo "$id\t".json_encode( $text )."\n";
148
- echo "[STOP=WCSSC SETTINGS]";
149
- exit;
150
- }
 
151
 
152
- // import settings
153
- if ( isset( $_POST['widget-css-classes-settings-import'] ) ) {
154
- $wcssc_message = '';
155
- if ( $_FILES['widget-css-classes-settings-import-file']['tmp_name'] ) {
156
- $import = explode( "\n", file_get_contents( $_FILES['widget-css-classes-settings-import-file']['tmp_name'] ) );
157
- if ( array_shift( $import ) == "[START=WCSSC SETTINGS]" && array_pop( $import ) == "[STOP=WCSSC SETTINGS]" ) {
158
- foreach ( $import as $import_option ) {
159
- list( $key, $value ) = explode( "\t", $import_option );
160
- $options[$key] = json_decode( sanitize_text_field( $value ) );
161
- if ( $options['dropdown'] ) { // Update for 1.3.0
162
- $options['defined_classes'] = $options['dropdown'];
163
- unset( $options['dropdown'] );
 
 
164
  }
 
 
 
 
165
  }
166
- update_option( 'WCSSC_options', $options );
167
- $wcssc_message = 1;
168
  } else {
169
- $wcssc_message = 2;
170
  }
171
- } else {
172
- $wcssc_message = 3;
 
173
  }
174
 
175
- wp_redirect( admin_url( '/options-general.php?page=widget-css-classes-settings&tab=importexport&wcssc_message='.esc_attr( $wcssc_message ) ) );
176
- exit;
177
  }
178
  }
179
 
180
- function validate_input( $input ) {
181
  $output = array();
182
 
183
  foreach ( $input as $key => $value ) {
@@ -198,7 +223,7 @@ class WCSSC_Settings {
198
  return $output;
199
  }
200
 
201
- function add_admin_menus() {
202
  add_options_page( esc_attr__( 'Widget CSS Classes', 'widget-css-classes' ), esc_attr__( 'Widget CSS Classes', 'widget-css-classes' ), 'manage_options', 'widget-css-classes-settings', array( $this, 'plugin_options_page' ) );
203
  }
204
 
@@ -208,7 +233,7 @@ class WCSSC_Settings {
208
  * settings key. Uses the plugin_options_tabs method
209
  * to render the tabs.
210
  */
211
- function plugin_options_page() {
212
  $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $this->general_key;
213
  ?>
214
  <div class="wrap">
@@ -231,7 +256,7 @@ class WCSSC_Settings {
231
  * them one by one. Provides the heading for the
232
  * plugin_options_page method.
233
  */
234
- function plugin_options_tabs() {
235
  $current_tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $this->general_key;
236
 
237
  echo '<h1 class="nav-tab-wrapper">';
@@ -242,7 +267,7 @@ class WCSSC_Settings {
242
  echo '</h1>';
243
  }
244
 
245
- function importexport_fields() {
246
  ?>
247
  <h3><?php esc_html_e( 'Import/Export Settings', 'widget-css-classes' ); ?></h3>
248
 
21
  private $plugin_tabs = array();
22
  private $general_settings = array();
23
 
24
+ public function __construct() {
25
  add_action( 'admin_init', array( $this, 'load_settings' ) );
26
  add_action( 'admin_init', array( $this, 'register_general_settings' ) );
27
  add_action( 'admin_init', array( $this, 'register_importexport_settings' ) );
28
  add_action( 'admin_menu', array( $this, 'add_admin_menus' ) );
29
  }
30
 
31
+ public function load_settings() {
32
  $this->general_settings = get_option( $this->general_key );
33
  }
34
 
35
+ public function section_general_desc() {
36
  }
37
 
38
+ public function register_general_settings() {
39
  $this->plugin_tabs[$this->general_key] = esc_attr__( 'Widget CSS Classes Settings', 'widget-css-classes' );
40
 
41
  register_setting( $this->general_key, $this->general_key, array( $this, 'validate_input' ) );
49
  do_action( 'widget_css_classes_settings' );
50
  }
51
 
52
+ public function show_number_option() { ?>
53
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_number]'; ?>" value="1" <?php checked( $this->general_settings['show_number'], 1 ); ?> /> <?php esc_attr_e( 'Yes', 'widget-css-classes' ); ?>&nbsp;&nbsp;
54
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_number]'; ?>" value="0" <?php checked( $this->general_settings['show_number'], 0 ); ?> /> <?php esc_attr_e( 'No', 'widget-css-classes' ); ?>
55
  <?php
56
  }
57
 
58
+ public function show_location_option() {
59
  ?>
60
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_location]'; ?>" value="1" <?php checked( $this->general_settings['show_location'], 1 ); ?> /> <?php esc_attr_e( 'Yes', 'widget-css-classes' ); ?>&nbsp;&nbsp;
61
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_location]'; ?>" value="0" <?php checked( $this->general_settings['show_location'], 0 ); ?> /> <?php esc_attr_e( 'No', 'widget-css-classes' ); ?>
62
  <?php
63
  }
64
 
65
+ public function show_evenodd_option() {
66
  ?>
67
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_evenodd]'; ?>" value="1" <?php checked( $this->general_settings['show_evenodd'], 1 ); ?> /> <?php esc_attr_e( 'Yes', 'widget-css-classes' ); ?>&nbsp;&nbsp;
68
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_evenodd]'; ?>" value="0" <?php checked( $this->general_settings['show_evenodd'], 0 ); ?> /> <?php esc_attr_e( 'No', 'widget-css-classes' ); ?>
69
  <?php
70
  }
71
 
72
+ public function show_id_option() {
73
  ?>
74
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_id]'; ?>" value="1" <?php checked( $this->general_settings['show_id'], 1 ); ?> /> <?php esc_attr_e( 'Yes', 'widget-css-classes' ); ?>&nbsp;&nbsp;
75
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[show_id]'; ?>" value="0" <?php checked( $this->general_settings['show_id'], 0 ); ?> /> <?php esc_attr_e( 'No', 'widget-css-classes' ); ?>
76
  <?php
77
  }
78
 
79
+ public function type_option() {
80
  ?>
81
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[type]'; ?>" value="1" <?php checked( $this->general_settings['type'], 1 ); ?> /> <?php esc_attr_e( 'Text', 'widget-css-classes' ); ?>&nbsp;&nbsp;
82
  <input type="radio" name="<?php echo esc_attr( $this->general_key ).'[type]'; ?>" value="2" <?php checked( $this->general_settings['type'], 2 ); ?> /> <?php esc_attr_e( 'Predefined', 'widget-css-classes' ); ?>&nbsp;&nbsp;
85
  <?php
86
  }
87
 
88
+ public function defined_classes_option() {
89
+ wp_enqueue_script( 'jquery-ui-sortable' );
90
  $presets = explode( ';', $this->general_settings['defined_classes'] );
91
+ ?>
92
+ <div class="wcssc_sortable">
93
+ <?php
94
  if ( count( $presets ) > 1 ) {
95
  foreach ( $presets as $key => $preset ) {
96
  if ( $preset != '' ) {
97
  ?>
98
+ <p class="wcssc_defined_classes">
99
+ <a class="wcssc_sort" href="#"><span class="dashicons dashicons-sort"></span></a>
100
+ <input type="text" name="<?php echo esc_attr( $this->general_key ).'[defined_classes]['.esc_attr( $key ).']'; ?>" value="<?php echo esc_attr( $preset ); ?>" />
101
+ <a class="wcssc_remove" href="#"><span class="dashicons dashicons-dismiss"></span></a>
102
+ </p>
103
  <?php
104
  }
105
  }
106
  ?>
107
+ <p class="wcssc_defined_classes wcssc_sort_fixed">
108
+ <a class="wcssc_sort" href="#"><span class="dashicons dashicons-sort"></span></a>
109
  <input type="text" name="<?php echo esc_attr( $this->general_key ).'[defined_classes][]'; ?>" value="" />
110
  <a href="#" class="wcssc_copy" rel=".wcssc_defined_classes"><span class="dashicons dashicons-plus-alt"></span></a>
111
  <a class="wcssc_remove" href="#"><span class="dashicons dashicons-dismiss"></span></a>
113
  <?php
114
  } else {
115
  ?>
116
+ <p class="wcssc_defined_classes wcssc_sort_fixed">
117
+ <a class="wcssc_sort" href="#"><span class="dashicons dashicons-sort"></span></a>
118
+ <input type="text" name="<?php echo esc_attr( $this->general_key ).'[defined_classes][]'; ?>" value="<?php echo esc_attr( $this->general_settings['defined_classes'] ); ?>" />
119
+ <a href="#" class="wcssc_copy" rel=".wcssc_defined_classes"><span class="dashicons dashicons-plus-alt"></span></a>
120
+ <a class="wcssc_remove" href="#"><span class="dashicons dashicons-dismiss"></span></a>
121
+ </p>
122
  <?php
123
  }
124
+ ?>
125
+ </div>
126
+ <?php
127
  }
128
 
129
+ public function register_importexport_settings() {
130
+
131
+ if ( current_user_can('manage_options' ) ) {
132
+
133
+ $this->plugin_tabs['importexport'] = esc_attr__( 'Import/Export', 'widget-css-classes' );
134
+
135
+ if ( isset( $_GET['wcssc_message'] ) ) {
136
+ switch ( $_GET['wcssc_message'] ) {
137
+ case 1:
138
+ $wcssc_message_class = 'updated';
139
+ $wcssc_message = esc_attr__( 'Settings Imported', 'widget-css-classes' );
140
+ break;
141
+ case 2:
142
+ $wcssc_message_class = 'error';
143
+ $wcssc_message = esc_attr__( 'Invalid Settings File', 'widget-css-classes' );
144
+ break;
145
+ case 3:
146
+ $wcssc_message_class = 'error';
147
+ $wcssc_message = esc_attr__( 'No Settings File Selected', 'widget-css-classes' );
148
+ break;
149
+ default:
150
+ $wcssc_message_class = '';
151
+ $wcssc_message = '';
152
+ break;
153
+ }
154
  }
 
155
 
156
+ if ( isset( $wcssc_message ) && $wcssc_message != '' ) {
157
+ echo '<div class=" ' . $wcssc_message_class . ' "><p>' . esc_html( $wcssc_message ) . '</p></div>';
158
+ }
159
 
160
+ // export settings
161
+ if ( isset( $_GET['widget-css-classes-settings-export'] ) ) {
162
+ header( "Content-Disposition: attachment; filename=widget-css-classes-settings.txt" );
163
+ header( 'Content-Type: text/plain; charset=utf-8' );
164
+ $general = get_option( 'WCSSC_options' );
165
+
166
+ echo "[START=WCSSC SETTINGS]\n";
167
+ foreach ( $general as $id => $text ) {
168
+ echo "$id\t" . json_encode( $text ) . "\n";
169
+ }
170
+ echo "[STOP=WCSSC SETTINGS]";
171
+ exit;
172
+ }
173
 
174
+ // import settings
175
+ if ( isset( $_POST['widget-css-classes-settings-import'] ) ) {
176
+ $wcssc_message = '';
177
+ if ( $_FILES['widget-css-classes-settings-import-file']['tmp_name'] ) {
178
+ $import = explode( "\n",
179
+ file_get_contents( $_FILES['widget-css-classes-settings-import-file']['tmp_name'] ) );
180
+ if ( array_shift( $import ) == "[START=WCSSC SETTINGS]" && array_pop( $import ) == "[STOP=WCSSC SETTINGS]" ) {
181
+ foreach ( $import as $import_option ) {
182
+ list( $key, $value ) = explode( "\t", $import_option );
183
+ $options[ $key ] = json_decode( sanitize_text_field( $value ) );
184
+ if ( $options['dropdown'] ) { // Update for 1.3.0
185
+ $options['defined_classes'] = $options['dropdown'];
186
+ unset( $options['dropdown'] );
187
+ }
188
  }
189
+ update_option( 'WCSSC_options', $options );
190
+ $wcssc_message = 1;
191
+ } else {
192
+ $wcssc_message = 2;
193
  }
 
 
194
  } else {
195
+ $wcssc_message = 3;
196
  }
197
+
198
+ wp_redirect( admin_url( '/options-general.php?page=widget-css-classes-settings&tab=importexport&wcssc_message=' . esc_attr( $wcssc_message ) ) );
199
+ exit;
200
  }
201
 
 
 
202
  }
203
  }
204
 
205
+ public function validate_input( $input ) {
206
  $output = array();
207
 
208
  foreach ( $input as $key => $value ) {
223
  return $output;
224
  }
225
 
226
+ public function add_admin_menus() {
227
  add_options_page( esc_attr__( 'Widget CSS Classes', 'widget-css-classes' ), esc_attr__( 'Widget CSS Classes', 'widget-css-classes' ), 'manage_options', 'widget-css-classes-settings', array( $this, 'plugin_options_page' ) );
228
  }
229
 
233
  * settings key. Uses the plugin_options_tabs method
234
  * to render the tabs.
235
  */
236
+ public function plugin_options_page() {
237
  $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $this->general_key;
238
  ?>
239
  <div class="wrap">
256
  * them one by one. Provides the heading for the
257
  * plugin_options_page method.
258
  */
259
+ public function plugin_options_tabs() {
260
  $current_tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $this->general_key;
261
 
262
  echo '<h1 class="nav-tab-wrapper">';
267
  echo '</h1>';
268
  }
269
 
270
+ public function importexport_fields() {
271
  ?>
272
  <h3><?php esc_html_e( 'Import/Export Settings', 'widget-css-classes' ); ?></h3>
273
 
includes/widget-css-classes.class.php CHANGED
@@ -31,7 +31,7 @@ class WCSSC {
31
 
32
  if ( WCSSC_Loader::$settings['show_id'] == 1 || WCSSC_Loader::$settings['type'] > 0 ) {
33
  //$fields .= "<div class='wcssc' style='border: 1px solid #ddd; padding: 5px; background: #fafafa; margin: 1em 0; line-height: 1.5;'>\n";
34
- //$fields .= "<div class='wcssc'>\n";
35
 
36
  // show id field
37
  if ( WCSSC_Loader::$settings['show_id'] == 1 ) {
@@ -83,7 +83,7 @@ class WCSSC {
83
  $fields .= "\t</ul></p>\n";
84
  }
85
 
86
- //$fields .= "</div>\n";
87
  }
88
 
89
  do_action( 'widget_css_classes_form', $fields, $instance );
@@ -101,12 +101,14 @@ class WCSSC {
101
  * @since 1.0
102
  */
103
  public static function update_widget( $instance, $new_instance ) {
 
 
104
  $instance['classes'] = $new_instance['classes'];
105
  $instance['classes-defined'] = $new_instance['classes-defined'];
106
  if (WCSSC_Loader::$settings['show_id'] == 1) {
107
  $instance['ids'] = $new_instance['ids'];
108
  }
109
- if ( is_array( $instance['classes-defined'] ) ) {
110
  // Merge predefined classes with input classes
111
  $text_classes = explode( ' ', $instance['classes'] );
112
  foreach ( $instance['classes-defined'] as $key => $value ) {
@@ -133,7 +135,11 @@ class WCSSC {
133
  public static function add_widget_classes( $params ) {
134
 
135
  global $wp_registered_widgets, $widget_number;
136
-
 
 
 
 
137
  $arr_registered_widgets = wp_get_sidebars_widgets(); // Get an array of ALL registered widgets
138
  $this_id = $params[0]['id']; // Get the id for the current sidebar we're processing
139
  $widget_id = $params[0]['widget_id'];
31
 
32
  if ( WCSSC_Loader::$settings['show_id'] == 1 || WCSSC_Loader::$settings['type'] > 0 ) {
33
  //$fields .= "<div class='wcssc' style='border: 1px solid #ddd; padding: 5px; background: #fafafa; margin: 1em 0; line-height: 1.5;'>\n";
34
+ $fields .= "<div class='wcssc'>\n";
35
 
36
  // show id field
37
  if ( WCSSC_Loader::$settings['show_id'] == 1 ) {
83
  $fields .= "\t</ul></p>\n";
84
  }
85
 
86
+ $fields .= "</div>\n";
87
  }
88
 
89
  do_action( 'widget_css_classes_form', $fields, $instance );
101
  * @since 1.0
102
  */
103
  public static function update_widget( $instance, $new_instance ) {
104
+ if ( !isset( $new_instance['classes'] ) ) $new_instance['classes'] = null;
105
+ if ( !isset( $new_instance['classes-defined'] ) ) $new_instance['classes-defined'] = array();
106
  $instance['classes'] = $new_instance['classes'];
107
  $instance['classes-defined'] = $new_instance['classes-defined'];
108
  if (WCSSC_Loader::$settings['show_id'] == 1) {
109
  $instance['ids'] = $new_instance['ids'];
110
  }
111
+ if ( ! empty( $instance['classes-defined'] ) && is_array( $instance['classes-defined'] ) ) {
112
  // Merge predefined classes with input classes
113
  $text_classes = explode( ' ', $instance['classes'] );
114
  foreach ( $instance['classes-defined'] as $key => $value ) {
135
  public static function add_widget_classes( $params ) {
136
 
137
  global $wp_registered_widgets, $widget_number;
138
+
139
+ if ( ! isset( $params[0] ) ) {
140
+ return $params;
141
+ }
142
+
143
  $arr_registered_widgets = wp_get_sidebars_widgets(); // Get an array of ALL registered widgets
144
  $this_id = $params[0]['id']; // Get the id for the current sidebar we're processing
145
  $widget_id = $params[0]['widget_id'];
js/widget-css-classes.js CHANGED
@@ -9,4 +9,12 @@ jQuery( document ).ready( function ( $ ) {
9
  } );
10
  } );
11
 
 
 
 
 
 
 
 
 
12
  } );
9
  } );
10
  } );
11
 
12
+ if ( $.isFunction( $.fn.sortable ) ) {
13
+ $('.wcssc_sortable .wcssc_sort').show();
14
+ $('.wcssc_sortable').sortable({
15
+ items: 'p:not(.wcssc_sort_fixed)',
16
+ placeholder: 'wcssc_drop_placeholder'
17
+ }).disableSelection();
18
+ }
19
+
20
  } );
readme.txt CHANGED
@@ -7,8 +7,8 @@ Tags: widgets, classes, css, widget classes, widget css
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
  Requires at least: 3.3
10
- Tested up to: 4.7
11
- Stable tag: 1.3.0
12
 
13
  Add custom classes and ids plus first, last, even, odd, and numbered classes to your widgets.
14
 
@@ -94,6 +94,11 @@ Visit [the plugin website](http://cleverness.org/plugins/widget-css-classes/) an
94
 
95
  == Changelog ==
96
 
 
 
 
 
 
97
  = 1.3.0 =
98
  * Feature: Change dropdown to checkboxes for multiple class selection
99
  * Feature: Option to use both predefined and text input classes
@@ -158,6 +163,9 @@ Visit [the plugin website](http://cleverness.org/plugins/widget-css-classes/) an
158
 
159
  == Upgrade Notice ==
160
 
 
 
 
161
  = 1.2.7 =
162
  Bug fix
163
 
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
  Requires at least: 3.3
10
+ Tested up to: 4.8
11
+ Stable tag: 1.4.0
12
 
13
  Add custom classes and ids plus first, last, even, odd, and numbered classes to your widgets.
14
 
94
 
95
  == Changelog ==
96
 
97
+ = 1.4.0 =
98
+ * Feature: Sort Pre-defined classes (thanks Jory Hogeveen)
99
+ * Security: Prevent unauthenticated import of settings
100
+ * Fix: Notice message when classes is empty (thanks Jory Hogeveen)
101
+
102
  = 1.3.0 =
103
  * Feature: Change dropdown to checkboxes for multiple class selection
104
  * Feature: Option to use both predefined and text input classes
163
 
164
  == Upgrade Notice ==
165
 
166
+ = 1.4 =
167
+ New feature, bug fix, security fix
168
+
169
  = 1.2.7 =
170
  Bug fix
171
 
widget-css-classes.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Plugin Name: Widget CSS Classes
4
- Version: 1.3.0
5
  Description: Add custom, first, last, even, odd, and numbered classes to your widgets.
6
  Author: C.M. Kendrick
7
  Author URI: http://cleverness.org
1
  <?php
2
  /*
3
  Plugin Name: Widget CSS Classes
4
+ Version: 1.4.0
5
  Description: Add custom, first, last, even, odd, and numbered classes to your widgets.
6
  Author: C.M. Kendrick
7
  Author URI: http://cleverness.org