Admin Columns - Version 1.3.1

Version Description

  • bug fix which solved a fatal error in some cases
Download this release

Release Info

Developer codepress
Plugin Icon 128x128 Admin Columns
Version 1.3.1
Comparing to
See all releases

Code changes from version 1.0 to 1.3.1

assets/css/admin-column.css CHANGED
@@ -1,11 +1,22 @@
1
- #general-cpac-settings {}
2
#cpac .postbox {
3
margin: 0 10px 10px 0;
4
}
5
#cpac .cpac-menu {
6
clear: both;
7
float: left;
8
- width: 100%;
9
}
10
#icon-codepress-admin-columns {
11
background: transparent url('../images/icon.png') no-repeat 0 0;
@@ -39,13 +50,19 @@
39
}
40
#general-cpac-settings .cpac-option-list {
41
overflow: hidden;
42
- width: 360px;
43
}
44
#general-cpac-settings .cpac-reorder-msg {
45
- background: transparent url('../images/reorder.png') no-repeat scroll 0 0;
46
margin-left: 5px;
47
height: 23px;
48
- width: 171px;
49
clear: both;
50
}
51
#general-cpac-settings .cpac-option-list li {
@@ -63,19 +80,9 @@
63
background-image: -webkit-linear-gradient(top, #f9f9f9, #ececec);
64
background-image: linear-gradient(top, #f9f9f9, #ececec);
65
border-radius: 3px 3px 3px 3px;
66
- border: 1px solid #DFDFDF;
67
margin-top: 1px;
68
}
69
- #general-cpac-settings .cpac-option-list li.active {
70
- background-color: #d8d8d8;
71
- background-image: -ms-linear-gradient(top, #f0f0f0, #d8d8d8);
72
- background-image: -moz-linear-gradient(top, #f0f0f0, #d8d8d8);
73
- background-image: -o-linear-gradient(top, #f0f0f0, #d8d8d8);
74
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0f0), to(#d8d8d8));
75
- background-image: -webkit-linear-gradient(top, #f0f0f0, #d8d8d8);
76
- background-image: linear-gradient(top, #f0f0f0, #d8d8d8);
77
- border-color: #c5c5c5;
78
- }
79
#general-cpac-settings .cpac-option-list li .cpac-sort-handle {
80
background: transparent url('../images/sort.png') no-repeat 5px 5px;
81
width: 20px;
@@ -109,7 +116,8 @@
109
display: block;
110
margin-right: 30px;
111
overflow: hidden;
112
- height: 15px;
113
}
114
#general-cpac-settings .cpac-option-list li .cpac-type-options input {
115
margin-top: 6px;
@@ -130,6 +138,11 @@
130
text-indent: -999em;
131
overflow: hidden;
132
}
133
#general-cpac-settings .cpac-option-list li div.cpac-meta-title span {
134
display: inline-block;
135
margin: 5px 5px 0 0;
@@ -187,6 +200,25 @@
187
color: #832525;
188
text-shadow: none;
189
}
190
#restore-cpac-settings .inside {
191
padding: 10px;
192
}
@@ -206,4 +238,24 @@
206
}
207
#restore-cpac-settings .inside .description {
208
color: #832525;
209
}
1
+ #cpac {
2
+ overflow: hidden;
3
+ }
4
#cpac .postbox {
5
margin: 0 10px 10px 0;
6
}
7
#cpac .cpac-menu {
8
clear: both;
9
float: left;
10
+ width: 90%;
11
+ }
12
+ #cpac .cpac-col-left {
13
+ width: 70%;
14
+ }
15
+ #cpac .cpac-col-right {
16
+ width: 20%;
17
+ }
18
+ #cpac .cpac-col-right .inside {
19
+ padding: 0 10px;
20
}
21
#icon-codepress-admin-columns {
22
background: transparent url('../images/icon.png') no-repeat 0 0;
50
}
51
#general-cpac-settings .cpac-option-list {
52
overflow: hidden;
53
+ width: 360px;
54
+ margin-bottom: 5px;
55
}
56
#general-cpac-settings .cpac-reorder-msg {
57
+ background: transparent url('../images/reorder_arrow.png') no-repeat scroll 0 0;
58
margin-left: 5px;
59
height: 23px;
60
+ line-height: 25px;
61
+ padding-left: 25px;
62
+ color: #727272;
63
+ font-size: 12px;
64
+ font-family: 'Trebuchet MS', Arial, Verdana;
65
+ font-style: italic;
66
clear: both;
67
}
68
#general-cpac-settings .cpac-option-list li {
80
background-image: -webkit-linear-gradient(top, #f9f9f9, #ececec);
81
background-image: linear-gradient(top, #f9f9f9, #ececec);
82
border-radius: 3px 3px 3px 3px;
83
+ border: 1px solid #cbcbcb;
84
margin-top: 1px;
85
}
86
#general-cpac-settings .cpac-option-list li .cpac-sort-handle {
87
background: transparent url('../images/sort.png') no-repeat 5px 5px;
88
width: 20px;
116
display: block;
117
margin-right: 30px;
118
overflow: hidden;
119
+ height: 17px;
120
+ line-height: 17px;
121
}
122
#general-cpac-settings .cpac-option-list li .cpac-type-options input {
123
margin-top: 6px;
138
text-indent: -999em;
139
overflow: hidden;
140
}
141
+ #general-cpac-settings .cpac-option-list li.opened a.cpac-action {}
142
+ #general-cpac-settings .cpac-option-list li.active a.cpac-action {
143
+ background-position: 50% -66px;
144
+ }
145
+ #general-cpac-settings .cpac-option-list li.active.opened a.cpac-action {}
146
#general-cpac-settings .cpac-option-list li div.cpac-meta-title span {
147
display: inline-block;
148
margin: 5px 5px 0 0;
200
color: #832525;
201
text-shadow: none;
202
}
203
+ #general-cpac-settings .cpac-option-list li.active {
204
+ background-color: #c7c7c7;
205
+ background-image: -ms-linear-gradient(top, #e9e9e9, #c7c7c7);
206
+ background-image: -moz-linear-gradient(top, #e9e9e9, #c7c7c7);
207
+ background-image: -o-linear-gradient(top, #e9e9e9, #c7c7c7);
208
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#e9e9e9), to(#c7c7c7));
209
+ background-image: -webkit-linear-gradient(top, #e9e9e9, #c7c7c7);
210
+ background-image: linear-gradient(top, #e9e9e9, #c7c7c7);
211
+ border-color: #aeaeae;
212
+ }
213
+ #general-cpac-settings .cpac-option-list li.active .cpac-sort-handle {
214
+ background-position: 5px -19px;
215
+ }
216
+ #general-cpac-settings .cpac-option-list li.active div.cpac-meta-title {
217
+ color: #151515;
218
+ }
219
+ #general-cpac-settings .cpac-option-list li.active div.cpac-meta-title span {
220
+ color: #5c5c5c
221
+ }
222
#restore-cpac-settings .inside {
223
padding: 10px;
224
}
238
}
239
#restore-cpac-settings .inside .description {
240
color: #832525;
241
+ }
242
+ #likethisplugin-cpac-settings {
243
+ padding: 0;
244
+ }
245
+ #likethisplugin-cpac-settings ul {
246
+ margin-left: 20px;
247
+ }
248
+ #likethisplugin-cpac-settings li {
249
+ list-style: square;
250
+ line-height: 16px;
251
+ }
252
+ #likethisplugin-cpac-settings li a {
253
+ text-decoration: none;
254
+ }
255
+ #likethisplugin-cpac-settings li.donate_link a {
256
+ color: green;
257
+ text-decoration: underline;
258
+ }
259
+ #likethisplugin-cpac-settings li.donate_link a:hover {
260
+ color: darkgreen;
261
}
assets/css/column.css CHANGED
@@ -1,4 +1,11 @@
1
.column-column-attachment img {
2
padding-right: 5px;
3
padding-bottom: 4px;
4
}
1
.column-column-attachment img {
2
padding-right: 5px;
3
padding-bottom: 4px;
4
+ }
5
+
6
+ .cpac-divider {
7
+ display: inline-block;
8
+ width: 14px;
9
+ height: 12px;
10
+ background: transparent url(../images/square.png) no-repeat 50% 7px;
11
}
assets/images/arrows.png CHANGED
Binary file
assets/images/reorder_arrow.png ADDED
Binary file
assets/images/sort.png CHANGED
Binary file
assets/images/square.png ADDED
Binary file
assets/js/admin-column.js CHANGED
@@ -2,7 +2,11 @@
2
* fires when the dom is ready
3
*
4
*/
5
- jQuery(document).ready(function(){
6
cpac_sortable();
7
cpac_checked();
8
cpac_box_events();
@@ -15,7 +19,7 @@ jQuery(document).ready(function(){
15
*
16
*/
17
function cpac_sortable()
18
- {
19
jQuery('ul.cpac-option-list').sortable({
20
handle: 'div.cpac-sort-handle',
21
placeholder: 'cpac-placeholder',
@@ -38,7 +42,7 @@ function cpac_checked()
38
// toggle on
39
if ( value != 'on') {
40
li.addClass('active');
41
- state.attr('value', 'on');
42
}
43
44
// toggle off
@@ -59,7 +63,10 @@ function cpac_box_events()
59
// fold in/out
60
jQuery('#cpac .cpac-option-list .cpac-action').unbind('click').click(function(e){
61
e.preventDefault();
62
- jQuery(this).closest('li').find('.cpac-type-inside').slideToggle(150);
63
});
64
65
// remove custom field box
@@ -72,8 +79,7 @@ function cpac_box_events()
72
height: 0
73
}, 350, function() {
74
el.remove();
75
- });
76
-
77
});
78
}
79
2
* fires when the dom is ready
3
*
4
*/
5
+ jQuery(document).ready(function()
6
+ {
7
+ if (jQuery('#cpac').length == 0)
8
+ return false;
9
+
10
cpac_sortable();
11
cpac_checked();
12
cpac_box_events();
19
*
20
*/
21
function cpac_sortable()
22
+ {
23
jQuery('ul.cpac-option-list').sortable({
24
handle: 'div.cpac-sort-handle',
25
placeholder: 'cpac-placeholder',
42
// toggle on
43
if ( value != 'on') {
44
li.addClass('active');
45
+ state.attr('value', 'on');
46
}
47
48
// toggle off
63
// fold in/out
64
jQuery('#cpac .cpac-option-list .cpac-action').unbind('click').click(function(e){
65
e.preventDefault();
66
+ var li = jQuery(this).closest('li');
67
+ li.find('.cpac-type-inside').slideToggle(150, function() {
68
+ li.toggleClass('opened');
69
+ });
70
});
71
72
// remove custom field box
79
height: 0
80
}, 350, function() {
81
el.remove();
82
+ });
83
});
84
}
85
classes/sortable.php ADDED
@@ -0,0 +1,597 @@
1
+ <?php
2
+
3
+ /**
4
+ * Coderess Sortable Columns Class
5
+ *
6
+ * @since 1.3
7
+ *
8
+ */
9
+ class Codepress_Sortable_Columns extends Codepress_Admin_Columns
10
+ {
11
+ private $post_types,
12
+ $is_unlocked,
13
+ $show_all_results;
14
+
15
+ /**
16
+ * Constructor
17
+ *
18
+ * @since 1.0
19
+ */
20
+ function __construct()
21
+ {
22
+ add_action( 'wp_loaded', array( &$this, 'init') );
23
+ }
24
+
25
+ /**
26
+ * Initialize
27
+ *
28
+ * @since 1.0
29
+ */
30
+ public function init()
31
+ {
32
+ // vars
33
+ $this->is_unlocked = $this->is_unlocked('sortable');
34
+ $this->post_types = $this->get_post_types();
35
+ $this->show_all_results = false;
36
+
37
+ add_action( 'admin_init', array( &$this, 'register_sortable_columns' ) );
38
+
39
+ // handle requests for sorting columns
40
+ add_filter( 'request', array( &$this, 'handle_requests_orderby_column'), 1 );
41
+ add_action( 'pre_user_query', array( &$this, 'handle_requests_orderby_users_column'), 1 );
42
+ }
43
+
44
+ /**
45
+ * Register sortable columns
46
+ *
47
+ * @since 1.0
48
+ */
49
+ function register_sortable_columns()
50
+ {
51
+ /** Posts */
52
+ foreach ( $this->post_types as $post_type )
53
+ add_filter( "manage_edit-{$post_type}_sortable_columns", array(&$this, 'callback_add_sortable_posts_column'));
54
+
55
+ if ( ! $this->is_unlocked )
56
+ return false;
57
+
58
+ /** Users */
59
+ add_filter( "manage_users_sortable_columns", array(&$this, 'callback_add_sortable_users_column'));
60
+
61
+ /** Media */
62
+ add_filter( "manage_upload_sortable_columns", array(&$this, 'callback_add_sortable_media_column'));
63
+ }
64
+
65
+ /**
66
+ * Callback add Posts sortable column
67
+ *
68
+ * @since 1.0
69
+ */
70
+ public function callback_add_sortable_posts_column($columns)
71
+ {
72
+ global $post_type;
73
+
74
+ return $this->add_managed_sortable_columns($post_type, $columns);
75
+ }
76
+
77
+ /**
78
+ * Callback add Users sortable column
79
+ *
80
+ * @since 1.1
81
+ */
82
+ public function callback_add_sortable_users_column($columns)
83
+ {
84
+ return $this->add_managed_sortable_columns('wp-users', $columns);
85
+ }
86
+
87
+ /**
88
+ * Callback add Media sortable column
89
+ *
90
+ * @since 1.3
91
+ */
92
+ public function callback_add_sortable_media_column($columns)
93
+ {
94
+ return $this->add_managed_sortable_columns('wp-media', $columns);
95
+ }
96
+
97
+ /**
98
+ * Add managed sortable columns by Type
99
+ *
100
+ * @since 1.1
101
+ */
102
+ private function add_managed_sortable_columns( $type = 'post', $columns )
103
+ {
104
+ $display_columns = $this->get_merged_columns($type);
105
+
106
+ if ( ! $display_columns )
107
+ return $columns;
108
+
109
+ foreach ( $display_columns as $id => $vars ) {
110
+ if ( isset($vars['options']['sortorder']) && $vars['options']['sortorder'] == 'on' ){
111
+
112
+ // register format
113
+ $columns[$id] = $this->sanitize_string($vars['label']);
114
+ }
115
+ }
116
+ return $columns;
117
+ }
118
+
119
+ /**
120
+ * Admin requests for orderby column
121
+ *
122
+ * @since 1.0
123
+ */
124
+ public function handle_requests_orderby_column( $vars )
125
+ {
126
+ if ( ! isset( $vars['orderby'] ) )
127
+ return $vars;
128
+
129
+ /** Users */
130
+ // You would expect to see get_orderby_users_vars(), but sorting for
131
+ // users is handled through a different filter. Not 'request', but 'pre_user_query'.
132
+ // See handle_requests_orderby_users_column().
133
+
134
+ /** Media */
135
+ elseif ( $this->request_uri_is_media() )
136
+ $vars = $this->get_orderby_media_vars($vars);
137
+
138
+ /** Posts */
139
+ elseif ( !empty($vars['post_type']) )
140
+ $vars = $this->get_orderby_posts_vars($vars);
141
+
142
+ return $vars;
143
+ }
144
+
145
+ /**
146
+ * Orderby Users column
147
+ *
148
+ * @since 1.3
149
+ */
150
+ public function handle_requests_orderby_users_column($user_query)
151
+ {
152
+ // query vars
153
+ $vars = $user_query->query_vars;
154
+
155
+ // Column
156
+ $column = $this->get_orderby_type( $vars['orderby'], 'wp-users' );
157
+
158
+ if ( empty($column) )
159
+ return $vars;
160
+
161
+ // var
162
+ $cusers = array();
163
+ switch( key($column) ) :
164
+
165
+ case 'column-user_id':
166
+ $user_query->query_vars['orderby'] = 'ID';
167
+ break;
168
+
169
+ case 'column-user_registered':
170
+ $user_query->query_vars['orderby'] = 'registered';
171
+ break;
172
+
173
+ case 'column-nickname':
174
+ $user_query->query_vars['orderby'] = 'nickname';
175
+ break;
176
+
177
+ case 'column-first_name':
178
+ foreach ( $this->get_users_data() as $u )
179
+ if ($u->first_name || $this->show_all_results )
180
+ $cusers[$u->ID] = $this->prepare_sort_string_value($u->first_name);
181
+ $this->set_users_query_vars( &$user_query, $cusers, SORT_REGULAR );
182
+ break;
183
+
184
+ case 'column-last_name':
185
+ foreach ( $this->get_users_data() as $u )
186
+ if ($u->last_name || $this->show_all_results )
187
+ $cusers[$u->ID] = $this->prepare_sort_string_value($u->last_name);
188
+ $this->set_users_query_vars( &$user_query, $cusers, SORT_REGULAR );
189
+ break;
190
+
191
+ case 'column-user_url':
192
+ foreach ( $this->get_users_data() as $u )
193
+ if ($u->user_url || $this->show_all_results )
194
+ $cusers[$u->ID] = $this->prepare_sort_string_value($u->user_url);
195
+ $this->set_users_query_vars( &$user_query, $cusers, SORT_REGULAR );
196
+ break;
197
+
198
+ case 'column-user_description':
199
+ foreach ( $this->get_users_data() as $u )
200
+ if ($u->user_description || $this->show_all_results )
201
+ $cusers[$u->ID] = $this->prepare_sort_string_value($u->user_description);
202
+ $this->set_users_query_vars( &$user_query, $cusers, SORT_REGULAR );
203
+ break;
204
+
205
+ endswitch;
206
+
207
+ return $user_query;
208
+ }
209
+
210
+ /**
211
+ * Set sorting vars in User Query Object
212
+ *
213
+ * @since 1.3
214
+ */
215
+ private function set_users_query_vars(&$user_query, $sortusers, $sort_flags = SORT_REGULAR )
216
+ {
217
+ global $wpdb;
218
+
219
+ // vars
220
+ $vars = $user_query->query_vars;
221
+
222
+ // sorting
223
+ if ( $vars['order'] == 'ASC' )
224
+ asort($sortusers, $sort_flags);
225
+ else
226
+ arsort($sortusers, $sort_flags);
227
+
228
+ // alter orderby SQL
229
+ if ( ! empty ( $sortusers ) ) {
230
+ $ids = implode(',', array_keys($sortusers));
231
+ $user_query->query_where .= " AND {$wpdb->prefix}users.ID IN ({$ids})";
232
+ $user_query->query_orderby = "ORDER BY FIELD ({$wpdb->prefix}users.ID,{$ids})";
233
+ }
234
+
235
+ // cleanup the vars we dont need
236
+ $vars['order'] = '';
237
+ $vars['orderby'] = '';
238
+
239
+ $user_query->query_vars = $vars;
240
+ }
241
+
242
+ /**
243
+ * Orderby Media column
244
+ *
245
+ * @since 1.3
246
+ */
247
+ private function get_orderby_media_vars($vars)
248
+ {
249
+ // Column
250
+ $column = $this->get_orderby_type( $vars['orderby'], 'wp-media' );
251
+
252
+ if ( empty($column) )
253
+ return $vars;
254
+
255
+ // var
256
+ $cposts = array();
257
+ switch( key($column) ) :
258
+
259
+ case 'column-mediaid' :
260
+ $vars['orderby'] = 'ID';
261
+ break;
262
+
263
+ case 'column-width' :
264
+ foreach ( (array) $this->get_any_posts_by_posttype('attachment') as $p ) {
265
+ $meta = wp_get_attachment_metadata($p->ID);
266
+ $width = !empty($meta['width']) ? $meta['width'] : 0;
267
+ if ( $width || $this->show_all_results )
268
+ $cposts[$p->ID] = $width;
269
+ }
270
+ $this->set_vars_post__in( &$vars, $cposts, SORT_NUMERIC );
271
+ break;
272
+
273
+ case 'column-height' :
274
+ foreach ( (array) $this->get_any_posts_by_posttype('attachment') as $p ) {
275
+ $meta = wp_get_attachment_metadata($p->ID);
276
+ $height = !empty($meta['height']) ? $meta['height'] : 0;
277
+ if ( $height || $this->show_all_results )
278
+ $cposts[$p->ID] = $height;
279
+ }
280
+ $this->set_vars_post__in( &$vars, $cposts, SORT_NUMERIC );
281
+ break;
282
+
283
+ case 'column-dimensions' :
284
+ foreach ( (array) $this->get_any_posts_by_posttype('attachment') as $p ) {
285
+ $meta = wp_get_attachment_metadata($p->ID);
286
+ $height = !empty($meta['height']) ? $meta['height'] : 0;
287
+ $width = !empty($meta['width']) ? $meta['width'] : 0;
288
+ $surface = $height*$width;
289
+
290
+ if ( $surface || $this->show_all_results )
291
+ $cposts[$p->ID] = $surface;
292
+ }
293
+ $this->set_vars_post__in( &$vars, $cposts, SORT_NUMERIC );
294
+ break;
295
+
296
+ case 'column-caption' :
297
+ foreach ( (array) $this->get_any_posts_by_posttype('attachment') as $p )
298
+ if ( $p->post_excerpt || $this->show_all_results )
299
+ $cposts[$p->ID] = $this->prepare_sort_string_value($p->post_excerpt);
300
+ $this->set_vars_post__in( &$vars, $cposts, SORT_STRING);
301
+ break;
302
+
303
+ case 'column-description' :
304
+ foreach ( (array) $this->get_any_posts_by_posttype('attachment') as $p )
305
+ if ( $p->post_content || $this->show_all_results )
306
+ $cposts[$p->ID] = $this->prepare_sort_string_value( $p->post_content );
307
+ $this->set_vars_post__in( &$vars, $cposts, SORT_STRING);
308
+ break;
309
+
310
+ case 'column-mime_type' :
311
+ foreach ( (array) $this->get_any_posts_by_posttype('attachment') as $p )
312
+ if ( $p->post_mime_type || $this->show_all_results )
313
+ $cposts[$p->ID] = $this->prepare_sort_string_value( $p->post_mime_type );
314
+ $this->set_vars_post__in( &$vars, $cposts, SORT_STRING);
315
+ break;
316
+
317
+ case 'column-file_name' :
318
+ foreach ( (array) $this->get_any_posts_by_posttype('attachment') as $p ) {
319
+ $meta = get_post_meta($p->ID, '_wp_attached_file', true);
320
+ $file = !empty($meta) ? basename($meta) : '';
321
+ if ( $file || $this->show_all_results )
322
+ $cposts[$p->ID] = $file;
323
+ }
324
+ $this->set_vars_post__in( &$vars, $cposts, SORT_STRING);
325
+ break;
326
+
327
+ case 'column-alternate_text' :
328
+ foreach ( (array) $this->get_any_posts_by_posttype('attachment') as $p ) {
329
+ $alt = get_post_meta($p->ID, '_wp_attachment_image_alt', true);
330
+ if ( $alt || $this->show_all_results ) {
331
+ $cposts[$p->ID] = $this->prepare_sort_string_value( $alt );
332
+ }
333
+ }
334
+ $this->set_vars_post__in( &$vars, $cposts, SORT_STRING);
335
+ break;
336
+
337
+ endswitch;
338
+
339
+ return $vars;
340
+ }
341
+
342
+ /**
343
+ * Orderby Posts column
344
+ *
345
+ * @since 1.3
346
+ */
347
+ private function get_orderby_posts_vars($vars)
348
+ {
349
+ $post_type = $vars['post_type'];
350
+
351
+ // Column
352
+ $column = $this->get_orderby_type( $vars['orderby'], $post_type );
353
+
354
+ if ( empty($column) )
355
+ return $vars;
356
+
357
+ // id
358
+ $id = key($column);
359
+
360
+ // type
361
+ $type = $id;
362
+
363
+ // custom fields
364
+ if ( $this->is_column_meta($type) )
365
+ $type = 'column-post-meta';
366
+
367
+ // attachments
368
+ if ( $type == 'column-attachment-count' )
369
+ $type = 'column-attachment';
370
+
371
+ // var
372
+ $cposts = array();
373
+ switch( $type ) :
374
+
375
+ case 'column-postid' :
376
+ $vars['orderby'] = 'ID';
377
+ break;
378
+
379
+ case 'column-order' :
380
+ $vars['orderby'] = 'menu_order';
381
+ break;
382
+
383
+ case 'column-post-meta' :
384
+ $field = $column[$id]['field'];
385
+
386
+ // orderby type
387
+ $field_type = 'meta_value';
388
+ if ( $column[$id]['field_type'] == 'numeric' || $column[$id]['field_type'] == 'library_id' )
389
+ $field_type = 'meta_value_num';
390
+
391
+ $vars = array_merge($vars, array(
392
+ 'meta_key' => $field,
393
+ 'orderby' => $field_type
394
+ ));
395
+ break;
396
+
397
+ case 'column-excerpt' :
398
+ foreach ( (array) $this->get_any_posts_by_posttype($post_type) as $p ) {
399
+
400
+ // add excerpt to the post ids
401
+ $cposts[$p->ID] = $this->prepare_sort_string_value($p->post_content);
402
+ }
403
+ // we will add the sorted post ids to vars['post__in'] and remove unused vars
404
+ $this->set_vars_post__in( &$vars, $cposts, SORT_STRING );
405
+ break;
406
+
407
+ case 'column-word-count' :
408
+ foreach ( (array) $this->get_any_posts_by_posttype($post_type) as $p )
409
+ $cposts[$p->ID] = str_word_count( $this->strip_trim( $p->post_content ) );
410
+ $this->set_vars_post__in( &$vars, $cposts, SORT_NUMERIC );
411
+ break;
412
+
413
+ case 'column-page-template' :
414
+ $templates = get_page_templates();
415
+ foreach ( (array) $this->get_any_posts_by_posttype($post_type) as $p ) {
416
+ $page_template = get_post_meta($p->ID, '_wp_page_template', true);
417
+ $cposts[$p->ID] = array_search($page_template, $templates);
418
+ }
419
+ $this->set_vars_post__in( &$vars, $cposts );
420
+ break;
421
+
422
+ case 'column-post_formats' :
423
+ foreach ( (array) $this->get_any_posts_by_posttype($post_type) as $p ) {
424
+ $cposts[$p->ID] = get_post_format($p->ID);
425
+ }
426
+ $this->set_vars_post__in( &$vars, $cposts );
427
+ break;
428
+
429
+ case 'column-attachment' :
430
+ foreach ( (array) $this->get_any_posts_by_posttype($post_type) as $p )
431
+ $cposts[$p->ID] = count( $this->get_attachment_ids($p->ID) );
432
+ $this->set_vars_post__in( &$vars, $cposts, SORT_NUMERIC );
433
+ break;
434
+
435
+
436
+ case 'column-page-slug' :
437
+ foreach ( (array) $this->get_any_posts_by_posttype($post_type) as $p )
438
+ $cposts[$p->ID] = $p->post_name;
439
+ $this->set_vars_post__in( &$vars, $cposts );
440
+ break;
441
+
442
+ endswitch;
443
+
444
+ return $vars;
445
+ }
446
+
447
+ /**
448
+ * Set post__in for use in WP_Query
449
+ *
450
+ * This will order the ID's asc or desc and set the appropriate filters.
451
+ *
452
+ * @since 1.2.1
453
+ */
454
+ private function set_vars_post__in( &$vars, $sortposts, $sort_flags = SORT_REGULAR )
455
+ {
456
+ // sort post ids by value
457
+ if ( $vars['order'] == 'asc' )
458
+ asort($sortposts, $sort_flags);
459
+ else
460
+ arsort($sortposts, $sort_flags);
461
+
462
+ // this will make sure WP_Query will use the order of the ids that we have just set in 'post__in'
463
+ add_filter('posts_orderby', array( &$this, 'filter_orderby_post__in'), 10, 2 );
464
+
465
+ // cleanup the vars we dont need
466
+ $vars['order'] = '';
467
+ $vars['orderby'] = '';
468
+
469
+ // add the sorted post ids to the query with the use of post__in
470
+ $vars['post__in'] = array_keys($sortposts);
471
+ }
472
+
473
+ /**
474
+ * Get orderby type
475
+ *
476
+ * @since 1.1
477
+ */
478
+ private function get_orderby_type($orderby, $type)
479
+ {
480
+ $db_columns = $this->get_stored_columns($type);
481
+
482
+ if ( $db_columns ) {
483
+ foreach ( $db_columns as $id => $vars ) {
484
+
485
+ // check which custom column was clicked
486
+ if ( isset( $vars['label'] ) && $orderby == $this->sanitize_string( $vars['label'] ) ) {
487
+ $column[$id] = $vars;
488
+ return $column;
489
+ }
490
+ }
491
+ }
492
+ return false;
493
+ }
494
+
495
+ /**
496
+ * Maintain order of ids that are set in the post__in var.
497
+ *
498
+ * This will force the returned posts to use the order of the ID's that
499
+ * have been set in post__in. Without this the ID's will be set in numeric order.
500
+ * See the WP_Query object for more info about the use of post__in.
501
+ *
502
+ * @since 1.2.1
503
+ */
504
+ public function filter_orderby_post__in($orderby, $wp)
505
+ {
506
+ global $wpdb;
507
+
508
+ // we need the query vars
509
+ $vars = $wp->query_vars;
510
+ if ( ! empty ( $vars['post__in'] ) ) {
511
+ // now we can get the ids
512
+ $ids = implode(',', $vars['post__in']);
513
+
514
+ // by adding FIELD to the SQL query we are forcing the order of the ID's
515
+ return "FIELD ({$wpdb->prefix}posts.ID,{$ids})";
516
+ }
517
+ }
518
+
519
+ /**
520
+ * Get any posts by post_type
521
+ *
522
+ * @since 1.2.1
523
+ */
524
+ private function get_any_posts_by_posttype( $post_type )
525
+ {
526
+ $allposts = get_posts(array(
527
+ 'numberposts' => -1,
528
+ 'post_status' => 'any',
529
+ 'post_type' => $post_type
530
+ ));
531
+ return $allposts;
532
+ }
533
+ /**
534
+ * Request URI is Media
535
+ *
536
+ * @since 1.3
537
+ */
538
+ private function request_uri_is_media()
539
+ {
540
+ if (strpos( $_SERVER['REQUEST_URI'], '/upload.php' ) !== false )
541
+ return true;
542
+
543
+ return false;
544
+ }
545
+
546
+ /**
547
+ * Request URI is Users
548
+ *
549
+ * @since 1.3
550
+ */
551
+ private function request_uri_is_users()
552
+ {
553
+ if (strpos( $_SERVER['REQUEST_URI'], '/users.php' ) !== false )
554
+ return true;
555
+
556
+ return false;
557
+ }
558
+
559
+ /**
560
+ * Prepare the value for being by sorting
561
+ *
562
+ * @since 1.3
563
+ */
564
+ private function prepare_sort_string_value($string)
565
+ {
566
+ // remove tags and only get the first 20 chars and force lowercase.
567
+ $string = strtolower( substr( $this->strip_trim($string),0 ,20 ) );
568
+
569
+ return $string;
570
+ }
571
+
572
+ /**
573
+ * Get users data
574
+ *
575
+ * @since 1.3
576
+ */
577
+ function get_users_data()
578
+ {
579
+ $userdatas = array();
580
+ $wp_users = get_users( array(
581
+ 'blog_id' => $GLOBALS['blog_id'],
582
+ ));
583
+ foreach ( $wp_users as $u ) {
584
+ $userdatas[$u->ID] = get_userdata($u->ID);
585
+ }
586
+ return $userdatas;
587
+ }
588
+ }
589
+
590
+ /**
591
+ * Init Class
592
+ *
593
+ * @since 1.3
594
+ */
595
+ new Codepress_Sortable_Columns();
596
+
597
+ ?>
codepress-admin-columns.php CHANGED
@@ -1,9 +1,9 @@
1
<?php
2
/*
3
Plugin Name: Codepress Admin Columns
4
- Version: 1.0.1
5
- Description: This plugin makes it easy to customize Admin Columns for your Posts, Pages and Custom Post Type Screens.
6
- Author: Tobias Schutter
7
Author URI: http://www.codepress.nl
8
Plugin URI: http://www.codepress.nl/plugins/codepress-admin-columns/
9
Text Domain: codepress-admin-columns
@@ -26,17 +26,17 @@ along with this program; if not, write to the Free Software
26
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27
*/
28
29
- define( 'CPAC_VERSION', '1.0.1' );
30
31
/**
32
- * Init Class
33
*
34
- * @since 1.0
35
*/
36
- $cpac = new Codepress_Admin_Columns;
37
38
/**
39
- * Advanced Admin Columns Class
40
*
41
* @since 1.0
42
*
@@ -44,55 +44,67 @@ $cpac = new Codepress_Admin_Columns;
44
class Codepress_Admin_Columns
45
{
46
private $post_types,
47
- $options,
48
- $options_default,
49
$slug,
50
- $textdomain;
51
52
/**
53
- * Construct
54
*
55
* @since 1.0
56
*/
57
function __construct()
58
{
59
- add_action( 'wp_loaded', array( &$this, 'init') );
60
}
61
62
/**
63
- * Initilize plugin.
64
*
65
* Loading sequence is determined and intialized.
66
*
67
* @since 1.0
68
*/
69
- function init()
70
- {
71
// vars
72
$this->post_types = $this->get_post_types();
73
- $this->handle_requests();
74
- $this->options = get_option('cpac_options');
75
- $this->options_default = get_option('cpac_options_default');
76
-
77
- // slug
78
$this->slug = 'codepress-admin-columns';
79
$this->textdomain = 'codepress-admin-columns';
80
81
// translations
82
load_plugin_textdomain( $this->textdomain, false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
83
84
- // Actions and hooks
85
- add_action( 'admin_menu', array( &$this, 'settings_menu') );
86
add_action( 'admin_init', array( &$this, 'register_settings') );
87
- add_action( 'admin_init', array( &$this, 'register_columns' ) );
88
- add_action( 'admin_enqueue_scripts', array( &$this, 'admin_enqueue_scripts') );
89
- add_action( 'manage_pages_custom_column', array( &$this, 'manage_column_value'), 10, 2 );
90
- add_action( 'manage_posts_custom_column', array( &$this, 'manage_column_value'), 10, 2 );
91
add_action( 'admin_print_styles' , array( &$this, 'column_styles') );
92
- add_filter( 'request', array( &$this, 'handle_requests_orderby_column') );
93
- add_filter( 'plugin_action_links', array( &$this, 'add_settings_link'), 10, 2);
94
- }
95
-
96
/**
97
* Admin Menu.
98
*
@@ -115,9 +127,16 @@ class Codepress_Admin_Columns
115
array( &$this, 'plugin_settings_page')
116
);
117
118
- // css scripts
119
add_action( "admin_print_styles-$page", array( &$this, 'admin_styles') );
120
- }
121
122
/**
123
* Add Settings link to plugin page
@@ -140,187 +159,129 @@ class Codepress_Admin_Columns
140
*/
141
public function register_columns()
142
{
143
- foreach ( $this->post_types as $post_type ) {
144
-
145
// register column per post type
146
- add_filter("manage_edit-{$post_type}_columns", array(&$this, 'callback_set_column'));
147
-
148
- // register column as sortable
149
- add_filter( "manage_edit-{$post_type}_sortable_columns", array(&$this, 'callback_set_sortable_column'));
150
- }
151
}
152
153
/**
154
- * Callback Set Column
155
*
156
* @since 1.0
157
*/
158
- public function callback_set_column($columns)
159
- {
160
global $post_type;
161
- $columns = $this->set_column($columns, $post_type);
162
-
163
- return $columns;
164
}
165
166
/**
167
- * Callback Set Sortable Column
168
*
169
- * @since 1.0
170
*/
171
- public function callback_set_sortable_column($columns)
172
- {
173
- global $post_type;
174
- $columns = $this->set_sortable_filter($columns, $post_type);
175
-
176
- return $columns;
177
}
178
179
/**
180
- * Settings Page Template.
181
*
182
- * This function in conjunction with others usei the WordPress
183
- * Settings API to create a settings page where users can adjust
184
- * the behaviour of this plugin.
185
*
186
- * @since 1.0
187
*/
188
- public function plugin_settings_page()
189
{
190
- // loop through post types
191
- $rows = '';
192
- foreach ( $this->post_types as $post_type ) {
193
-
194
- // post type label
195
- $label = $this->get_singular_name($post_type);
196
-
197
- // id
198
- $id = $this->sanitize_string($post_type);
199
-
200
- // build draggable boxes
201
- $boxes = $this->get_column_options($post_type);
202
-
203
- // class
204
- $class = $this->is_menu_type_current($post_type) ? ' current' : ' hidden';
205
-
206
- $rows .= "
207
- <tr id='cpac-box-{$id}' valign='top' class='cpac-box-row{$class}'>
208
- <th class='cpac_post_type' scope='row'>
209
- {$label}
210
- </th>
211
- <td>
212
- <h3 class='cpac_post_type hidden'>{$label}</h3>
213
- {$boxes}
214
- </td>
215
- </tr>
216
- ";
217
}
218
219
- // Post Type Menu
220
- $menu = $this->get_post_type_menu();
221
222
- ?>
223
- <div id="cpac" class="wrap">
224
- <?php screen_icon($this->slug) ?>
225
- <h2><?php _e('Codepress Admin Columns', $this->textdomain); ?></h2>
226
- <?php echo $menu ?>
227
- <div class="postbox-container" style="width:70%;">
228
- <div class="metabox-holder">
229
- <div class="meta-box-sortables">
230
-
231
- <div id="general-cpac-settings" class="postbox">
232
- <div title="Click to toggle" class="handlediv"><br></div>
233
- <h3 class="hndle">
234
- <span><?php _e('Admin Columns', $this->textdomain ); ?></span>
235
- </h3>
236
- <div class="inside">
237
- <form method="post" action="options.php">
238
-
239
- <?php settings_fields( 'cpac-settings-group' ); ?>
240
-
241
- <table class="form-table">
242
-
243
- <?php echo $rows ?>
244
-
245
- <tr class="bottom" valign="top">
246
- <th scope="row"></th>
247
- <td>
248
- <p class="submit">
249
- <input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
250
- </p>
251
- </td>
252
- </tr>
253
- </table>
254
- </form>
255
- </div>
256
- </div><!-- general-settings -->
257
-
258
- <div id="restore-cpac-settings" class="postbox">
259
- <div title="Click to toggle" class="handlediv"><br></div>
260
- <h3 class="hndle">
261
- <span><?php _e('Restore defaults', $this->textdomain) ?></span>
262
- </h3>
263
- <div class="inside">
264
- <form method="post" action="">
265
- <input type="submit" class="button" name="cpac-restore-defaults" value="<?php _e('Restore default settings', $this->textdomain ) ?>" onclick="return confirm('<?php _e("Warning! ALL saved admin columns data will be deleted. This cannot be undone. \'OK\' to delete, \'Cancel\' to stop", $this->textdomain); ?>');" />
266
- </form>
267
- <p class="description"><?php _e('This will delete all column settings and restore the default settings.', $this->textdomain); ?></p>
268
- </div>
269
- </div><!-- restore-cpac-settings -->
270
-
271
- </div>
272
- </div>
273
- </div><!-- .postbox-container -->
274
-
275
- <div class="postbox-container" style="width:20%;">
276
- <div class="metabox-holder">
277
- <div class="meta-box-sortables">
278
-
279
- <div id="side-cpac-settings" class="postbox">
280
- <div title="Click to toggle" class="handlediv"><br></div>
281
- <h3 class="hndle">
282
- <span><?php _e('Need support?', $this->textdomain) ?></span>
283
- </h3>
284
- <div class="inside">
285
- <p><?php printf(__('If you are having problems with this plugin, please talk about them in the <a href="%s">Support forums</a>.', $this->textdomain), 'http://wordpress.org/tags/codepress-admin-columns' );?></p>
286
- <p><?php printf(__("If you're sure you've found a bug, or have a feature request, please <a href='%s'>submit your feedback</a>.", $this->textdomain), 'http://www.codepress.nl/plugins/codepress-admin-columns#feedback');?></p>
287
- </div>
288
- </div><!-- side-cpac-settings -->
289
-
290
- </div>
291
- </div>
292
- </div><!-- .postbox-container -->
293
294
- </div>
295
- <?php
296
}
297
-
298
/**
299
* Get a list of Column options per post type
300
*
301
* @since 1.0
302
*/
303
- private function get_column_options($post_type)
304
{
305
// merge all columns
306
- $display_columns = $this->get_merged_columns($post_type);
307
308
// define
309
$list = '';
310
311
// loop throught the active columns
312
if ( $display_columns ) {
313
- foreach ( $display_columns as $key => $values ) {
314
315
// add items to the list
316
- $list .= $this->get_box($post_type, $key, $values);
317
318
}
319
}
320
321
// custom field button
322
$button_add_column = '';
323
- if ( $this->get_postmeta_by_posttype($post_type) )
324
$button_add_column = "<a href='javacript:;' class='cpac-add-customfield-column button'>+ " . __('Add Custom Field Column') . "</a>";
325
326
return "
@@ -329,7 +290,7 @@ class Codepress_Admin_Columns
329
{$list}
330
</ul>
331
{$button_add_column}
332
- <div class='cpac-reorder-msg'></div>
333
</div>
334
";
335
}
@@ -339,60 +300,97 @@ class Codepress_Admin_Columns
339
*
340
* @since 1.0
341
*/
342
- private function get_merged_columns($post_type)
343
{
344
//get saved database columns
345
- $db_columns = $this->get_db_columns($post_type);
346
-
347
- // get wp default columns
348
- $wp_default_columns = $this->get_wp_default_columns($post_type);
349
350
- // get custom columns
351
- $wp_custom_columns = $this->get_custom_columns($post_type);
352
353
- // merge wp default and custom columns
354
$default_columns = wp_parse_args($wp_custom_columns, $wp_default_columns);
355
-
356
// loop throught the active columns
357
if ( $db_columns ) {
358
- foreach ( $db_columns as $key => $values ) {
359
360
// get column meta options from custom columns
361
- if ( strpos($key, 'column-meta-') !== false )
362
- $db_columns[$key]['options'] = $wp_custom_columns['column-meta-1']['options'];
363
364
// add static options
365
- else
366
- $db_columns[$key]['options'] = $default_columns[$key]['options'];
367
368
- unset($default_columns[$key]);
369
}
370
}
371
372
// merge all
373
- $display_columns = wp_parse_args($db_columns, $default_columns);
374
-
375
return $display_columns;
376
}
377
-
378
-
379
/**
380
* Get checkbox
381
*
382
* @since 1.0
383
*/
384
- private function get_box($post_type, $key, $values)
385
{
386
$classes = array();
387
388
// set state
389
$state = isset($values['state']) ? $values['state'] : '';
390
391
- // set sortorder
392
- $sortorder = isset($values['sortorder']) && $values['sortorder'] == 'on' ? 'on' : '';
393
-
394
// class
395
- $classes[] = "cpac-box-{$key}";
396
if ( $state )
397
$classes[] = 'active';
398
if ( ! empty($values['options']['class']) )
@@ -400,11 +398,17 @@ class Codepress_Admin_Columns
400
$class = implode(' ', $classes);
401
402
// more box options
403
- $more_options = $this->get_additional_box_options($post_type, $key, $values);
404
$action = "<a class='cpac-action' href='#open'>open</a>";
405
406
// hide box options
407
- if ( ! empty($values['options']['hide_options']) ) {
408
$action = $more_options = '';
409
}
410
@@ -414,17 +418,16 @@ class Codepress_Admin_Columns
414
<div class='cpac-type-options'>
415
416
<div class='cpac-checkbox'></div>
417
- <input type='hidden' class='cpac-state' name='cpac_options[columns][{$post_type}][{$key}][state]' value='{$state}'/>
418
- <input type='hidden' name='cpac_options[columns][{$post_type}][{$key}][sortorder]' value='{$sortorder}'/>
419
<label class='main-label'>{$values['label']}</label>
420
</div>
421
<div class='cpac-meta-title'>
422
{$action}
423
- <span>{$values['options']['type_label']}</span>
424
</div>
425
<div class='cpac-type-inside'>
426
- <label for='cpac_options[columns][{$post_type}][{$key}][label]'>Label: </label>
427
- <input type='text' name='cpac_options[columns][{$post_type}][{$key}][label]' value='{$values['label']}' class='text'/>
428
<br/>
429
{$more_options}
430
</div>
@@ -439,13 +442,13 @@ class Codepress_Admin_Columns
439
*
440
* @since 1.0
441
*/
442
- private function get_additional_box_options($post_type, $key, $values)
443
{
444
$fields = '';
445
446
// Custom Fields
447
- if ( strpos($key, 'column-meta-') !== false )
448
- $fields .= $this->get_box_options_customfields($post_type, $key, $values);
449
450
return $fields;
451
}
@@ -455,10 +458,10 @@ class Codepress_Admin_Columns
455
*
456
* @since 1.0
457
*/
458
- private function get_box_options_customfields($post_type, $key, $values)
459
{
460
// get post meta fields
461
- $fields = $this->get_postmeta_by_posttype($post_type);
462
463
if ( empty($fields) )
464
return false;
@@ -485,10 +488,15 @@ class Codepress_Admin_Columns
485
'library_id' => __('Media Library Icon', $this->textdomain),
486
'excerpt' => __('Excerpt'),
487
'array' => __('Multiple Values', $this->textdomain),
488
);
489
490
- // add filters
491
- $fieldtypes = apply_filters('cpac-field-types', $fieldtypes );
492
foreach ( $fieldtypes as $fkey => $fieldtype ) {
493
$fieldtype_options .= sprintf
494
(
@@ -499,12 +507,16 @@ class Codepress_Admin_Columns
499
);
500
}
501
502
if ( empty($field_options) )
503
return false;
504
505
// add remove button
506
$remove = '<p class="remove-description description">'.__('This field can not be removed', $this->textdomain).'</p>';
507
- if ( $key != 'column-meta-1') {
508
$remove = "
509
<p>
510
<a href='javascript:;' class='cpac-delete-custom-field-box'>".__('Remove')."</a>
@@ -513,12 +525,18 @@ class Codepress_Admin_Columns
513
}
514
515
$inside = "
516
- <label for='cpac_options[columns][{$post_type}][{$key}][field]'>Custom Field: </label>
517
- <select name='cpac_options[columns][{$post_type}][{$key}][field]'>{$field_options}</select>
518
<br/>
519
- <label for='cpac_options[columns][{$post_type}][{$key}][field_type]'>Field Type: </label>
520
- <select name='cpac_options[columns][{$post_type}][{$key}][field_type]'>{$fieldtype_options}</select>
521
<br/>
522
{$remove}
523
";
524
@@ -526,17 +544,27 @@ class Codepress_Admin_Columns
526
}
527
528
/**
529
- * Get post meta fields by post type
530
*
531
* @since 1.0
532
*/
533
- private function get_postmeta_by_posttype($post_type)
534
{
535
global $wpdb;
536
- // get mata fields
537
- $sql = 'SELECT DISTINCT meta_key FROM '.$wpdb->postmeta.' pm JOIN '.$wpdb->posts.' p ON pm.post_id = p.ID WHERE p.post_type = "' . mysql_real_escape_string($post_type) . '" ORDER BY 1';
538
- $fields = $wpdb->get_results($sql, ARRAY_N);
539
540
// postmeta
541
if ( $fields ) {
542
$meta_fields = array();
@@ -546,9 +574,8 @@ class Codepress_Admin_Columns
546
$meta_fields[] = $field[0];
547
}
548
}
549
-
550
return $meta_fields;
551
- }
552
553
return false;
554
}
@@ -558,19 +585,31 @@ class Codepress_Admin_Columns
558
*
559
* @since 1.0
560
*/
561
- public function admin_enqueue_scripts()
562
{
563
- wp_enqueue_script( 'dashboard' );
564
- wp_enqueue_script( 'jquery-ui-sortable' );
565
- wp_enqueue_script( 'cpac-admin', $this->plugin_url('/assets/js/admin-column.js'), array('jquery', 'jquery-ui-sortable'), CPAC_VERSION );
566
}
567
-
568
/**
569
* Get post types
570
*
571
* @since 1.0
572
*/
573
- private function get_post_types()
574
{
575
$post_types = get_post_types(array(
576
'_builtin' => false
@@ -609,7 +648,7 @@ class Codepress_Admin_Columns
609
public function register_settings()
610
{
611
// If we have no options in the database, let's add them now.
612
- if ( false === $this->options )
613
add_option( 'cpac_options', array(&$this, 'get_default_plugin_options') );
614
615
register_setting( 'cpac-settings-group', 'cpac_options', array(&$this, 'options_callback') );
@@ -630,7 +669,7 @@ class Codepress_Admin_Columns
630
}
631
632
/**
633
- * Save geocode coordinates of focus location.
634
*
635
* @since 1.0
636
*/
@@ -644,23 +683,43 @@ class Codepress_Admin_Columns
644
*
645
* @since 1.0
646
*/
647
- private function handle_requests()
648
{
649
// settings updated
650
- if ( ! empty($_REQUEST['settings-updated']) ) {
651
-
652
- // stores the default columns that are set by WP or set in the theme.
653
- $wp_default_columns = array();
654
- foreach ( $this->post_types as $post_type ) {
655
- $wp_default_columns[$post_type] = $this->get_wp_default_columns($post_type);
656
- }
657
- update_option( 'cpac_options_default', $wp_default_columns );
658
- }
659
660
// restore defaults
661
- if ( ! empty($_REQUEST['cpac-restore-defaults']) ) {
662
$this->restore_defaults();
663
- }
664
}
665
666
/**
@@ -679,15 +738,16 @@ class Codepress_Admin_Columns
679
*
680
* @since 1.0
681
*/
682
- private function get_post_excerpt($post_id, $charlength = 100)
683
{
684
- global $post;
685
$save_post = $post;
686
$post = get_post($post_id);
687
$excerpt = get_the_excerpt();
688
$post = $save_post;
689
690
- $output = $this->get_shortened_string($excerpt, $charlength );
691
692
return $output;
693
}
@@ -697,22 +757,12 @@ class Codepress_Admin_Columns
697
*
698
* @since 1.0
699
*/
700
- private function get_shortened_string($string = '', $charlength = 100)
701
{
702
if (!$string)
703
return false;
704
705
- $output = '';
706
- if ( strlen($string) > $charlength ) {
707
- $subex = substr($string,0,$charlength-5);
708
- $exwords = explode(" ",$subex);
709
- $excut = -(strlen($exwords[count($exwords)-1]));
710
- $output .= $excut < 0 ? substr($subex,0,$excut) : $subex;
711
- $output .= "[...]";
712
- } else {
713
- $output = $string;
714
- }
715
- return $output;
716
}
717
718
/**
@@ -720,20 +770,20 @@ class Codepress_Admin_Columns
720
*
721
* @since 1.0
722
*/
723
- public function manage_column_value($key, $post_id)
724
{
725
- $type = $key;
726
727
// Check for taxonomies, such as column-taxonomy-[taxname]
728
if ( strpos($type, 'column-taxonomy-') !== false )
729
$type = 'column-taxonomy';
730
731
// Check for custom fields, such as column-meta-[customfieldname]
732
- if ( strpos($type, 'column-meta-') !== false )
733
- $type = 'column-meta';
734
735
// Hook
736
- do_action('cpac-manage-column', $type, $key, $post_id);
737
738
// Switch Types
739
$result = '';
@@ -776,10 +826,9 @@ class Codepress_Admin_Columns
776
case "column-page-template" :
777
// file name
778
$page_template = get_post_meta($post_id, '_wp_page_template', true);
779
- // all page templates
780
- $templates = get_page_templates();
781
- // template name
782
- $result = array_search($page_template, $templates);
783
break;
784
785
// Slug
@@ -787,9 +836,14 @@ class Codepress_Admin_Columns
787
$result = get_post($post_id)->post_name;
788
break;
789
790
// Taxonomy
791
case "column-taxonomy" :
792
- $tax = str_replace('column-taxonomy-','',$key);
793
$tags = get_the_terms($post_id, $tax);
794
$tarr = array();
795
if ( $tax == 'post_format' && empty($tags) ) {
@@ -804,17 +858,22 @@ class Codepress_Admin_Columns
804
break;
805
806
// Custom Field
807
- case "column-meta" :
808
- $result = $this->get_column_value_custom_field($post_id, $key);
809
break;
810
811
// Attachment
812
case "column-attachment" :
813
$result = $this->get_column_value_attachments($post_id);
814
break;
815
816
default :
817
- $result = get_post_meta( $post_id, $key, true );
818
819
endswitch;
820
@@ -823,46 +882,224 @@ class Codepress_Admin_Columns
823
824
echo $result;
825
}
826
-
827
/**
828
- * Get column value of post attachments
829
*
830
- * @since 1.0
831
*/
832
- private function get_column_value_attachments($post_id)
833
{
834
$result = '';
835
- $attachments = get_posts(array(
836
- 'post_type' => 'attachment',
837
- 'numberposts' => -1,
838
- 'post_status' => null,
839
- 'post_parent' => $post_id
840
- ));
841
- if ( $attachments ) {
842
- foreach ( $attachments as $attach ) {
843
- $result .= wp_get_attachment_image( $attach->ID, array(80,80), true );
844
- }
845
- }
846
return $result;
847
}
848
849
/**
850
- * Get column value of Custom Field
851
*
852
* @since 1.0
853
*/
854
- private function get_column_value_custom_field($post_id, $key)
855
{
856
- $columns = $this->get_db_columns( get_post_type($post_id) );
857
- $field = isset($columns[$key]['field']) ? $columns[$key]['field'] : '';
858
- $fieldtype = isset($columns[$key]['field_type']) ? $columns[$key]['field_type'] : '';
859
860
// Get meta field value
861
- $meta = get_post_meta($post_id, $field, true);
862
863
// multiple meta values
864
if ( ( $fieldtype == 'array' && is_array($meta) ) || is_array($meta) ) {
865
- $meta = get_post_meta($post_id, $field);
866
$meta = $this->recursive_implode(', ', $meta);
867
}
868
@@ -886,11 +1123,115 @@ class Codepress_Admin_Columns
886
887
// Excerpt
888
case "excerpt" :
889
- $meta = $this->get_shortened_string($meta, 100);
890
break;
891
892
endswitch;
893
894
return $meta;
895
}
896
@@ -909,55 +1250,30 @@ class Codepress_Admin_Columns
909
$retVal[] = $r_pieces;
910
}
911
}
912
- return implode( $glue, $retVal );
913
- }
914
-
915
- /**
916
- * Set Columns for Registering
917
- *
918
- * @since 1.0
919
- */
920
- private function set_column($columns, $post_type)
921
- {
922
- $db_columns = $this->get_db_columns($post_type);
923
924
- if ( !$db_columns )
925
- return $columns;
926
-
927
- // set already loaded columns by plugins
928
- $set_columns = $this->filter_preset_columns($columns, $post_type);
929
-
930
- // loop through columns
931
- foreach ( $db_columns as $key => $values ) {
932
-
933
- // is active
934
- if ( isset($values['state']) && $values['state'] == 'on' ){
935
-
936
- // register format
937
- $set_columns[$key] = $values['label'];
938
- }
939
- }
940
- return $set_columns;
941
- }
942
943
/**
944
* Set columns. These columns apply either for every post or set by a plugin.
945
*
946
* @since 1.0
947
*/
948
- private function filter_preset_columns($columns, $post_type = 'post')
949
{
950
- $options = $this->options_default;
951
952
if ( !$options )
953
return $columns;
954
955
// we use the wp default columns for filtering...
956
- $db_columns = $options[$post_type];
957
-
958
// ... the ones that are set by plugins, theme functions and such.
959
- $dif_columns = array_diff(array_keys($columns), array_keys($db_columns));
960
-
961
// we add those to the columns
962
$pre_columns = array();
963
if ( $dif_columns ) {
@@ -967,44 +1283,30 @@ class Codepress_Admin_Columns
967
}
968
969
return $pre_columns;
970
- }
971
972
/**
973
- * Set sortable columns
974
*
975
* @since 1.0
976
*/
977
- private function set_sortable_filter($columns, $post_type)
978
{
979
- $db_columns = $this->get_db_columns($post_type);
980
-
981
- if ( !$db_columns )
982
- return $columns;
983
984
- // loop through columns
985
- foreach ( $db_columns as $key => $values ) {
986
987
- // is active
988
- if ( isset($values['sortorder']) && $values['sortorder'] == 'on' ){
989
-
990
- // register format
991
- $columns[$key] = $this->sanitize_string($values['label']);
992
- }
993
- }
994
- return $columns;
995
- }
996
-
997
- /**
998
- * Get WP default supported admin columns per post type.
999
- *
1000
- * @since 1.0
1001
- */
1002
- private function get_wp_default_columns($post_type = 'post')
1003
- {
1004
- // load some dependencies
1005
- require_once(ABSPATH . 'wp-admin\includes\template.php');
1006
- require_once(ABSPATH . 'wp-admin\includes\class-wp-list-table.php');
1007
- require_once(ABSPATH . 'wp-admin\includes\class-wp-posts-list-table.php');
1008
1009
// we need to change the current screen
1010
global $current_screen;
@@ -1016,12 +1318,96 @@ class Codepress_Admin_Columns
1016
// ...so we can get its columns
1017
$columns = WP_Posts_List_Table::get_columns();
1018
1019
// we remove the checkbox column as an option...
1020
- unset($columns['cb']);
1021
1022
// change to uniform format
1023
$uniform_columns = array();
1024
- foreach ( $columns as $key => $label ) {
1025
$hide_options = false;
1026
$type_label = $label;
1027
@@ -1030,8 +1416,13 @@ class Codepress_Admin_Columns
1030
$type_label = __('Comments', $this->textdomain);
1031
$hide_options = true;
1032
}
1033
-
1034
- $uniform_colums[$key] = array(
1035
'label' => $label,
1036
'state' => 'on',
1037
'options' => array(
@@ -1041,96 +1432,80 @@ class Codepress_Admin_Columns
1041
)
1042
);
1043
}
1044
-
1045
- // reset current screen
1046
- $current_screen = $org_current_screen;
1047
-
1048
return $uniform_colums;
1049
}
1050
-
1051
/**
1052
- * Add extra columns
1053
*
1054
* @since 1.0
1055
*/
1056
- private function get_custom_columns($post_type)
1057
{
1058
$custom_columns = array();
1059
1060
- // default arguments
1061
- $defaults = array(
1062
- 'label' => '',
1063
- 'sortorder' => '',
1064
- 'state' => '',
1065
-
1066
- // options are static
1067
- 'options' => array(
1068
- 'type_label' => __('Custom', $this->textdomain),
1069
- 'hide_options' => false,
1070
- 'class' => 'cpac-box-custom',
1071
- )
1072
- );
1073
-
1074
// Thumbnail support
1075
if ( post_type_supports($post_type, 'thumbnail') ) {
1076
- $custom_columns['column-featured_image'] = wp_parse_args( array(
1077
'label' => __('Featured Image', $this->textdomain),
1078
'options' => array(
1079
'type_label' => __('Image', $this->textdomain)
1080
)
1081
- ), $defaults);
1082
}
1083
1084
// Excerpt support
1085
if ( post_type_supports($post_type, 'editor') ) {
1086
- $custom_columns['column-excerpt'] = wp_parse_args( array(
1087
'label' => __('Excerpt', $this->textdomain),
1088
'options' => array(
1089
- 'type_label' => __('Excerpt', $this->textdomain)
1090
)
1091
- ), $defaults);
1092
}
1093
1094
// Sticky support
1095
if ( $post_type == 'post' ) {
1096
- $custom_columns['column-sticky'] = wp_parse_args( array(
1097
'label' => __('Sticky', $this->textdomain),
1098
'options' => array(
1099
'type_label' => __('Sticky', $this->textdomain)
1100
)
1101
- ), $defaults);
1102
}
1103
1104
// Order support
1105
if ( post_type_supports($post_type, 'page-attributes') ) {
1106
- $custom_columns['column-order'] = wp_parse_args( array(
1107
- 'label' => __('Page Order', $this->textdomain),
1108
- 'sortorder' => 'on',
1109
'options' => array(
1110
- 'type_label' => __('Order', $this->textdomain)
1111
)
1112
- ), $defaults);
1113
}
1114
1115
// Page Template
1116
if ( $post_type == 'page' ) {
1117
- $custom_columns['column-page-template'] = wp_parse_args( array(
1118
'label' => __('Page Template', $this->textdomain),
1119
- 'sortorder' => 'on',
1120
'options' => array(
1121
- 'type_label' => __('Page Template', $this->textdomain)
1122
)
1123
- ), $defaults);
1124
}
1125
1126
// Post Formats
1127
if ( post_type_supports($post_type, 'post-formats') ) {
1128
- $custom_columns['column-post_formats'] = wp_parse_args( array(
1129
'label' => __('Post Format', $this->textdomain),
1130
'options' => array(
1131
- 'type_label' => __('Post Format', $this->textdomain)
1132
)
1133
- ), $defaults);
1134
}
1135
1136
// Taxonomy support
@@ -1138,57 +1513,299 @@ class Codepress_Admin_Columns
1138
if ( $taxonomies ) {
1139
foreach ( $taxonomies as $tax_slug => $tax ) {
1140
if ( $tax_slug != 'post_tag' && $tax_slug != 'category' && $tax_slug != 'post_format' ) {
1141
- $custom_columns['column-taxonomy-'.$tax->name] = wp_parse_args( array(
1142
'label' => $tax->label,
1143
'options' => array(
1144
'type_label' => __('Taxonomy', $this->textdomain)
1145
)
1146
- ), $defaults);
1147
}
1148
}
1149
}
1150
1151
- // Post ID support
1152
- $custom_columns['column-postid'] = wp_parse_args( array(
1153
- 'label' => 'ID',
1154
- 'sortorder' => 'on',
1155
'options' => array(
1156
- 'type_label' => 'ID',
1157
- )
1158
- ), $defaults);
1159
1160
- // Slug support
1161
- $custom_columns['column-page-slug'] = wp_parse_args( array(
1162
- 'label' => __('Slug', $this->textdomain),
1163
- 'sortorder' => 'on',
1164
'options' => array(
1165
- 'type_label' => __('Slug', $this->textdomain),
1166
- )
1167
- ), $defaults);
1168
1169
- // Attachment support
1170
- $custom_columns['column-attachment'] = wp_parse_args( array(
1171
- 'label' => __('Attachment', $this->textdomain),
1172
- 'sortorder' => 'on',
1173
'options' => array(
1174
- 'type_label' => __('Attachment', $this->textdomain)
1175
)
1176
- ), $defaults);
1177
1178
- // Custom Field support
1179
- if ( $this->get_postmeta_by_posttype($post_type) ) {
1180
- $custom_columns['column-meta-1'] = wp_parse_args( array(
1181
- 'label' => __('Custom Field', $this->textdomain),
1182
- 'field' => '',
1183
- 'field_type' => '',
1184
- 'options' => array(
1185
- 'type_label' => __('Field', $this->textdomain),
1186
- 'class' => 'cpac-box-metafield'
1187
- )
1188
- ), $defaults);
1189
- }
1190
1191
- return apply_filters('cpac-custom-columns', $custom_columns);
1192
}
1193
1194
/**
@@ -1196,14 +1813,14 @@ class Codepress_Admin_Columns
1196
*
1197
* @since 1.0
1198
*/
1199
- private function get_db_columns($post_type)
1200
{
1201
// get plugin options
1202
- $options = $this->options;
1203
1204
// get saved columns
1205
- if ( isset($options['columns'][$post_type]) )
1206
- return $options['columns'][$post_type];
1207
1208
return false;
1209
}
@@ -1213,7 +1830,7 @@ class Codepress_Admin_Columns
1213
*
1214
* @since 1.0
1215
*/
1216
- private function get_post_type_menu()
1217
{
1218
// set
1219
$menu = '';
@@ -1225,16 +1842,16 @@ class Codepress_Admin_Columns
1225
$referer = $_REQUEST['cpac_type'];
1226
1227
// loop
1228
- foreach ( $this->post_types as $post_type ) {
1229
- $label = $this->get_singular_name($post_type);
1230
- $clean_label = $this->sanitize_string($post_type);
1231
1232
// divider
1233
$divider = $count++ == 1 ? '' : ' | ';
1234
1235
// current
1236
$current = '';
1237
- if ( $this->is_menu_type_current($post_type) )
1238
$current = ' class="current"';
1239
1240
// menu list
@@ -1258,9 +1875,7 @@ class Codepress_Admin_Columns
1258
* @since 1.0
1259
*/
1260
private function is_menu_type_current( $post_type )
1261
- {
1262
- //print_r($post_type);
1263
-
1264
// referer
1265
$referer = '';
1266
if ( ! empty($_REQUEST['cpac_type']) )
@@ -1292,39 +1907,25 @@ class Codepress_Admin_Columns
1292
*
1293
* @since 1.0
1294
*/
1295
- private function get_singular_name( $post_type )
1296
{
1297
- $posttype_obj = get_post_type_object($post_type);
1298
- $label = $posttype_obj->labels->singular_name;
1299
return $label;
1300
}
1301
1302
- /**
1303
- * Admin requests for orderby column
1304
- *
1305
- * @since 1.0
1306
- */
1307
- public function handle_requests_orderby_column( $vars )
1308
- {
1309
- if ( isset( $vars['orderby'] ) ) {
1310
- // get saved columns
1311
- $db_columns = $this->get_db_columns($vars['post_type']);
1312
-
1313
- // Column Page Order
1314
- if ( isset($db_columns['column-order']) ) {
1315
-
1316
- // sanitizing label
1317
- $label = $this->sanitize_string($db_columns['column-order']['label']);
1318
-
1319
- // Check for Page Order
1320
- if ( $vars['orderby'] == $label ) {
1321
- $vars['orderby'] = 'menu_order';
1322
- }
1323
- }
1324
- }
1325
- return $vars;
1326
- }
1327
-
1328
/**
1329
* Sanitize label
1330
*
@@ -1332,14 +1933,17 @@ class Codepress_Admin_Columns
1332
*
1333
* @since 1.0
1334
*/
1335
- private function sanitize_string($string)
1336
{
1337
$string = esc_url($string);
1338
- return str_replace('http://','', $string);
1339
}
1340
1341
/**
1342
- * Get a url to a file in this plugin.
1343
*
1344
* @since 1.0
1345
*/
@@ -1348,6 +1952,19 @@ class Codepress_Admin_Columns
1348
return plugins_url($file, __FILE__);
1349
}
1350
1351
/**
1352
* Get a thumbnail
1353
*
@@ -1357,14 +1974,272 @@ class Codepress_Admin_Columns
1357
{
1358
if ( empty($image) )
1359
return false;
1360
-
1361
$image_path = str_replace( WP_CONTENT_URL, WP_CONTENT_DIR, $image);
1362
- $new = image_resize( $image_path, 120, 80, true);
1363
1364
- if ( ! is_wp_error( $new ) )
1365
- $image = str_replace( WP_CONTENT_DIR, WP_CONTENT_URL, $new);
1366
1367
- return "<img src='{$image}' alt='' width='120' height='80' />";
1368
- }
1369
}
1370
?>
1
<?php
2
/*
3
Plugin Name: Codepress Admin Columns
4
+ Version: 1.3.1
5
+ Description: This plugin makes it easy to customise the columns on the administration screens for post(types), pages, media library and users.
6
+ Author: Codepress
7
Author URI: http://www.codepress.nl
8
Plugin URI: http://www.codepress.nl/plugins/codepress-admin-columns/
9
Text Domain: codepress-admin-columns
26
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27
*/
28
29
+ define( 'CPAC_VERSION', '1.3.1' );
30
31
/**
32
+ * Dependencies
33
*
34
+ * @since 1.3
35
*/
36
+ require_once dirname( __FILE__ ) . '/classes/sortable.php';
37
38
/**
39
+ * Codepress Admin Columns Class
40
*
41
* @since 1.0
42
*
44
class Codepress_Admin_Columns
45
{
46
private $post_types,
47
$slug,
48
+ $textdomain,
49
+ $codepress_url,
50
+ $wordpress_url,
51
+ $excerpt_length,
52
+ $admin_page;
53
54
/**
55
+ * Constructor
56
*
57
* @since 1.0
58
*/
59
function __construct()
60
{
61
+ add_action( 'wp_loaded', array( &$this, 'init') );
62
}
63
64
/**
65
+ * Initialize plugin.
66
*
67
* Loading sequence is determined and intialized.
68
*
69
* @since 1.0
70
*/
71
+ public function init()
72
+ {