PluginProbe ʕ •ᴥ•ʔ
Admin Columns / 1.0
Admin Columns v1.0
7.1.4 7.0.19 2.3.5 2.4 2.4.1 2.4.10 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.4.8 2.4.9 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.6.1 2.5.6.2 2.5.6.3 2.5.6.4 3.0 3.0.1 3.0.2 3.0.3 3.0.5 3.0.7 3.1 3.1.1 3.1.10 3.1.2 3.1.3 3.1.5 3.2.3 3.2.7 3.3.1 3.4.1 3.4.6 3.4.8 4.0.1 4.0.3 4.1.6 4.2.2 4.2.5 4.3 4.3.2 4.4.1 4.4.4 4.4.5 4.5.5 4.6.1 4.7.18 4.7.19 4.7.20 4.7.7 7.0.13 7.0.14 7.0.16 trunk 1.0 1.1 1.1.3 1.2 1.2.1 1.3 1.3.1 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.5.1 1.4.6 1.4.6.1 1.4.6.2 1.4.6.3 1.4.6.4 1.4.7 1.4.8 1.4.9 2.0.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.2 2.2.1 2.2.1.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.5.1 2.2.6 2.2.6.1 2.2.6.2 2.2.6.3 2.2.6.4 2.2.7 2.2.8 2.2.8.1 2.2.9 2.3.1 2.3.2 2.3.3
codepress-admin-columns / codepress-admin-columns.php
codepress-admin-columns Last commit date
assets 14 years ago languages 14 years ago codepress-admin-columns.php 14 years ago readme.txt 14 years ago screenshot-1.png 14 years ago screenshot-2.png 14 years ago screenshot-3.png 14 years ago
codepress-admin-columns.php
1370 lines
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
10 Domain Path: /languages
11 License: GPLv2
12
13 Copyright 2011 Codepress info@codepress.nl
14
15 This program is free software; you can redistribute it and/or modify
16 it under the terms of the GNU General Public License version 2 as published by
17 the Free Software Foundation.
18
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
23
24 You should have received a copy of the GNU General Public License
25 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 *
43 */
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 *
99 * Create the admin menu link for the settings page.
100 *
101 * @since 1.0
102 */
103 public function settings_menu()
104 {
105 $page = add_options_page(
106 // Page title
107 esc_html__( 'Admin Columns Settings', $this->textdomain ),
108 // Menu Title
109 esc_html__( 'Admin Columns', $this->textdomain ),
110 // Capability
111 'manage_options',
112 // Menu slug
113 $this->slug,
114 // Callback
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
124 *
125 * @since 1.0
126 */
127 function add_settings_link( $links, $file )
128 {
129 if ( $file != plugin_basename( __FILE__ ))
130 return $links;
131
132 array_unshift($links, '<a href="' . admin_url("admin.php") . '?page=' . $this->slug . '">' . __( 'Settings' ) . '</a>');
133 return $links;
134 }
135
136 /**
137 * Register Columns
138 *
139 * @since 1.0
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 "
327 <div class='cpac-box'>
328 <ul class='cpac-option-list'>
329 {$list}
330 </ul>
331 {$button_add_column}
332 <div class='cpac-reorder-msg'></div>
333 </div>
334 ";
335 }
336
337 /**
338 * Get merged 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']) )
399 $classes[] = $values['options']['class'];
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
411 $list = "
412 <li class='{$class}'>
413 <div class='cpac-sort-handle'></div>
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>
431 </li>
432 ";
433
434 return $list;
435 }
436
437 /**
438 * Get additional box option fields
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 }
452
453 /**
454 * Box Options: Custom Fields
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;
465
466 // set meta field options
467 $current = ! empty($values['field']) ? $values['field'] : '' ;
468 $field_options = '';
469 foreach ($fields as $field) {
470 $field_options .= sprintf
471 (
472 '<option value="%s"%s>%s</option>',
473 $field,
474 $field == $current? ' selected="selected"':'',
475 $field
476 );
477 }
478
479 // set meta fieldtype options
480 $currenttype = ! empty($values['field_type']) ? $values['field_type'] : '' ;
481 $fieldtype_options = '';
482 $fieldtypes = array(
483 '' => __('Default'),
484 'image' => __('Image'),
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 (
495 '<option value="%s"%s>%s</option>',
496 $fkey,
497 $fkey == $currenttype? ' selected="selected"':'',
498 $fieldtype
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>
511 </p>
512 ";
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
525 return $inside;
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();
543 foreach ($fields as $field) {
544 // filter out hidden meta fields
545 if (substr($field[0],0,1) != "_") {
546 $meta_fields[] = $field[0];
547 }
548 }
549
550 return $meta_fields;
551 }
552
553 return false;
554 }
555
556 /**
557 * Register admin scripts
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
577 ));
578 $post_types['post'] = 'post';
579 $post_types['page'] = 'page';
580
581 return $post_types;
582 }
583
584 /**
585 * Register admin css
586 *
587 * @since 1.0
588 */
589 public function admin_styles()
590 {
591 wp_enqueue_style( 'cpac-admin', $this->plugin_url('/assets/css/admin-column.css'), array(), CPAC_VERSION, 'all' );
592 }
593
594 /**
595 * Register column css
596 *
597 * @since 1.0
598 */
599 public function column_styles()
600 {
601 wp_enqueue_style( 'cpac-columns', $this->plugin_url('/assets/css/column.css'), array(), CPAC_VERSION, 'all' );
602 }
603
604 /**
605 * Register plugin options
606 *
607 * @since 1.0
608 */
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') );
616 }
617
618 /**
619 * Returns the default plugin options.
620 *
621 * @since 1.0
622 */
623 public function get_default_plugin_options()
624 {
625 $default_plugin_options = array(
626 'post' => '',
627 'page' => ''
628 );
629 return apply_filters( 'cpac_default_plugin_options', $default_plugin_options );
630 }
631
632 /**
633 * Save geocode coordinates of focus location.
634 *
635 * @since 1.0
636 */
637 public function options_callback($options)
638 {
639 return $options;
640 }
641
642 /**
643 * Handle requests.
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 /**
667 * Restore defaults
668 *
669 * @since 1.0
670 */
671 private function restore_defaults()
672 {
673 delete_option( 'cpac_options' );
674 delete_option( 'cpac_options_default' );
675 }
676
677 /**
678 * Returns excerpt
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 }
694
695 /**
696 * Returns shortened string
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 /**
719 * Manage custom column for Post Types.
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 = '';
740 switch ($type) :
741
742 // Post ID
743 case "column-postid" :
744 $result = $post_id;
745 break;
746
747 // Excerpt
748 case "column-excerpt" :
749 $result = $this->get_post_excerpt($post_id);
750 break;
751
752 // Featured Image
753 case "column-featured_image" :
754 $result = get_the_post_thumbnail($post_id, array(80,80));
755 break;
756
757 // Sticky Post
758 case "column-sticky" :
759 if ( is_sticky($post_id) ) {
760 $src = $this->plugin_url('assets/images/checkmark.png');
761 $result = "<img alt='sticky' src='{$src}' />";
762 }
763 break;
764
765 // Order
766 case "column-order" :
767 $result = get_post_field('menu_order', $post_id);
768 break;
769
770 // Post Formats
771 case "column-post_formats" :
772 $result = get_post_format($post_id);
773 break;
774
775 // Page template
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
786 case "column-page-slug" :
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) ) {
796 $result = __('Standard');
797 }
798 elseif ( !empty($tags) ) {
799 foreach($tags as $tag) {
800 $tarr[] = $tag->name;
801 }
802 $result = implode(', ', $tarr);
803 }
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
821 if ( empty($result) )
822 echo '&nbsp;';
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
869 // make sure there are no serialized arrays or empty meta data
870 if ( empty($meta) || !is_string($meta) )
871 return false;
872
873 // handles each field type differently..
874 switch ($fieldtype) :
875
876 // Image
877 case "image" :
878 $meta = $this->get_thumbnail($meta);
879 break;
880
881 // Media Library ID
882 case "library_id" :
883 // check if media exists
884 $meta = wp_get_attachment_url($meta) ? wp_get_attachment_image( $meta, array(80,80), true ) : '';
885 break;
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
897 /**
898 * Implode for multi dimensional array
899 *
900 * @since 1.0
901 */
902 private function recursive_implode( $glue, $pieces )
903 {
904 foreach( $pieces as $r_pieces ) {
905 if( is_array( $r_pieces ) ) {
906 $retVal[] = $this->recursive_implode( $glue, $r_pieces );
907 }
908 else {
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 ) {
964 foreach ( $dif_columns as $column ) {
965 $pre_columns[$column] = $columns[$column];
966 }
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;
1011 $org_current_screen = $current_screen;
1012
1013 // overwrite current_screen global with our post type of choose...
1014 $current_screen->post_type = $post_type;
1015
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
1028 // comment exception
1029 if ( strpos( $label, 'comment-grey-bubble.png') ) {
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(
1038 'type_label' => $type_label,
1039 'hide_options' => $hide_options,
1040 'class' => 'cpac-box-wp-native',
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
1137 $taxonomies = get_object_taxonomies($post_type, 'objects');
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 /**
1195 * Admin requests for orderby column
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 }
1210
1211 /**
1212 * Post Type Menu
1213 *
1214 * @since 1.0
1215 */
1216 private function get_post_type_menu()
1217 {
1218 // set
1219 $menu = '';
1220 $count = 1;
1221
1222 // referer
1223 $referer = '';
1224 if ( isset($_REQUEST['cpac_type']) && $_REQUEST['cpac_type'] )
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
1241 $menu .= "
1242 <li>{$divider}<a{$current} href='#cpac-box-{$clean_label}'>{$label}</a></li>
1243 ";
1244 }
1245
1246 return "
1247 <div class='cpac-menu'>
1248 <ul class='subsubsub'>
1249 {$menu}
1250 </ul>
1251 </div>
1252 ";
1253 }
1254
1255 /**
1256 * Checks if menu type is currently viewed
1257 *
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']) )
1267 $referer = $_REQUEST['cpac_type'];
1268
1269 // get label
1270 $label = $this->get_singular_name($post_type);
1271 $clean_label = $this->sanitize_string($post_type);
1272
1273 // get first element from post-types
1274 $first = array_shift(array_values($this->post_types));
1275
1276 // display the page that was being viewed before saving
1277 if ( $referer ) {
1278 if ( $referer == 'cpac-box-'.$clean_label ) {
1279 return true;
1280 }
1281
1282 // settings page has not yet been saved
1283 } elseif ( $first == $post_type ) {
1284 return true;
1285 }
1286
1287 return false;
1288 }
1289
1290 /**
1291 * Get singular name of post type
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 *
1331 * Uses intern wordpress function esc_url so it matches the label sorting url.
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 */
1346 private function plugin_url( $file = '' )
1347 {
1348 return plugins_url($file, __FILE__);
1349 }
1350
1351 /**
1352 * Get a thumbnail
1353 *
1354 * @since 1.0
1355 */
1356 private function get_thumbnail( $image = '' )
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 ?>