Changeset 15955
- Timestamp:
- 10/25/2010 02:57:43 AM (15 years ago)
- Location:
- trunk/wp-admin/includes
- Files:
-
- 3 edited
- 10 copied
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/wp-admin/includes/class-wp-list-table.php
r15954 r15955 816 816 * @since 3.1.0 817 817 * 818 * @param string $ type The type of the list table819 * @return object 818 * @param string $class The type of the list table, which is the class name except for core list tables. 819 * @return object|bool Object on success, false if the class does not exist. 820 820 */ 821 function get_list_table( $type ) { 822 require_once( ABSPATH . '/wp-admin/includes/default-list-tables.php' ); 823 // Temp 824 require_once( ABSPATH . '/wp-admin/includes/list-table-posts.php' ); 825 826 $class = 'WP_' . strtr( ucwords( strtr( $type, '-', ' ') ), ' ', '_' ) . '_Table'; 827 $class = apply_filters( "get_list_table_$type", $class ); 828 829 return new $class; 821 function get_list_table( $class ) { 822 $class = apply_filters( "get_list_table_$class", $class ); 823 824 require_list_table( $class ); 825 826 if ( class_exists( $class ) ) 827 return new $class; 828 return false; 830 829 } 831 830 831 /** 832 * Include the proper file for a core list table. 833 * 834 * Useful for extending a core class that would not otherwise be required. 835 * 836 * @since 3.1.0 837 * 838 * @param string $table The core table to include. 839 * @return bool True on success, false on failure. 840 */ 841 function require_list_table( $class ) { 842 $core_classes = array( 'WP_Posts_Table' => 'posts', 'WP_Media_Table' => 'media', 'WP_Terms_Table' => 'terms', 843 'WP_Users_Table' => 'users', 'WP_Comments_Table' => 'comments', 'WP_Post_Comments_Table' => 'comments', 844 'WP_Links_Table' => 'links', 'WP_Sites_Table' => 'sites', 'WP_MS_Users_Table' => 'ms-users', 845 'WP_Plugins_Table' => 'plugins', 'WP_Plugin_Install_Table' => 'plugin-install', 'WP_Themes_Table' => 'themes', 846 'WP_Theme_Install_Table' => 'theme-install' ); 847 848 if ( isset( $core_classes[ $class ] ) ) { 849 require_once( ABSPATH . '/wp-admin/includes/list-table-' . $core_classes[ $class ] . '.php' ); 850 return true; 851 } 852 return false; 853 } 854 855 ?> -
trunk/wp-admin/includes/list-table-comments.php
r15954 r15955 10 10 */ 11 11 12 class WP_Media_Table extends WP_List_Table { 13 14 function WP_Media_Table() { 15 global $detached; 16 17 $detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] ); 18 19 parent::WP_List_Table( array( 20 'screen' => $detached ? 'upload-detached' : 'upload', 21 'plural' => 'media' 22 ) ); 23 } 24 25 function check_permissions() { 26 if ( !current_user_can('upload_files') ) 27 wp_die( __( 'You do not have permission to upload files.' ) ); 28 } 29 30 function prepare_items() { 31 global $lost, $wpdb, $wp_query, $post_mime_types, $avail_post_mime_types; 32 33 $q = $_REQUEST; 34 35 if ( !empty( $lost ) ) 36 $q['post__in'] = implode( ',', $lost ); 37 38 list( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $q ); 39 40 $this->is_trash = isset( $_REQUEST['status'] ) && 'trash' == $_REQUEST['status']; 41 42 $this->set_pagination_args( array( 43 'total_items' => $wp_query->found_posts, 44 'total_pages' => $wp_query->max_num_pages, 45 'per_page' => $wp_query->query_vars['posts_per_page'], 46 ) ); 47 } 48 49 function get_views() { 50 global $wpdb, $post_mime_types, $detached, $avail_post_mime_types; 51 52 $type_links = array(); 53 $_num_posts = (array) wp_count_attachments(); 54 $_total_posts = array_sum($_num_posts) - $_num_posts['trash']; 55 if ( !isset( $total_orphans ) ) 56 $total_orphans = $wpdb->get_var( "SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent < 1" ); 57 $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts)); 58 foreach ( $matches as $type => $reals ) 59 foreach ( $reals as $real ) 60 $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real]; 61 62 $class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : ''; 63 $type_links['all'] = "<li><a href='upload.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $_total_posts, 'uploaded files' ), number_format_i18n( $_total_posts ) ) . '</a>'; 64 foreach ( $post_mime_types as $mime_type => $label ) { 65 $class = ''; 66 67 if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) ) 68 continue; 69 70 if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) ) 71 $class = ' class="current"'; 72 if ( !empty( $num_posts[$mime_type] ) ) 73 $type_links[$mime_type] = "<li><a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( _n( $label[2][0], $label[2][1], $num_posts[$mime_type] ), number_format_i18n( $num_posts[$mime_type] )) . '</a>'; 74 } 75 $type_links['detached'] = '<li><a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( _nx( 'Unattached <span class="count">(%s)</span>', 'Unattached <span class="count">(%s)</span>', $total_orphans, 'detached files' ), number_format_i18n( $total_orphans ) ) . '</a>'; 76 77 if ( !empty($_num_posts['trash']) ) 78 $type_links['trash'] = '<li><a href="upload.php?status=trash"' . ( (isset($_GET['status']) && $_GET['status'] == 'trash' ) ? ' class="current"' : '') . '>' . sprintf( _nx( 'Trash <span class="count">(%s)</span>', 'Trash <span class="count">(%s)</span>', $_num_posts['trash'], 'uploaded files' ), number_format_i18n( $_num_posts['trash'] ) ) . '</a>'; 79 80 return $type_links; 81 } 82 83 function get_bulk_actions() { 84 global $detached; 85 86 $actions = array(); 87 $actions['delete'] = __( 'Delete Permanently' ); 88 if ( $detached ) 89 $actions['attach'] = __( 'Attach to a post' ); 90 91 return $actions; 92 } 93 94 function extra_tablenav( $which ) { 95 global $post_type, $detached; 96 ?> 97 <div class="alignleft actions"> 98 <?php 99 if ( 'top' == $which && !is_singular() && !$detached && !$this->is_trash ) { 100 $this->months_dropdown( $post_type ); 101 102 do_action( 'restrict_manage_posts' ); 103 ?> 104 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" /> 105 <?php 106 } 107 108 if ( $detached ) { ?> 109 <input type="submit" id="find_detached" name="find_detached" value="<?php esc_attr_e( 'Scan for lost attachments' ); ?>" class="button-secondary" /> 110 <?php } elseif ( $this->is_trash && current_user_can( 'edit_others_posts' ) ) { ?> 111 <input type="submit" id="delete_all" name="delete_all" value="<?php esc_attr_e( 'Empty Trash' ); ?>" class="button-secondary apply" /> 112 <?php } ?> 113 </div> 114 <?php 115 } 116 117 function current_action() { 118 if ( isset( $_REQUEST['find_detached'] ) ) 119 return 'find_detached'; 120 121 if ( isset( $_REQUEST['found_post_id'] ) && isset( $_REQUEST['media'] ) ) 122 return 'attach'; 123 124 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) ) 125 return 'delete_all'; 126 127 return parent::current_action(); 128 } 129 130 function has_items() { 131 return have_posts(); 132 } 133 134 function no_items() { 135 _e( 'No media attachments found.' ); 136 } 137 138 function get_columns() { 139 $posts_columns = array(); 140 $posts_columns['cb'] = '<input type="checkbox" />'; 141 $posts_columns['icon'] = ''; 142 /* translators: column name */ 143 $posts_columns['title'] = _x( 'File', 'column name' ); 144 $posts_columns['author'] = __( 'Author' ); 145 //$posts_columns['tags'] = _x( 'Tags', 'column name' ); 146 /* translators: column name */ 147 if ( 'upload' == $this->_screen->id ) { 148 $posts_columns['parent'] = _x( 'Attached to', 'column name' ); 149 $posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="' . esc_url( admin_url( 'images/comment-grey-bubble.png' ) ) . '" /></div>'; 150 } 151 /* translators: column name */ 152 $posts_columns['date'] = _x( 'Date', 'column name' ); 153 $posts_columns = apply_filters( 'manage_media_columns', $posts_columns, 'upload' != $this->_screen->id ); 154 155 return $posts_columns; 156 } 157 158 function get_sortable_columns() { 159 return array( 160 'title' => 'title', 161 'author' => 'author', 162 'parent' => 'parent', 163 'comments' => 'comment_count', 164 'date' => 'date', 165 ); 166 } 167 168 function display_rows() { 169 global $detached, $post, $id; 170 171 if ( $detached ) { 172 $this->display_orphans(); 173 return; 174 } 175 176 add_filter( 'the_title','esc_html' ); 177 $alt = ''; 178 179 while ( have_posts() ) : the_post(); 180 181 if ( $this->is_trash && $post->post_status != 'trash' 182 || !$this->is_trash && $post->post_status == 'trash' ) 183 continue; 184 185 $alt = ( 'alternate' == $alt ) ? '' : 'alternate'; 186 $post_owner = ( get_current_user_id() == $post->post_author ) ? 'self' : 'other'; 187 $att_title = _draft_or_post_title(); 188 ?> 189 <tr id='post-<?php echo $id; ?>' class='<?php echo trim( $alt . ' author-' . $post_owner . ' status-' . $post->post_status ); ?>' valign="top"> 190 <?php 191 192 list( $columns, $hidden ) = $this->get_column_info(); 193 foreach ( $columns as $column_name => $column_display_name ) { 194 $class = "class='$column_name column-$column_name'"; 195 196 $style = ''; 197 if ( in_array( $column_name, $hidden ) ) 198 $style = ' style="display:none;"'; 199 200 $attributes = $class . $style; 201 202 switch ( $column_name ) { 203 204 case 'cb': 205 ?> 206 <th scope="row" class="check-column"><?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?><input type="checkbox" name="media[]" value="<?php the_ID(); ?>" /><?php } ?></th> 207 <?php 208 break; 209 210 case 'icon': 211 $attributes = 'class="column-icon media-icon"' . $style; 212 ?> 213 <td <?php echo $attributes ?>><?php 214 if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) { 215 if ( $this->is_trash ) { 216 echo $thumb; 217 } else { 218 ?> 219 <a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"> 220 <?php echo $thumb; ?> 221 </a> 222 223 <?php } 224 } 225 ?> 226 </td> 227 <?php 228 break; 229 230 case 'title': 231 ?> 232 <td <?php echo $attributes ?>><strong><?php if ( $this->is_trash ) echo $att_title; else { ?><a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php echo $att_title; ?></a><?php } ?></strong> 233 <p> 234 <?php 235 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) ) 236 echo esc_html( strtoupper( $matches[1] ) ); 237 else 238 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) ); 239 ?> 240 </p> 241 <?php 242 $actions = array(); 243 if ( current_user_can( 'edit_post', $post->ID ) && !$this->is_trash ) 244 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>'; 245 if ( current_user_can( 'delete_post', $post->ID ) ) { 246 if ( $this->is_trash ) 247 $actions['untrash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=untrash&post=$post->ID", 'untrash-attachment_' . $post->ID ) . "'>" . __( 'Restore' ) . "</a>"; 248 elseif ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) 249 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>"; 250 if ( $this->is_trash || !EMPTY_TRASH_DAYS || !MEDIA_TRASH ) { 251 $delete_ays = ( !$this->is_trash && !MEDIA_TRASH ) ? " onclick='return showNotice.warn();'" : ''; 252 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>"; 253 } 254 } 255 if ( !$this->is_trash ) { 256 $title =_draft_or_post_title( $post->post_parent ); 257 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>'; 258 } 259 $actions = apply_filters( 'media_row_actions', $actions, $post ); 260 echo $this->row_actions( $actions ); 261 ?> 262 </td> 263 <?php 264 break; 265 266 case 'author': 267 ?> 268 <td <?php echo $attributes ?>><?php the_author() ?></td> 269 <?php 270 break; 271 272 case 'tags': 273 ?> 274 <td <?php echo $attributes ?>><?php 275 $tags = get_the_tags(); 276 if ( !empty( $tags ) ) { 277 $out = array(); 278 foreach ( $tags as $c ) 279 $out[] = "<a href='edit.php?tag=$c->slug'> " . esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'post_tag', 'display' ) ) . "</a>"; 280 echo join( ', ', $out ); 281 } else { 282 _e( 'No Tags' ); 283 } 284 ?> 285 </td> 286 <?php 287 break; 288 289 case 'desc': 290 ?> 291 <td <?php echo $attributes ?>><?php echo has_excerpt() ? $post->post_excerpt : ''; ?></td> 292 <?php 293 break; 294 295 case 'date': 296 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) { 297 $t_time = $h_time = __( 'Unpublished' ); 298 } else { 299 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) ); 300 $m_time = $post->post_date; 301 $time = get_post_time( 'G', true, $post, false ); 302 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) { 303 if ( $t_diff < 0 ) 304 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) ); 305 else 306 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) ); 307 } else { 308 $h_time = mysql2date( __( 'Y/m/d' ), $m_time ); 309 } 310 } 311 ?> 312 <td <?php echo $attributes ?>><?php echo $h_time ?></td> 313 <?php 314 break; 315 316 case 'parent': 317 if ( $post->post_parent > 0 ) { 318 if ( get_post( $post->post_parent ) ) { 319 $title =_draft_or_post_title( $post->post_parent ); 320 } 321 ?> 322 <td <?php echo $attributes ?>> 323 <strong><a href="<?php echo get_edit_post_link( $post->post_parent ); ?>"><?php echo $title ?></a></strong>, 324 <?php echo get_the_time( __( 'Y/m/d' ) ); ?> 325 </td> 326 <?php 327 } else { 328 ?> 329 <td <?php echo $attributes ?>><?php _e( '(Unattached)' ); ?><br /> 330 <a class="hide-if-no-js" onclick="findPosts.open( 'media[]','<?php echo $post->ID ?>' );return false;" href="#the-list"><?php _e( 'Attach' ); ?></a></td> 331 <?php 332 } 333 break; 334 335 case 'comments': 336 $attributes = 'class="comments column-comments num"' . $style; 337 ?> 338 <td <?php echo $attributes ?>> 339 <div class="post-com-count-wrapper"> 340 <?php 341 $pending_comments = get_pending_comments_num( $post->ID ); 342 343 $this->comments_bubble( $post->ID, $pending_comments ); 344 ?> 345 </div> 346 </td> 347 <?php 348 break; 349 350 case 'actions': 351 ?> 352 <td <?php echo $attributes ?>> 353 <a href="media.php?action=edit&attachment_id=<?php the_ID(); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php _e( 'Edit' ); ?></a> | 354 <a href="<?php the_permalink(); ?>"><?php _e( 'Get permalink' ); ?></a> 355 </td> 356 <?php 357 break; 358 359 default: 360 ?> 361 <td <?php echo $attributes ?>> 362 <?php do_action( 'manage_media_custom_column', $column_name, $id ); ?> 363 </td> 364 <?php 365 break; 366 } 367 } 368 ?> 369 </tr> 370 <?php endwhile; 371 } 372 373 function display_orphans() { 374 global $post; 375 376 $class = ''; 377 378 while ( have_posts() ) : the_post(); 379 380 $class = ( 'alternate' == $class ) ? '' : 'alternate'; 381 $att_title = esc_html( _draft_or_post_title( $post->ID ) ); 382 383 $edit_link = '<a href="' . get_edit_post_link( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ) . '">%s</a>'; 384 ?> 385 <tr id='post-<?php echo $post->ID; ?>' class='<?php echo $class; ?>' valign="top"> 386 <th scope="row" class="check-column"> 387 <?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?> 388 <input type="checkbox" name="media[]" value="<?php echo esc_attr( $post->ID ); ?>" /> 389 <?php } ?> 390 </th> 391 392 <td class="media-icon"> 393 <?php if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) { 394 printf( $edit_link, $thumb ); 395 } ?> 396 </td> 397 398 <td class="media column-media"> 399 <strong><?php printf( $edit_link, $att_title ); ?></strong><br /> 400 <?php 401 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) ) 402 echo esc_html( strtoupper( $matches[1] ) ); 403 else 404 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) ); 405 ?> 406 <?php 407 $actions = array(); 408 if ( current_user_can( 'edit_post', $post->ID ) ) 409 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>'; 410 if ( current_user_can( 'delete_post', $post->ID ) ) 411 if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) { 412 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>"; 413 } else { 414 $delete_ays = !MEDIA_TRASH ? " onclick='return showNotice.warn();'" : ''; 415 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>"; 416 } 417 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $att_title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>'; 418 if ( current_user_can( 'edit_post', $post->ID ) ) 419 $actions['attach'] = '<a href="#the-list" onclick="findPosts.open( \'media[]\',\''.$post->ID.'\' );return false;" class="hide-if-no-js">'.__( 'Attach' ).'</a>'; 420 $actions = apply_filters( 'media_row_actions', $actions, $post ); 421 422 echo $this->row_actions( $actions ); 423 ?> 424 </td> 425 <td class="author column-author"> 426 <?php $author = get_userdata( $post->post_author ); echo $author->display_name; ?> 427 </td> 428 <?php 429 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) { 430 $t_time = $h_time = __( 'Unpublished' ); 431 } else { 432 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) ); 433 $m_time = $post->post_date; 434 $time = get_post_time( 'G', true ); 435 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) { 436 if ( $t_diff < 0 ) 437 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) ); 438 else 439 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) ); 440 } else { 441 $h_time = mysql2date( __( 'Y/m/d' ), $m_time ); 442 } 443 } 444 ?> 445 <td class="date column-date"><?php echo $h_time ?></td> 446 </tr> 447 <?php 448 endwhile; 449 } 450 } 451 452 class WP_Terms_Table extends WP_List_Table { 453 454 var $callback_args; 455 456 function WP_Terms_Table() { 457 global $post_type, $taxonomy, $tax, $current_screen; 458 459 wp_reset_vars( array( 'action', 'taxonomy', 'post_type' ) ); 460 461 if ( empty( $taxonomy ) ) 462 $taxonomy = 'post_tag'; 463 464 if ( !taxonomy_exists( $taxonomy ) ) 465 wp_die( __( 'Invalid taxonomy' ) ); 466 467 $tax = get_taxonomy( $taxonomy ); 468 469 if ( empty( $post_type ) || !in_array( $post_type, get_post_types( array( 'public' => true ) ) ) ) 470 $post_type = 'post'; 471 472 if ( !isset( $current_screen ) ) 473 set_current_screen( 'edit-' . $taxonomy ); 474 475 parent::WP_List_Table( array( 476 'screen' => $current_screen, 477 'plural' => 'tags', 478 'singular' => 'tag', 479 ) ); 480 } 481 482 function check_permissions( $type = 'manage' ) { 483 global $tax; 484 485 $cap = 'manage' == $type ? $tax->cap->manage_terms : $tax->cap->edit_terms; 486 487 if ( !current_user_can( $tax->cap->manage_terms ) ) 488 wp_die( __( 'Cheatin’ uh?' ) ); 489 } 490 491 function prepare_items() { 492 global $taxonomy; 493 494 $tags_per_page = $this->get_items_per_page( 'edit_' . $taxonomy . '_per_page' ); 495 496 if ( 'post_tag' == $taxonomy ) { 497 $tags_per_page = apply_filters( 'edit_tags_per_page', $tags_per_page ); 498 $tags_per_page = apply_filters( 'tagsperpage', $tags_per_page ); // Old filter 499 } elseif ( 'category' == $taxonomy ) { 500 $tags_per_page = apply_filters( 'edit_categories_per_page', $tags_per_page ); // Old filter 501 } 502 503 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : ''; 504 505 $args = array( 506 'search' => $search, 507 'page' => $this->get_pagenum(), 508 'number' => $tags_per_page, 509 ); 510 511 if ( !empty( $_REQUEST['orderby'] ) ) 512 $args['orderby'] = trim( stripslashes( $_REQUEST['orderby'] ) ); 513 514 if ( !empty( $_REQUEST['order'] ) ) 515 $args['order'] = trim( stripslashes( $_REQUEST['order'] ) ); 516 517 $this->callback_args = $args; 518 519 $this->set_pagination_args( array( 520 'total_items' => wp_count_terms( $taxonomy, compact( 'search' ) ), 521 'per_page' => $tags_per_page, 522 ) ); 523 } 524 525 function get_bulk_actions() { 526 $actions = array(); 527 $actions['delete'] = __( 'Delete' ); 528 529 return $actions; 530 } 531 532 function current_action() { 533 if ( isset( $_REQUEST['action'] ) && isset( $_REQUEST['delete_tags'] ) && ( 'delete' == $_REQUEST['action'] || 'delete' == $_REQUEST['action2'] ) ) 534 return 'bulk-delete'; 535 536 return parent::current_action(); 537 } 538 539 function get_columns() { 540 global $taxonomy; 541 542 $columns = array( 543 'cb' => '<input type="checkbox" />', 544 'name' => __( 'Name' ), 545 'description' => __( 'Description' ), 546 'slug' => __( 'Slug' ), 547 ); 548 549 if ( 'link_category' == $taxonomy ) 550 $columns['links'] = __( 'Links' ); 551 else 552 $columns['posts'] = __( 'Posts' ); 553 554 return $columns; 555 } 556 557 function get_sortable_columns() { 558 return array( 559 'name' => 'name', 560 'description' => 'description', 561 'slug' => 'slug', 562 'posts' => 'count', 563 'links' => 'count' 564 ); 565 } 566 567 function display_rows() { 568 global $taxonomy; 569 570 $args = wp_parse_args( $this->callback_args, array( 571 'page' => 1, 572 'number' => 20, 573 'search' => '', 574 'hide_empty' => 0 575 ) ); 576 577 extract( $args, EXTR_SKIP ); 578 579 $args['offset'] = $offset = ( $page - 1 ) * $number; 580 581 // convert it to table rows 582 $out = ''; 583 $count = 0; 584 if ( is_taxonomy_hierarchical( $taxonomy ) && !isset( $orderby ) ) { 585 // We'll need the full set of terms then. 586 $args['number'] = $args['offset'] = 0; 587 588 $terms = get_terms( $taxonomy, $args ); 589 if ( !empty( $search ) ) // Ignore children on searches. 590 $children = array(); 591 else 592 $children = _get_term_hierarchy( $taxonomy ); 593 594 // Some funky recursion to get the job done( Paging & parents mainly ) is contained within, Skip it for non-hierarchical taxonomies for performance sake 595 $out .= $this->_rows( $taxonomy, $terms, $children, $offset, $number, $count ); 596 } else { 597 $terms = get_terms( $taxonomy, $args ); 598 foreach ( $terms as $term ) 599 $out .= $this->single_row( $term, 0, $taxonomy ); 600 $count = $number; // Only displaying a single page. 601 } 602 603 echo $out; 604 } 605 606 function _rows( $taxonomy, $terms, &$children, $start = 0, $per_page = 20, &$count, $parent = 0, $level = 0 ) { 607 608 $end = $start + $per_page; 609 610 $output = ''; 611 foreach ( $terms as $key => $term ) { 612 613 if ( $count >= $end ) 614 break; 615 616 if ( $term->parent != $parent && empty( $_REQUEST['s'] ) ) 617 continue; 618 619 // If the page starts in a subtree, print the parents. 620 if ( $count == $start && $term->parent > 0 && empty( $_REQUEST['s'] ) ) { 621 $my_parents = $parent_ids = array(); 622 $p = $term->parent; 623 while ( $p ) { 624 $my_parent = get_term( $p, $taxonomy ); 625 $my_parents[] = $my_parent; 626 $p = $my_parent->parent; 627 if ( in_array( $p, $parent_ids ) ) // Prevent parent loops. 628 break; 629 $parent_ids[] = $p; 630 } 631 unset( $parent_ids ); 632 633 $num_parents = count( $my_parents ); 634 while ( $my_parent = array_pop( $my_parents ) ) { 635 $output .= "\t" . $this->single_row( $my_parent, $level - $num_parents, $taxonomy ); 636 $num_parents--; 637 } 638 } 639 640 if ( $count >= $start ) 641 $output .= "\t" . $this->single_row( $term, $level, $taxonomy ); 642 643 ++$count; 644 645 unset( $terms[$key] ); 646 647 if ( isset( $children[$term->term_id] ) && empty( $_REQUEST['s'] ) ) 648 $output .= $this->_rows( $taxonomy, $terms, $children, $start, $per_page, $count, $term->term_id, $level + 1 ); 649 } 650 651 return $output; 652 } 653 654 function single_row( $tag, $level = 0 ) { 655 static $row_class = ''; 656 $row_class = ( $row_class == '' ? ' class="alternate"' : '' ); 657 658 $this->level = $level; 659 660 echo '<tr id="tag-' . $tag->term_id . '"' . $row_class . '>'; 661 echo $this->single_row_columns( $tag ); 662 echo '</tr>'; 663 } 664 665 function column_cb( $tag ) { 666 global $taxonomy, $tax; 667 668 $default_term = get_option( 'default_' . $taxonomy ); 669 670 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term ) 671 return '<input type="checkbox" name="delete_tags[]" value="' . $tag->term_id . '" />'; 672 else 673 return ' '; 674 } 675 676 function column_name( $tag ) { 677 global $taxonomy, $tax, $post_type; 678 679 $default_term = get_option( 'default_' . $taxonomy ); 680 681 $pad = str_repeat( '— ', max( 0, $this->level ) ); 682 $name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag ); 683 $qe_data = get_term( $tag->term_id, $taxonomy, OBJECT, 'edit' ); 684 $edit_link = get_edit_term_link( $tag->term_id, $taxonomy, $post_type ); 685 686 $out = '<strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $name ) ) . '">' . $name . '</a></strong><br />'; 687 688 $actions = array(); 689 if ( current_user_can( $tax->cap->edit_terms ) ) { 690 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>'; 691 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __( 'Quick Edit' ) . '</a>'; 692 } 693 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term ) 694 $actions['delete'] = "<a class='delete-tag' href='" . wp_nonce_url( "edit-tags.php?action=delete&taxonomy=$taxonomy&tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id ) . "'>" . __( 'Delete' ) . "</a>"; 695 696 $actions = apply_filters( 'tag_row_actions', $actions, $tag ); 697 $actions = apply_filters( "${taxonomy}_row_actions", $actions, $tag ); 698 699 $out .= $this->row_actions( $actions ); 700 $out .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">'; 701 $out .= '<div class="name">' . $qe_data->name . '</div>'; 702 $out .= '<div class="slug">' . apply_filters( 'editable_slug', $qe_data->slug ) . '</div>'; 703 $out .= '<div class="parent">' . $qe_data->parent . '</div></div></td>'; 704 705 return $out; 706 } 707 708 function column_description( $tag ) { 709 return $tag->description; 710 } 711 712 function column_slug( $tag ) { 713 return apply_filters( 'editable_slug', $tag->slug ); 714 } 715 716 function column_posts( $tag ) { 717 global $taxonomy, $post_type; 718 719 $count = number_format_i18n( $tag->count ); 720 721 if ( 'post_tag' == $taxonomy ) { 722 $tagsel = 'tag'; 723 } elseif ( 'category' == $taxonomy ) { 724 $tagsel = 'category_name'; 725 } elseif ( ! empty( $tax->query_var ) ) { 726 $tagsel = $tax->query_var; 727 } else { 728 $tagsel = $taxonomy; 729 } 730 731 return "<a href='edit.php?$tagsel=$tag->slug&post_type=$post_type'>$count</a>"; 732 } 733 734 function column_links( $tag ) { 735 $count = number_format_i18n( $tag->count ); 736 return $count; 737 } 738 739 function column_default( $tag, $column_name ) { 740 global $taxonomy; 741 742 return apply_filters( "manage_${taxonomy}_custom_column", '', $column_name, $tag->term_id ); 743 $out .= "</td>"; 744 } 745 746 /** 747 * Outputs the hidden row displayed when inline editing 748 * 749 * @since 3.1.0 750 */ 751 function inline_edit() { 752 global $tax; 753 754 if ( ! current_user_can( $tax->cap->edit_terms ) ) 755 return; 756 757 list( $columns, $hidden ) = $this->get_column_info(); 758 759 $col_count = count( $columns ) - count( $hidden ); 760 ?> 761 762 <form method="get" action=""><table style="display: none"><tbody id="inlineedit"> 763 <tr id="inline-edit" class="inline-edit-row" style="display: none"><td colspan="<?php echo $col_count; ?>"> 764 765 <fieldset><div class="inline-edit-col"> 766 <h4><?php _e( 'Quick Edit' ); ?></h4> 767 768 <label> 769 <span class="title"><?php _e( 'Name' ); ?></span> 770 <span class="input-text-wrap"><input type="text" name="name" class="ptitle" value="" /></span> 771 </label> 772 <?php if ( !global_terms_enabled() ) { ?> 773 <label> 774 <span class="title"><?php _e( 'Slug' ); ?></span> 775 <span class="input-text-wrap"><input type="text" name="slug" class="ptitle" value="" /></span> 776 </label> 777 <?php } ?> 778 779 </div></fieldset> 780 <?php 781 782 $core_columns = array( 'cb' => true, 'description' => true, 'name' => true, 'slug' => true, 'posts' => true ); 783 784 foreach ( $columns as $column_name => $column_display_name ) { 785 if ( isset( $core_columns[$column_name] ) ) 786 continue; 787 do_action( 'quick_edit_custom_box', $column_name, $type, $tax->taxonomy ); 788 } 789 790 ?> 791 792 <p class="inline-edit-save submit"> 793 <a accesskey="c" href="#inline-edit" title="<?php _e( 'Cancel' ); ?>" class="cancel button-secondary alignleft"><?php _e( 'Cancel' ); ?></a> 794 <?php $update_text = $tax->labels->update_item; ?> 795 <a accesskey="s" href="#inline-edit" title="<?php echo esc_attr( $update_text ); ?>" class="save button-primary alignright"><?php echo $update_text; ?></a> 796 <img class="waiting" style="display:none;" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" /> 797 <span class="error" style="display:none;"></span> 798 <?php wp_nonce_field( 'taxinlineeditnonce', '_inline_edit', false ); ?> 799 <input type="hidden" name="taxonomy" value="<?php echo esc_attr( $tax->name ); ?>" /> 800 <br class="clear" /> 801 </p> 802 </td></tr> 803 </tbody></table></form> 804 <?php 805 } 806 } 807 808 class WP_Users_Table extends WP_List_Table { 809 810 function WP_Users_Table() { 811 parent::WP_List_Table( array( 812 'screen' => 'users', 813 'plural' => 'users' 814 ) ); 815 } 816 817 function check_permissions() { 818 if ( !current_user_can('list_users') ) 819 wp_die(__('Cheatin’ uh?')); 820 } 821 822 function prepare_items() { 823 global $role, $usersearch; 824 825 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : ''; 826 827 $role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : ''; 828 829 $users_per_page = $this->get_items_per_page( 'users_per_page' ); 830 831 $paged = $this->get_pagenum(); 832 833 $args = array( 834 'number' => $users_per_page, 835 'offset' => ( $paged-1 ) * $users_per_page, 836 'role' => $role, 837 'search' => $usersearch 838 ); 839 840 if ( isset( $_REQUEST['orderby'] ) ) 841 $args['orderby'] = $_REQUEST['orderby']; 842 843 if ( isset( $_REQUEST['order'] ) ) 844 $args['order'] = $_REQUEST['order']; 845 846 // Query the user IDs for this page 847 $wp_user_search = new WP_User_Query( $args ); 848 849 $this->items = $wp_user_search->get_results(); 850 851 $this->set_pagination_args( array( 852 'total_items' => $wp_user_search->get_total(), 853 'per_page' => $users_per_page, 854 ) ); 855 } 856 857 function no_items() { 858 _e( 'No matching users were found.' ); 859 } 860 861 function get_views() { 862 global $wp_roles, $role; 863 864 $users_of_blog = count_users(); 865 $total_users = $users_of_blog['total_users']; 866 $avail_roles =& $users_of_blog['avail_roles']; 867 unset($users_of_blog); 868 869 $current_role = false; 870 $class = empty($role) ? ' class="current"' : ''; 871 $role_links = array(); 872 $role_links['all'] = "<li><a href='users.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>'; 873 foreach ( $wp_roles->get_names() as $this_role => $name ) { 874 if ( !isset($avail_roles[$this_role]) ) 875 continue; 876 877 $class = ''; 878 879 if ( $this_role == $role ) { 880 $current_role = $role; 881 $class = ' class="current"'; 882 } 883 884 $name = translate_user_role( $name ); 885 /* translators: User role name with count */ 886 $name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, $avail_roles[$this_role] ); 887 $role_links[$this_role] = "<li><a href='users.php?role=$this_role'$class>$name</a>"; 888 } 889 890 return $role_links; 891 } 892 893 function get_bulk_actions() { 894 $actions = array(); 895 896 if ( !is_multisite() && current_user_can( 'delete_users' ) ) 897 $actions['delete'] = __( 'Delete' ); 898 else 899 $actions['remove'] = __( 'Remove' ); 900 901 return $actions; 902 } 903 904 function extra_tablenav( $which ) { 905 if ( 'top' != $which ) 906 return; 907 ?> 908 <div class="alignleft actions"> 909 <label class="screen-reader-text" for="new_role"><?php _e( 'Change role to…' ) ?></label> 910 <select name="new_role" id="new_role"> 911 <option value=''><?php _e( 'Change role to…' ) ?></option> 912 <?php wp_dropdown_roles(); ?> 913 </select> 914 <input type="submit" value="<?php esc_attr_e( 'Change' ); ?>" name="changeit" class="button-secondary" /> 915 </div> 916 <?php 917 } 918 919 function current_action() { 920 if ( isset($_REQUEST['changeit']) && !empty($_REQUEST['new_role']) ) 921 return 'promote'; 922 923 return parent::current_action(); 924 } 12 class WP_Post_Comments_Table extends WP_Comments_Table { 925 13 926 14 function get_columns() { 927 15 return array( 928 'cb' => '<input type="checkbox" />', 929 'username' => __( 'Login' ), 930 'name' => __( 'Name' ), 931 'email' => __( 'E-mail' ), 932 'role' => __( 'Role' ), 933 'posts' => __( 'Posts' ) 16 'author' => __( 'Author' ), 17 'comment' => _x( 'Comment', 'column name' ), 934 18 ); 935 19 } 936 20 937 21 function get_sortable_columns() { 938 return array( 939 'username' => 'login', 940 'name' => 'name', 941 'email' => 'email', 942 'posts' => 'post_count', 943 ); 944 } 945 946 function display_rows() { 947 // Query the post counts for this page 948 $post_counts = count_many_users_posts( array_keys( $this->items ) ); 949 950 $style = ''; 951 foreach ( $this->items as $userid => $user_object ) { 952 $role = reset( $user_object->roles ); 953 954 if ( is_multisite() && empty( $role ) ) 955 continue; 956 957 $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"'; 958 echo "\n\t", $this->single_row( $user_object, $style, $role, $post_counts[ $userid ] ); 959 } 960 } 961 962 /** 963 * Generate HTML for a single row on the users.php admin panel. 964 * 965 * @since 2.1.0 966 * 967 * @param object $user_object 968 * @param string $style Optional. Attributes added to the TR element. Must be sanitized. 969 * @param string $role Key for the $wp_roles array. 970 * @param int $numposts Optional. Post count to display for this user. Defaults to zero, as in, a new user has made zero posts. 971 * @return string 972 */ 973 function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) { 974 global $wp_roles; 975 976 if ( !( is_object( $user_object ) && is_a( $user_object, 'WP_User' ) ) ) 977 $user_object = new WP_User( (int) $user_object ); 978 $user_object = sanitize_user_object( $user_object, 'display' ); 979 $email = $user_object->user_email; 980 $url = $user_object->user_url; 981 $short_url = str_replace( 'http://', '', $url ); 982 $short_url = str_replace( 'www.', '', $short_url ); 983 if ( '/' == substr( $short_url, -1 ) ) 984 $short_url = substr( $short_url, 0, -1 ); 985 if ( strlen( $short_url ) > 35 ) 986 $short_url = substr( $short_url, 0, 32 ).'...'; 987 $checkbox = ''; 988 // Check if the user for this row is editable 989 if ( current_user_can( 'list_users' ) ) { 990 // Set up the user editing link 991 // TODO: make profile/user-edit determination a separate function 992 if ( get_current_user_id() == $user_object->ID ) { 993 $edit_link = 'profile.php'; 994 } else { 995 $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( esc_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" ) ); 996 } 997 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />"; 998 999 // Set up the hover actions for this user 1000 $actions = array(); 1001 1002 if ( current_user_can( 'edit_user', $user_object->ID ) ) { 1003 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />"; 1004 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>'; 1005 } else { 1006 $edit = "<strong>$user_object->user_login</strong><br />"; 1007 } 1008 1009 if ( !is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) ) 1010 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=delete&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Delete' ) . "</a>"; 1011 if ( is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'remove_user', $user_object->ID ) ) 1012 $actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=remove&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . "</a>"; 1013 $actions = apply_filters( 'user_row_actions', $actions, $user_object ); 1014 $edit .= $this->row_actions( $actions ); 1015 1016 // Set up the checkbox ( because the user is editable, otherwise its empty ) 1017 $checkbox = "<input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='$role' value='{$user_object->ID}' />"; 1018 1019 } else { 1020 $edit = '<strong>' . $user_object->user_login . '</strong>'; 1021 } 1022 $role_name = isset( $wp_roles->role_names[$role] ) ? translate_user_role( $wp_roles->role_names[$role] ) : __( 'None' ); 1023 $r = "<tr id='user-$user_object->ID'$style>"; 1024 $avatar = get_avatar( $user_object->ID, 32 ); 1025 1026 list( $columns, $hidden ) = $this->get_column_info(); 1027 1028 foreach ( $columns as $column_name => $column_display_name ) { 1029 $class = "class=\"$column_name column-$column_name\""; 1030 1031 $style = ''; 1032 if ( in_array( $column_name, $hidden ) ) 1033 $style = ' style="display:none;"'; 1034 1035 $attributes = "$class$style"; 1036 1037 switch ( $column_name ) { 1038 case 'cb': 1039 $r .= "<th scope='row' class='check-column'>$checkbox</th>"; 1040 break; 1041 case 'username': 1042 $r .= "<td $attributes>$avatar $edit</td>"; 1043 break; 1044 case 'name': 1045 $r .= "<td $attributes>$user_object->first_name $user_object->last_name</td>"; 1046 break; 1047 case 'email': 1048 $r .= "<td $attributes><a href='mailto:$email' title='" . sprintf( __( 'E-mail: %s' ), $email ) . "'>$email</a></td>"; 1049 break; 1050 case 'role': 1051 $r .= "<td $attributes>$role_name</td>"; 1052 break; 1053 case 'posts': 1054 $attributes = 'class="posts column-posts num"' . $style; 1055 $r .= "<td $attributes>"; 1056 if ( $numposts > 0 ) { 1057 $r .= "<a href='edit.php?author=$user_object->ID' title='" . __( 'View posts by this author' ) . "' class='edit'>"; 1058 $r .= $numposts; 1059 $r .= '</a>'; 1060 } else { 1061 $r .= 0; 1062 } 1063 $r .= "</td>"; 1064 break; 1065 default: 1066 $r .= "<td $attributes>"; 1067 $r .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID ); 1068 $r .= "</td>"; 1069 } 1070 } 1071 $r .= '</tr>'; 1072 1073 return $r; 22 return array(); 1074 23 } 1075 24 } … … 1548 497 } 1549 498 } 1550 1551 class WP_Post_Comments_Table extends WP_Comments_Table {1552 1553 function get_columns() {1554 return array(1555 'author' => __( 'Author' ),1556 'comment' => _x( 'Comment', 'column name' ),1557 );1558 }1559 1560 function get_sortable_columns() {1561 return array();1562 }1563 }1564 1565 class WP_Links_Table extends WP_List_Table {1566 1567 function WP_Links_Table() {1568 parent::WP_List_Table( array(1569 'screen' => 'link-manager',1570 'plural' => 'bookmarks',1571 ) );1572 }1573 1574 function check_permissions() {1575 if ( ! current_user_can( 'manage_links' ) )1576 wp_die( __( 'You do not have sufficient permissions to edit the links for this site.' ) );1577 }1578 1579 function prepare_items() {1580 global $cat_id, $s, $orderby, $order;1581 1582 wp_reset_vars( array( 'action', 'cat_id', 'linkurl', 'name', 'image', 'description', 'visible', 'target', 'category', 'link_id', 'submit', 'orderby', 'order', 'links_show_cat_id', 'rating', 'rel', 'notes', 'linkcheck[]', 's' ) );1583 1584 $args = array( 'hide_invisible' => 0, 'hide_empty' => 0 );1585 1586 if ( 'all' != $cat_id )1587 $args['category'] = $cat_id;1588 if ( !empty( $s ) )1589 $args['search'] = $s;1590 if ( !empty( $orderby ) )1591 $args['orderby'] = $orderby;1592 if ( !empty( $order ) )1593 $args['order'] = $order;1594 1595 $this->items = get_bookmarks( $args );1596 }1597 1598 function no_items() {1599 _e( 'No links found.' );1600 }1601 1602 function get_bulk_actions() {1603 $actions = array();1604 $actions['delete'] = __( 'Delete' );1605 1606 return $actions;1607 }1608 1609 function extra_tablenav( $which ) {1610 global $cat_id;1611 1612 if ( 'top' != $which )1613 return;1614 ?>1615 <div class="alignleft actions">1616 <?php1617 $dropdown_options = array(1618 'selected' => $cat_id,1619 'name' => 'cat_id',1620 'taxonomy' => 'link_category',1621 'show_option_all' => __( 'View all categories' ),1622 'hide_empty' => true,1623 'hierarchical' => 1,1624 'show_count' => 0,1625 'orderby' => 'name',1626 );1627 wp_dropdown_categories( $dropdown_options );1628 ?>1629 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />1630 </div>1631 <?php1632 }1633 1634 function get_columns() {1635 return array(1636 'cb' => '<input type="checkbox" />',1637 'name' => __( 'Name' ),1638 'url' => __( 'URL' ),1639 'categories' => __( 'Categories' ),1640 'rel' => __( 'Relationship' ),1641 'visible' => __( 'Visible' ),1642 'rating' => __( 'Rating' )1643 );1644 }1645 1646 function get_sortable_columns() {1647 return array(1648 'name' => 'name',1649 'url' => 'url',1650 'visible' => 'visible',1651 'rating' => 'rating'1652 );1653 }1654 1655 function display_rows() {1656 global $cat_id;1657 1658 $alt = 0;1659 1660 foreach ( $this->items as $link ) {1661 $link = sanitize_bookmark( $link );1662 $link->link_name = esc_attr( $link->link_name );1663 $link->link_category = wp_get_link_cats( $link->link_id );1664 1665 $short_url = str_replace( 'http://', '', $link->link_url );1666 $short_url = preg_replace( '/^www\./i', '', $short_url );1667 if ( '/' == substr( $short_url, -1 ) )1668 $short_url = substr( $short_url, 0, -1 );1669 if ( strlen( $short_url ) > 35 )1670 $short_url = substr( $short_url, 0, 32 ).'...';1671 1672 $visible = ( $link->link_visible == 'Y' ) ? __( 'Yes' ) : __( 'No' );1673 $rating = $link->link_rating;1674 $style = ( $alt++ % 2 ) ? '' : ' class="alternate"';1675 1676 $edit_link = get_edit_bookmark_link( $link );1677 ?>1678 <tr id="link-<?php echo $link->link_id; ?>" valign="middle" <?php echo $style; ?>>1679 <?php1680 1681 list( $columns, $hidden ) = $this->get_column_info();1682 1683 foreach ( $columns as $column_name => $column_display_name ) {1684 $class = "class='column-$column_name'";1685 1686 $style = '';1687 if ( in_array( $column_name, $hidden ) )1688 $style = ' style="display:none;"';1689 1690 $attributes = $class . $style;1691 1692 switch ( $column_name ) {1693 case 'cb':1694 echo '<th scope="row" class="check-column"><input type="checkbox" name="linkcheck[]" value="'. esc_attr( $link->link_id ) .'" /></th>';1695 break;1696 1697 case 'name':1698 echo "<td $attributes><strong><a class='row-title' href='$edit_link' title='" . esc_attr( sprintf( __( 'Edit “%s”' ), $link->link_name ) ) . "'>$link->link_name</a></strong><br />";1699 1700 $actions = array();1701 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';1702 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "link.php?action=delete&link_id=$link->link_id", 'delete-bookmark_' . $link->link_id ) . "' onclick=\"if ( confirm( '" . esc_js( sprintf( __( "You are about to delete this link '%s'\n 'Cancel' to stop, 'OK' to delete." ), $link->link_name ) ) . "' ) ) { return true;}return false;\">" . __( 'Delete' ) . "</a>";1703 echo $this->row_actions( $actions );1704 1705 echo '</td>';1706 break;1707 case 'url':1708 echo "<td $attributes><a href='$link->link_url' title='".sprintf( __( 'Visit %s' ), $link->link_name )."'>$short_url</a></td>";1709 break;1710 case 'categories':1711 ?><td <?php echo $attributes ?>><?php1712 $cat_names = array();1713 foreach ( $link->link_category as $category ) {1714 $cat = get_term( $category, 'link_category', OBJECT, 'display' );1715 if ( is_wp_error( $cat ) )1716 echo $cat->get_error_message();1717 $cat_name = $cat->name;1718 if ( $cat_id != $category )1719 $cat_name = "<a href='link-manager.php?cat_id=$category'>$cat_name</a>";1720 $cat_names[] = $cat_name;1721 }1722 echo implode( ', ', $cat_names );1723 ?></td><?php1724 break;1725 case 'rel':1726 ?><td <?php echo $attributes ?>><?php echo empty( $link->link_rel ) ? '<br />' : $link->link_rel; ?></td><?php1727 break;1728 case 'visible':1729 ?><td <?php echo $attributes ?>><?php echo $visible; ?></td><?php1730 break;1731 case 'rating':1732 ?><td <?php echo $attributes ?>><?php echo $rating; ?></td><?php1733 break;1734 default:1735 ?>1736 <td <?php echo $attributes ?>><?php do_action( 'manage_link_custom_column', $column_name, $link->link_id ); ?></td>1737 <?php1738 break;1739 }1740 }1741 ?>1742 </tr>1743 <?php1744 }1745 }1746 }1747 1748 class WP_Sites_Table extends WP_List_Table {1749 1750 function WP_Sites_Table() {1751 parent::WP_List_Table( array(1752 'screen' => 'sites-network',1753 'plural' => 'sites',1754 ) );1755 }1756 1757 function check_permissions() {1758 if ( ! current_user_can( 'manage_sites' ) )1759 wp_die( __( 'You do not have permission to access this page.' ) );1760 }1761 1762 function prepare_items() {1763 global $s, $mode, $wpdb;1764 1765 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'list' : $_REQUEST['mode'];1766 1767 $per_page = $this->get_items_per_page( 'sites_network_per_page' );1768 1769 $pagenum = $this->get_pagenum();1770 1771 $s = isset( $_REQUEST['s'] ) ? stripslashes( trim( $_REQUEST[ 's' ] ) ) : '';1772 $like_s = esc_sql( like_escape( $s ) );1773 1774 $query = "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' ";1775 1776 if ( isset( $_REQUEST['searchaction'] ) ) {1777 if ( 'name' == $_REQUEST['searchaction'] ) {1778 $query .= " AND ( {$wpdb->blogs}.domain LIKE '%{$like_s}%' OR {$wpdb->blogs}.path LIKE '%{$like_s}%' ) ";1779 } elseif ( 'id' == $_REQUEST['searchaction'] ) {1780 $query .= " AND {$wpdb->blogs}.blog_id = '{$like_s}' ";1781 } elseif ( 'ip' == $_REQUEST['searchaction'] ) {1782 $query = "SELECT *1783 FROM {$wpdb->blogs}, {$wpdb->registration_log}1784 WHERE site_id = '{$wpdb->siteid}'1785 AND {$wpdb->blogs}.blog_id = {$wpdb->registration_log}.blog_id1786 AND {$wpdb->registration_log}.IP LIKE ( '%{$like_s}%' )";1787 }1788 }1789 1790 $order_by = isset( $_REQUEST['orderby'] ) ? $_REQUEST['orderby'] : 'id';1791 if ( $order_by == 'registered' ) {1792 $query .= ' ORDER BY registered ';1793 } elseif ( $order_by == 'lastupdated' ) {1794 $query .= ' ORDER BY last_updated ';1795 } elseif ( $order_by == 'blogname' ) {1796 $query .= ' ORDER BY domain ';1797 } else {1798 $order_by = 'id';1799 $query .= " ORDER BY {$wpdb->blogs}.blog_id ";1800 }1801 1802 $order = ( isset( $_REQUEST['order'] ) && 'DESC' == strtoupper( $_REQUEST['order'] ) ) ? "DESC" : "ASC";1803 $query .= $order;1804 1805 $total = $wpdb->get_var( str_replace( 'SELECT *', 'SELECT COUNT( blog_id )', $query ) );1806 1807 $query .= " LIMIT " . intval( ( $pagenum - 1 ) * $per_page ) . ", " . intval( $per_page );1808 $this->items = $wpdb->get_results( $query, ARRAY_A );1809 1810 $this->set_pagination_args( array(1811 'total_items' => $total,1812 'per_page' => $per_page,1813 ) );1814 }1815 1816 function no_items() {1817 _e( 'No sites found.' );1818 }1819 1820 function get_bulk_actions() {1821 $actions = array();1822 $actions['delete'] = __( 'Delete' );1823 $actions['spam'] = _x( 'Mark as Spam', 'site' );1824 $actions['notspam'] = _x( 'Not Spam', 'site' );1825 1826 return $actions;1827 }1828 1829 function pagination( $which ) {1830 global $mode;1831 1832 parent::pagination( $which );1833 1834 if ( 'top' == $which )1835 $this->view_switcher( $mode );1836 }1837 1838 function get_columns() {1839 $blogname_columns = ( is_subdomain_install() ) ? __( 'Domain' ) : __( 'Path' );1840 $sites_columns = array(1841 'cb' => '<input type="checkbox" />',1842 'blogname' => $blogname_columns,1843 'lastupdated' => __( 'Last Updated' ),1844 'registered' => _x( 'Registered', 'site' ),1845 'users' => __( 'Users' )1846 );1847 1848 if ( has_filter( 'wpmublogsaction' ) )1849 $sites_columns['plugins'] = __( 'Actions' );1850 1851 $sites_columns = apply_filters( 'wpmu_blogs_columns', $sites_columns );1852 1853 return $sites_columns;1854 }1855 1856 function get_sortable_columns() {1857 return array(1858 'id' => 'id',1859 'blogname' => 'blogname',1860 'lastupdated' => 'lastupdated',1861 'registered' => 'registered',1862 );1863 }1864 1865 function display_rows() {1866 global $current_site, $mode;1867 1868 $status_list = array(1869 'archived' => array( 'site-archived', __( 'Archived' ) ),1870 'spam' => array( 'site-spammed', _x( 'Spam', 'site' ) ),1871 'deleted' => array( 'site-deleted', __( 'Deleted' ) ),1872 'mature' => array( 'site-mature', __( 'Mature' ) )1873 );1874 1875 $class = '';1876 foreach ( $this->items as $blog ) {1877 $class = ( 'alternate' == $class ) ? '' : 'alternate';1878 reset( $status_list );1879 1880 $blog_states = array();1881 foreach ( $status_list as $status => $col ) {1882 if ( get_blog_status( $blog['blog_id'], $status ) == 1 ) {1883 $class = $col[0];1884 $blog_states[] = $col[1];1885 }1886 }1887 $blog_state = '';1888 if ( ! empty( $blog_states ) ) {1889 $state_count = count( $blog_states );1890 $i = 0;1891 $blog_state .= ' - ';1892 foreach ( $blog_states as $state ) {1893 ++$i;1894 ( $i == $state_count ) ? $sep = '' : $sep = ', ';1895 $blog_state .= "<span class='post-state'>$state$sep</span>";1896 }1897 }1898 echo "<tr class='$class'>";1899 1900 $blogname = ( is_subdomain_install() ) ? str_replace( '.'.$current_site->domain, '', $blog['domain'] ) : $blog['path'];1901 1902 list( $columns, $hidden ) = $this->get_column_info();1903 1904 foreach ( $columns as $column_name => $column_display_name ) {1905 switch ( $column_name ) {1906 case 'cb': ?>1907 <th scope="row" class="check-column">1908 <input type="checkbox" id="blog_<?php echo $blog['blog_id'] ?>" name="allblogs[]" value="<?php echo esc_attr( $blog['blog_id'] ) ?>" />1909 </th>1910 <?php1911 break;1912 1913 case 'id': ?>1914 <th valign="top" scope="row">1915 <?php echo $blog['blog_id'] ?>1916 </th>1917 <?php1918 break;1919 1920 case 'blogname': ?>1921 <td class="column-title">1922 <a href="<?php echo esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ); ?>" class="edit"><?php echo $blogname . $blog_state; ?></a>1923 <?php1924 if ( 'list' != $mode )1925 echo '<p>' . sprintf( _x( '%1$s – <em>%2$s</em>', '%1$s: site name. %2$s: site tagline.' ), get_blog_option( $blog['blog_id'], 'blogname' ), get_blog_option( $blog['blog_id'], 'blogdescription ' ) ) . '</p>';1926 1927 // Preordered.1928 $actions = array(1929 'edit' => '', 'backend' => '',1930 'activate' => '', 'deactivate' => '',1931 'archive' => '', 'unarchive' => '',1932 'spam' => '', 'unspam' => '',1933 'delete' => '',1934 'visit' => '',1935 );1936 1937 $actions['edit'] = '<span class="edit"><a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ) . '">' . __( 'Edit' ) . '</a></span>';1938 $actions['backend'] = "<span class='backend'><a href='" . esc_url( get_admin_url( $blog['blog_id'] ) ) . "' class='edit'>" . __( 'Dashboard' ) . '</a></span>';1939 if ( $current_site->blog_id != $blog['blog_id'] ) {1940 if ( get_blog_status( $blog['blog_id'], 'deleted' ) == '1' )1941 $actions['activate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=activateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to activate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Activate' ) . '</a></span>';1942 else1943 $actions['deactivate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deactivateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to deactivate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Deactivate' ) . '</a></span>';1944 1945 if ( get_blog_status( $blog['blog_id'], 'archived' ) == '1' )1946 $actions['unarchive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unarchiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unarchive the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Unarchive' ) . '</a></span>';1947 else1948 $actions['archive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=archiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to archive the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Archive', 'verb; site' ) . '</a></span>';1949 1950 if ( get_blog_status( $blog['blog_id'], 'spam' ) == '1' )1951 $actions['unspam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unspamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unspam the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Not Spam', 'site' ) . '</a></span>';1952 else1953 $actions['spam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=spamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to mark the site %s as spam.' ), $blogname ) ) ) ) . '">' . _x( 'Spam', 'site' ) . '</a></span>';1954 1955 $actions['delete'] = '<span class="delete"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deleteblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to delete the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Delete' ) . '</a></span>';1956 }1957 1958 $actions['visit'] = "<span class='view'><a href='" . esc_url( get_home_url( $blog['blog_id'] ) ) . "' rel='permalink'>" . __( 'Visit' ) . '</a></span>';1959 $actions = array_filter( $actions );1960 echo $this->row_actions( $actions );1961 ?>1962 </td>1963 <?php1964 break;1965 1966 case 'lastupdated': ?>1967 <td valign="top">1968 <?php1969 if ( 'list' == $mode )1970 $date = 'Y/m/d';1971 else1972 $date = 'Y/m/d \<\b\r \/\> g:i:s a';1973 echo ( $blog['last_updated'] == '0000-00-00 00:00:00' ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] ); ?>1974 </td>1975 <?php1976 break;1977 case 'registered': ?>1978 <td valign="top">1979 <?php1980 if ( $blog['registered'] == '0000-00-00 00:00:00' )1981 echo '—';1982 else1983 echo mysql2date( $date, $blog['registered'] );1984 ?>1985 </td>1986 <?php1987 break;1988 case 'users': ?>1989 <td valign="top">1990 <?php1991 $blogusers = get_users( array( 'blog_id' => $blog['blog_id'], 'number' => 6) );1992 if ( is_array( $blogusers ) ) {1993 $blogusers_warning = '';1994 if ( count( $blogusers ) > 5 ) {1995 $blogusers = array_slice( $blogusers, 0, 5 );1996 $blogusers_warning = __( 'Only showing first 5 users.' ) . ' <a href="' . esc_url( get_admin_url( $blog['blog_id'], 'users.php' ) ) . '">' . __( 'More' ) . '</a>';1997 }1998 foreach ( $blogusers as $user_object ) {1999 echo '<a href="' . esc_url( admin_url( 'user-edit.php?user_id=' . $user_object->ID ) ) . '">' . esc_html( $user_object->user_login ) . '</a> ';2000 if ( 'list' != $mode )2001 echo '( ' . $user_object->user_email . ' )';2002 echo '<br />';2003 }2004 if ( $blogusers_warning != '' )2005 echo '<strong>' . $blogusers_warning . '</strong><br />';2006 }2007 ?>2008 </td>2009 <?php2010 break;2011 2012 case 'plugins': ?>2013 <?php if ( has_filter( 'wpmublogsaction' ) ) { ?>2014 <td valign="top">2015 <?php do_action( 'wpmublogsaction', $blog['blog_id'] ); ?>2016 </td>2017 <?php } ?>2018 <?php break;2019 2020 default: ?>2021 <?php if ( has_filter( 'manage_blogs_custom_column' ) ) { ?>2022 <td valign="top">2023 <?php do_action( 'manage_blogs_custom_column', $column_name, $blog['blog_id'] ); ?>2024 </td>2025 <?php } ?>2026 <?php break;2027 }2028 }2029 ?>2030 </tr>2031 <?php2032 }2033 }2034 }2035 2036 class WP_MS_Users_Table extends WP_List_Table {2037 2038 function WP_MS_Users_Table() {2039 parent::WP_List_Table( array(2040 'screen' => 'users-network',2041 ) );2042 }2043 2044 function check_permissions() {2045 if ( !is_multisite() )2046 wp_die( __( 'Multisite support is not enabled.' ) );2047 2048 if ( ! current_user_can( 'manage_network_users' ) )2049 wp_die( __( 'You do not have permission to access this page.' ) );2050 }2051 2052 function prepare_items() {2053 global $usersearch;2054 2055 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';2056 2057 $users_per_page = $this->get_items_per_page( 'users_network_per_page' );2058 2059 $paged = $this->get_pagenum();2060 2061 $args = array(2062 'number' => $users_per_page,2063 'offset' => ( $paged-1 ) * $users_per_page,2064 'search' => $usersearch,2065 'blog_id' => 02066 );2067 2068 if ( isset( $_REQUEST['orderby'] ) )2069 $args['orderby'] = $_REQUEST['orderby'];2070 2071 if ( isset( $_REQUEST['order'] ) )2072 $args['order'] = $_REQUEST['order'];2073 2074 // Query the user IDs for this page2075 $wp_user_search = new WP_User_Query( $args );2076 2077 $this->items = $wp_user_search->get_results();2078 2079 $this->set_pagination_args( array(2080 'total_items' => $wp_user_search->get_total(),2081 'per_page' => $users_per_page,2082 ) );2083 }2084 2085 function get_bulk_actions() {2086 $actions = array();2087 $actions['delete'] = __( 'Delete' );2088 $actions['spam'] = _x( 'Mark as Spam', 'user' );2089 $actions['notspam'] = _x( 'Not Spam', 'user' );2090 2091 return $actions;2092 }2093 2094 function no_items() {2095 _e( 'No users found.' );2096 }2097 2098 function pagination( $which ) {2099 global $mode;2100 2101 parent::pagination ( $which );2102 2103 if ( 'top' == $which )2104 $this->view_switcher( $mode );2105 }2106 2107 function get_columns() {2108 $users_columns = array(2109 'cb' => '<input type="checkbox" />',2110 'login' => __( 'Login' ),2111 'name' => __( 'Name' ),2112 'email' => __( 'E-mail' ),2113 'registered' => _x( 'Registered', 'user' ),2114 'blogs' => __( 'Sites' )2115 );2116 $users_columns = apply_filters( 'wpmu_users_columns', $users_columns );2117 2118 return $users_columns;2119 }2120 2121 function get_sortable_columns() {2122 return array(2123 'id' => 'id',2124 'login' => 'login',2125 'name' => 'name',2126 'email' => 'email',2127 'registered' => 'registered',2128 );2129 }2130 2131 function display_rows() {2132 global $current_site, $mode;2133 2134 $class = '';2135 $super_admins = get_super_admins();2136 foreach ( $this->items as $user ) {2137 $class = ( 'alternate' == $class ) ? '' : 'alternate';2138 2139 $status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' );2140 2141 foreach ( $status_list as $status => $col ) {2142 if ( $user->$status )2143 $class = $col;2144 }2145 2146 ?>2147 <tr class="<?php echo $class; ?>">2148 <?php2149 2150 list( $columns, $hidden ) = $this->get_column_info();2151 2152 foreach ( $columns as $column_name => $column_display_name ) :2153 switch ( $column_name ) {2154 case 'cb': ?>2155 <th scope="row" class="check-column">2156 <input type="checkbox" id="blog_<?php echo $user->ID ?>" name="allusers[]" value="<?php echo esc_attr( $user->ID ) ?>" />2157 </th>2158 <?php2159 break;2160 2161 case 'id': ?>2162 <th valign="top" scope="row">2163 <?php echo $user->ID ?>2164 </th>2165 <?php2166 break;2167 2168 case 'login':2169 $avatar = get_avatar( $user->user_email, 32 );2170 $edit_link = ( get_current_user_id() == $user->ID ) ? 'profile.php' : 'user-edit.php?user_id=' . $user->ID;2171 ?>2172 <td class="username column-username">2173 <?php echo $avatar; ?><strong><a href="<?php echo esc_url( self_admin_url( $edit_link ) ); ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a><?php2174 if ( in_array( $user->user_login, $super_admins ) )2175 echo ' - ' . __( 'Super admin' );2176 ?></strong>2177 <br/>2178 <?php2179 $actions = array();2180 $actions['edit'] = '<a href="' . esc_url( self_admin_url( $edit_link ) ) . '">' . __( 'Edit' ) . '</a>';2181 2182 if ( ! in_array( $user->user_login, $super_admins ) ) {2183 $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deleteuser' ) . '&action=deleteuser&id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';2184 }2185 2186 echo $this->row_actions( $actions );2187 ?>2188 </div>2189 </td>2190 <?php2191 break;2192 2193 case 'name': ?>2194 <td class="name column-name"><?php echo $user->display_name ?></td>2195 <?php2196 break;2197 2198 case 'email': ?>2199 <td class="email column-email"><a href="mailto:<?php echo $user->user_email ?>"><?php echo $user->user_email ?></a></td>2200 <?php2201 break;2202 2203 case 'registered':2204 if ( 'list' == $mode )2205 $date = 'Y/m/d';2206 else2207 $date = 'Y/m/d \<\b\r \/\> g:i:s a';2208 ?>2209 <td><?php echo mysql2date( $date, $user->user_registered ); ?></td>2210 <?php2211 break;2212 2213 case 'blogs':2214 $blogs = get_blogs_of_user( $user->ID, true );2215 ?>2216 <td>2217 <?php2218 if ( is_array( $blogs ) ) {2219 foreach ( (array) $blogs as $key => $val ) {2220 $path = ( $val->path == '/' ) ? '' : $val->path;2221 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . str_replace( '.' . $current_site->domain, '', $val->domain . $path ) . '</a>';2222 echo ' <small class="row-actions">';2223 2224 // Edit2225 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . __( 'Edit' ) . '</a> | ';2226 2227 // View2228 echo '<a ';2229 if ( get_blog_status( $val->userblog_id, 'spam' ) == 1 )2230 echo 'style="background-color: #faa" ';2231 echo 'href="' . esc_url( get_home_url( $val->userblog_id ) ) . '">' . __( 'View' ) . '</a>';2232 2233 echo '</small><br />';2234 }2235 }2236 ?>2237 </td>2238 <?php2239 break;2240 2241 default: ?>2242 <td><?php do_action( 'manage_users_custom_column', $column_name, $user->ID ); ?></td>2243 <?php2244 break;2245 }2246 endforeach2247 ?>2248 </tr>2249 <?php2250 }2251 }2252 }2253 2254 class WP_Plugins_Table extends WP_List_Table {2255 2256 function WP_Plugins_Table() {2257 global $status, $page;2258 2259 $default_status = get_user_option( 'plugins_last_view' );2260 if ( empty( $default_status ) )2261 $default_status = 'all';2262 $status = isset( $_REQUEST['plugin_status'] ) ? $_REQUEST['plugin_status'] : $default_status;2263 if ( !in_array( $status, array( 'all', 'active', 'inactive', 'recently_activated', 'upgrade', 'network', 'mustuse', 'dropins', 'search' ) ) )2264 $status = 'all';2265 if ( $status != $default_status && 'search' != $status )2266 update_user_meta( get_current_user_id(), 'plugins_last_view', $status );2267 2268 $page = $this->get_pagenum();2269 2270 parent::WP_List_Table( array(2271 'screen' => 'plugins',2272 'plural' => 'plugins',2273 ) );2274 }2275 2276 function check_permissions() {2277 if ( is_multisite() ) {2278 $menu_perms = get_site_option( 'menu_items', array() );2279 2280 if ( empty( $menu_perms['plugins'] ) ) {2281 if ( !is_super_admin() )2282 wp_die( __( 'Cheatin’ uh?' ) );2283 }2284 }2285 2286 if ( !current_user_can('activate_plugins') )2287 wp_die( __( 'You do not have sufficient permissions to manage plugins for this site.' ) );2288 }2289 2290 function prepare_items() {2291 global $status, $plugins, $totals, $page, $orderby, $order, $s;2292 2293 wp_reset_vars( array( 'orderby', 'order', 's' ) );2294 2295 $plugins = array(2296 'all' => apply_filters( 'all_plugins', get_plugins() ),2297 'search' => array(),2298 'active' => array(),2299 'inactive' => array(),2300 'recently_activated' => array(),2301 'upgrade' => array(),2302 'mustuse' => array(),2303 'dropins' => array()2304 );2305 2306 if ( ! is_multisite() || ( is_network_admin() && current_user_can('manage_network_plugins') ) ) {2307 if ( apply_filters( 'show_advanced_plugins', true, 'mustuse' ) )2308 $plugins['mustuse'] = get_mu_plugins();2309 if ( apply_filters( 'show_advanced_plugins', true, 'dropins' ) )2310 $plugins['dropins'] = get_dropins();2311 }2312 2313 set_transient( 'plugin_slugs', array_keys( $plugins['all'] ), 86400 );2314 2315 $recently_activated = get_option( 'recently_activated', array() );2316 2317 $one_week = 7*24*60*60;2318 foreach ( $recently_activated as $key => $time )2319 if ( $time + $one_week < time() )2320 unset( $recently_activated[$key] );2321 update_option( 'recently_activated', $recently_activated );2322 2323 $current = get_site_transient( 'update_plugins' );2324 2325 foreach ( array( 'all', 'mustuse', 'dropins' ) as $type ) {2326 foreach ( (array) $plugins[$type] as $plugin_file => $plugin_data ) {2327 // Translate, Apply Markup, Sanitize HTML2328 $plugins[$type][$plugin_file] = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, false, true );2329 }2330 }2331 2332 foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) {2333 // Filter into individual sections2334 if ( is_plugin_active_for_network($plugin_file) && !is_network_admin() ) {2335 unset( $plugins['all'][ $plugin_file ] );2336 continue;2337 } elseif ( is_multisite() && is_network_only_plugin( $plugin_file ) && !current_user_can( 'manage_network_plugins' ) ) {2338 $plugins['network'][ $plugin_file ] = $plugin_data;2339 } elseif ( ( !is_network_admin() && is_plugin_active( $plugin_file ) )2340 || ( is_network_admin() && is_plugin_active_for_network( $plugin_file ) ) ) {2341 $plugins['active'][ $plugin_file ] = $plugin_data;2342 } else {2343 if ( !is_network_admin() && isset( $recently_activated[ $plugin_file ] ) ) // Was the plugin recently activated?2344 $plugins['recently_activated'][ $plugin_file ] = $plugin_data;2345 $plugins['inactive'][ $plugin_file ] = $plugin_data;2346 }2347 2348 if ( isset( $current->response[ $plugin_file ] ) )2349 $plugins['upgrade'][ $plugin_file ] = $plugin_data;2350 }2351 2352 if ( !current_user_can( 'update_plugins' ) )2353 $plugins['upgrade'] = array();2354 2355 if ( $s ) {2356 $status = 'search';2357 $plugins['search'] = array_filter( $plugins['all'], array( $this, '_search_callback' ) );2358 }2359 2360 $totals = array();2361 foreach ( $plugins as $type => $list )2362 $totals[ $type ] = count( $list );2363 2364 if ( empty( $plugins[ $status ] ) && !in_array( $status, array( 'all', 'search' ) ) )2365 $status = 'all';2366 2367 $this->items = $plugins[ $status ];2368 $total_this_page = $totals[ $status ];2369 2370 if ( $orderby ) {2371 $orderby = ucfirst( $orderby );2372 $order = strtoupper( $order );2373 2374 uasort( $this->items, array( $this, '_order_callback' ) );2375 }2376 2377 $plugins_per_page = $this->get_items_per_page( 'plugins_per_page', 999 );2378 2379 $start = ( $page - 1 ) * $plugins_per_page;2380 2381 if ( $total_this_page > $plugins_per_page )2382 $this->items = array_slice( $this->items, $start, $plugins_per_page );2383 2384 $this->set_pagination_args( array(2385 'total_items' => $total_this_page,2386 'per_page' => $plugins_per_page,2387 ) );2388 }2389 2390 function _search_callback( $plugin ) {2391 static $term;2392 if ( is_null( $term ) )2393 $term = stripslashes( $_REQUEST['s'] );2394 2395 foreach ( $plugin as $value )2396 if ( stripos( $value, $term ) !== false )2397 return true;2398 2399 return false;2400 }2401 2402 function _order_callback( $plugin_a, $plugin_b ) {2403 global $orderby, $order;2404 2405 $a = $plugin_a[$orderby];2406 $b = $plugin_b[$orderby];2407 2408 if ( $a == $b )2409 return 0;2410 2411 if ( 'DESC' == $order )2412 return ( $a < $b ) ? 1 : -1;2413 else2414 return ( $a < $b ) ? -1 : 1;2415 }2416 2417 function no_items() {2418 global $plugins;2419 2420 if ( !empty( $plugins['all'] ) )2421 _e( 'No plugins found.' );2422 else2423 _e( 'You do not appear to have any plugins available at this time.' );2424 }2425 2426 function get_columns() {2427 global $status;2428 2429 return array(2430 'cb' => !in_array( $status, array( 'mustuse', 'dropins' ) ) ? '<input type="checkbox" />' : '',2431 'name' => __( 'Plugin' ),2432 'description' => __( 'Description' ),2433 );2434 }2435 2436 function get_sortable_columns() {2437 return array(2438 'name' => 'name',2439 'description' => 'description',2440 );2441 }2442 2443 function display_tablenav( $which ) {2444 global $status;2445 2446 if ( !in_array( $status, array( 'mustuse', 'dropins' ) ) )2447 parent::display_tablenav( $which );2448 }2449 2450 function get_views() {2451 global $totals, $status;2452 2453 $status_links = array();2454 foreach ( $totals as $type => $count ) {2455 if ( !$count )2456 continue;2457 2458 switch ( $type ) {2459 case 'all':2460 $text = _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $count, 'plugins' );2461 break;2462 case 'active':2463 $text = _n( 'Active <span class="count">(%s)</span>', 'Active <span class="count">(%s)</span>', $count );2464 break;2465 case 'recently_activated':2466 $text = _n( 'Recently Active <span class="count">(%s)</span>', 'Recently Active <span class="count">(%s)</span>', $count );2467 break;2468 case 'inactive':2469 $text = _n( 'Inactive <span class="count">(%s)</span>', 'Inactive <span class="count">(%s)</span>', $count );2470 break;2471 case 'network':2472 $text = _n( 'Network <span class="count">(%s)</span>', 'Network <span class="count">(%s)</span>', $count );2473 break;2474 case 'mustuse':2475 $text = _n( 'Must-Use <span class="count">(%s)</span>', 'Must-Use <span class="count">(%s)</span>', $count );2476 break;2477 case 'dropins':2478 $text = _n( 'Drop-ins <span class="count">(%s)</span>', 'Drop-ins <span class="count">(%s)</span>', $count );2479 break;2480 case 'upgrade':2481 $text = _n( 'Upgrade Available <span class="count">(%s)</span>', 'Upgrade Available <span class="count">(%s)</span>', $count );2482 break;2483 case 'search':2484 $text = _n( 'Search Results <span class="count">(%s)</span>', 'Search Results <span class="count">(%s)</span>', $count );2485 break;2486 }2487 2488 $status_links[$type] = sprintf( "<li><a href='%s' %s>%s</a>",2489 add_query_arg('plugin_status', $type, 'plugins.php'),2490 ( $type == $status ) ? ' class="current"' : '',2491 sprintf( $text, number_format_i18n( $count ) )2492 );2493 }2494 2495 return $status_links;2496 }2497 2498 function get_bulk_actions() {2499 global $status;2500 2501 $actions = array();2502 if ( 'active' != $status )2503 $actions['activate-selected'] = __( 'Activate' );2504 if ( is_multisite() && 'network' != $status )2505 $actions['network-activate-selected'] = __( 'Network Activate' );2506 if ( 'inactive' != $status && 'recent' != $status )2507 $actions['deactivate-selected'] = __( 'Deactivate' );2508 if ( current_user_can( 'update_plugins' ) )2509 $actions['update-selected'] = __( 'Update' );2510 if ( current_user_can( 'delete_plugins' ) && ( 'active' != $status ) )2511 $actions['delete-selected'] = __( 'Delete' );2512 2513 return $actions;2514 }2515 2516 function bulk_actions( $which ) {2517 global $status;2518 2519 if ( in_array( $status, array( 'mustuse', 'dropins' ) ) )2520 return;2521 2522 parent::bulk_actions( $which );2523 }2524 2525 function extra_tablenav( $which ) {2526 global $status;2527 2528 if ( 'recently_activated' == $status ) { ?>2529 <div class="alignleft actions">2530 <input type="submit" name="clear-recent-list" value="<?php esc_attr_e( 'Clear List' ) ?>" class="button-secondary" />2531 </div>2532 <?php }2533 }2534 2535 function current_action() {2536 if ( isset($_POST['clear-recent-list']) )2537 return 'clear-recent-list';2538 2539 return parent::current_action();2540 }2541 2542 function display_rows() {2543 global $status, $page, $s;2544 2545 $context = $status;2546 2547 foreach ( $this->items as $plugin_file => $plugin_data ) {2548 // preorder2549 $actions = array(2550 'network_deactivate' => '', 'deactivate' => '',2551 'network_only' => '', 'activate' => '',2552 'network_activate' => '',2553 'edit' => '',2554 'delete' => '',2555 );2556 2557 if ( 'mustuse' == $context ) {2558 if ( is_multisite() && !is_network_admin() )2559 continue;2560 $is_active = true;2561 } elseif ( 'dropins' == $context ) {2562 if ( is_multisite() && !is_network_admin() )2563 continue;2564 $dropins = _get_dropins();2565 $plugin_name = $plugin_file;2566 if ( $plugin_file != $plugin_data['Name'] )2567 $plugin_name .= '<br/>' . $plugin_data['Name'];2568 if ( true === ( $dropins[ $plugin_file ][1] ) ) { // Doesn't require a constant2569 $is_active = true;2570 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';2571 } elseif ( constant( $dropins[ $plugin_file ][1] ) ) { // Constant is true2572 $is_active = true;2573 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';2574 } else {2575 $is_active = false;2576 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . ' <span class="attention">' . __('Inactive:') . '</span></strong> ' . sprintf( __( 'Requires <code>%s</code> in <code>wp-config.php</code>.' ), "define('" . $dropins[ $plugin_file ][1] . "', true);" ) . '</p>';2577 }2578 if ( $plugin_data['Description'] )2579 $description .= '<p>' . $plugin_data['Description'] . '</p>';2580 } else {2581 $is_active_for_network = is_plugin_active_for_network($plugin_file);2582 if ( is_network_admin() )2583 $is_active = $is_active_for_network;2584 else2585 $is_active = is_plugin_active( $plugin_file );2586 2587 if ( $is_active_for_network && !is_super_admin() && !is_network_admin() )2588 continue;2589 2590 if ( is_network_admin() ) {2591 if ( $is_active_for_network ) {2592 if ( current_user_can( 'manage_network_plugins' ) )2593 $actions['network_deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Network Deactivate') . '</a>';2594 } else {2595 if ( current_user_can( 'manage_network_plugins' ) )2596 $actions['network_activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin for all sites in this network') . '" class="edit">' . __('Network Activate') . '</a>';2597 if ( current_user_can('delete_plugins') )2598 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';2599 }2600 } else {2601 if ( $is_active ) {2602 $actions['deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Deactivate') . '</a>';2603 } else {2604 if ( is_network_only_plugin( $plugin_file ) && !is_network_admin() )2605 continue;2606 2607 $actions['activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin') . '" class="edit">' . __('Activate') . '</a>';2608 2609 if ( current_user_can('delete_plugins') )2610 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';2611 } // end if $is_active2612 } // end if is_network_admin()2613 2614 if ( current_user_can('edit_plugins') && is_writable(WP_PLUGIN_DIR . '/' . $plugin_file) )2615 $actions['edit'] = '<a href="plugin-editor.php?file=' . $plugin_file . '" title="' . __('Open this file in the Plugin Editor') . '" class="edit">' . __('Edit') . '</a>';2616 } // end if $context2617 2618 $actions = apply_filters( 'plugin_action_links', array_filter( $actions ), $plugin_file, $plugin_data, $context );2619 $actions = apply_filters( "plugin_action_links_$plugin_file", $actions, $plugin_file, $plugin_data, $context );2620 2621 $class = $is_active ? 'active' : 'inactive';2622 $checkbox = in_array( $status, array( 'mustuse', 'dropins' ) ) ? '' : "<input type='checkbox' name='checked[]' value='" . esc_attr( $plugin_file ) . "' />";2623 if ( 'dropins' != $status ) {2624 $description = '<p>' . $plugin_data['Description'] . '</p>';2625 $plugin_name = $plugin_data['Name'];2626 }2627 2628 $id = sanitize_title( $plugin_name );2629 2630 echo "2631 <tr id='$id' class='$class'>2632 <th scope='row' class='check-column'>$checkbox</th>2633 <td class='plugin-title'><strong>$plugin_name</strong></td>2634 <td class='desc'>$description</td>2635 </tr>2636 <tr class='$class second'>2637 <td></td>2638 <td class='plugin-title'>";2639 2640 echo $this->row_actions( $actions, true );2641 2642 echo "</td>2643 <td class='desc'>";2644 $plugin_meta = array();2645 if ( !empty( $plugin_data['Version'] ) )2646 $plugin_meta[] = sprintf( __( 'Version %s' ), $plugin_data['Version'] );2647 if ( !empty( $plugin_data['Author'] ) ) {2648 $author = $plugin_data['Author'];2649 if ( !empty( $plugin_data['AuthorURI'] ) )2650 $author = '<a href="' . $plugin_data['AuthorURI'] . '" title="' . __( 'Visit author homepage' ) . '">' . $plugin_data['Author'] . '</a>';2651 $plugin_meta[] = sprintf( __( 'By %s' ), $author );2652 }2653 if ( ! empty( $plugin_data['PluginURI'] ) )2654 $plugin_meta[] = '<a href="' . $plugin_data['PluginURI'] . '" title="' . __( 'Visit plugin site' ) . '">' . __( 'Visit plugin site' ) . '</a>';2655 2656 $plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status );2657 echo implode( ' | ', $plugin_meta );2658 echo "</td>2659 </tr>\n";2660 2661 do_action( 'after_plugin_row', $plugin_file, $plugin_data, $status );2662 do_action( "after_plugin_row_$plugin_file", $plugin_file, $plugin_data, $status );2663 }2664 }2665 }2666 2667 class WP_Plugin_Install_Table extends WP_List_Table {2668 2669 function WP_Plugin_Install_Table() {2670 parent::WP_List_Table( array(2671 'screen' => 'plugin-install',2672 ) );2673 }2674 2675 function check_permissions() {2676 if ( ! current_user_can('install_plugins') )2677 wp_die(__('You do not have sufficient permissions to install plugins on this site.'));2678 }2679 2680 function prepare_items() {2681 include( ABSPATH . 'wp-admin/includes/plugin-install.php' );2682 2683 global $tabs, $tab, $paged, $type, $term;2684 2685 wp_reset_vars( array( 'tab' ) );2686 2687 $paged = $this->get_pagenum();2688 2689 $per_page = 30;2690 2691 // These are the tabs which are shown on the page2692 $tabs = array();2693 $tabs['dashboard'] = __( 'Search' );2694 if ( 'search' == $tab )2695 $tabs['search'] = __( 'Search Results' );2696 $tabs['upload'] = __( 'Upload' );2697 $tabs['featured'] = _x( 'Featured','Plugin Installer' );2698 $tabs['popular'] = _x( 'Popular','Plugin Installer' );2699 $tabs['new'] = _x( 'Newest','Plugin Installer' );2700 $tabs['updated'] = _x( 'Recently Updated','Plugin Installer' );2701 2702 $nonmenu_tabs = array( 'plugin-information' ); //Valid actions to perform which do not have a Menu item.2703 2704 $tabs = apply_filters( 'install_plugins_tabs', $tabs );2705 $nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs );2706 2707 // If a non-valid menu tab has been selected, And its not a non-menu action.2708 if ( empty( $tab ) || ( !isset( $tabs[ $tab ] ) && !in_array( $tab, (array) $nonmenu_tabs ) ) )2709 $tab = key( $tabs );2710 2711 $args = array( 'page' => $paged, 'per_page' => $per_page );2712 2713 switch ( $tab ) {2714 case 'search':2715 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : '';2716 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '';2717 2718 switch ( $type ) {2719 case 'tag':2720 $args['tag'] = sanitize_title_with_dashes( $term );2721 break;2722 case 'term':2723 $args['search'] = $term;2724 break;2725 case 'author':2726 $args['author'] = $term;2727 break;2728 }2729 2730 add_action( 'install_plugins_table_header', 'install_search_form' );2731 break;2732 2733 case 'featured':2734 case 'popular':2735 case 'new':2736 case 'updated':2737 $args['browse'] = $tab;2738 break;2739 2740 default:2741 $args = false;2742 }2743 2744 if ( !$args )2745 return;2746 2747 $api = plugins_api( 'query_plugins', $args );2748 2749 if ( is_wp_error( $api ) )2750 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' );2751 2752 $this->items = $api->plugins;2753 2754 $this->set_pagination_args( array(2755 'total_items' => $api->info['results'],2756 'per_page' => $per_page,2757 ) );2758 }2759 2760 function no_items() {2761 _e( 'No plugins match your request.' );2762 }2763 2764 function get_views() {2765 global $tabs, $tab;2766 2767 $display_tabs = array();2768 foreach ( (array) $tabs as $action => $text ) {2769 $class = ( $action == $tab ) ? ' class="current"' : '';2770 $href = admin_url('plugin-install.php?tab=' . $action);2771 $display_tabs[$action] = "<a href='$href'$class>$text</a>";2772 }2773 2774 return $display_tabs;2775 }2776 2777 function display_tablenav( $which ) {2778 if ( 'top' == $which ) { ?>2779 <div class="tablenav">2780 <div class="alignleft actions">2781 <?php do_action( 'install_plugins_table_header' ); ?>2782 </div>2783 <?php $this->pagination( $which ); ?>2784 <br class="clear" />2785 </div>2786 <?php } else { ?>2787 <div class="tablenav">2788 <?php $this->pagination( $which ); ?>2789 <br class="clear" />2790 </div>2791 <?php2792 }2793 }2794 2795 function get_table_classes() {2796 extract( $this->_args );2797 2798 return array( 'widefat', $plural );2799 }2800 2801 function get_columns() {2802 return array(2803 'name' => __( 'Name' ),2804 'version' => __( 'Version' ),2805 'rating' => __( 'Rating' ),2806 'description' => __( 'Description' ),2807 );2808 }2809 2810 function display_rows() {2811 $plugins_allowedtags = array(2812 'a' => array( 'href' => array(),'title' => array(), 'target' => array() ),2813 'abbr' => array( 'title' => array() ),'acronym' => array( 'title' => array() ),2814 'code' => array(), 'pre' => array(), 'em' => array(),'strong' => array(),2815 'ul' => array(), 'ol' => array(), 'li' => array(), 'p' => array(), 'br' => array()2816 );2817 2818 foreach ( (array) $this->items as $plugin ) {2819 if ( is_object( $plugin ) )2820 $plugin = (array) $plugin;2821 2822 $title = wp_kses( $plugin['name'], $plugins_allowedtags );2823 //Limit description to 400char, and remove any HTML.2824 $description = strip_tags( $plugin['description'] );2825 if ( strlen( $description ) > 400 )2826 $description = mb_substr( $description, 0, 400 ) . '…';2827 //remove any trailing entities2828 $description = preg_replace( '/&[^;\s]{0,6}$/', '', $description );2829 //strip leading/trailing & multiple consecutive lines2830 $description = trim( $description );2831 $description = preg_replace( "|(\r?\n)+|", "\n", $description );2832 //\n => <br>2833 $description = nl2br( $description );2834 $version = wp_kses( $plugin['version'], $plugins_allowedtags );2835 2836 $name = strip_tags( $title . ' ' . $version );2837 2838 $author = $plugin['author'];2839 if ( ! empty( $plugin['author'] ) )2840 $author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '.</cite>';2841 2842 $author = wp_kses( $author, $plugins_allowedtags );2843 2844 $action_links = array();2845 $action_links[] = '<a href="' . admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin['slug'] .2846 '&TB_iframe=true&width=600&height=550' ) . '" class="thickbox" title="' .2847 esc_attr( sprintf( __( 'More information about %s' ), $name ) ) . '">' . __( 'Details' ) . '</a>';2848 2849 if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) {2850 $status = install_plugin_install_status( $plugin );2851 2852 switch ( $status['status'] ) {2853 case 'install':2854 if ( $status['url'] )2855 $action_links[] = '<a class="install-now" href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Install %s' ), $name ) ) . '">' . __( 'Install Now' ) . '</a>';2856 break;2857 case 'update_available':2858 if ( $status['url'] )2859 $action_links[] = '<a href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Update to version %s' ), $status['version'] ) ) . '">' . sprintf( __( 'Update Now' ), $status['version'] ) . '</a>';2860 break;2861 case 'latest_installed':2862 case 'newer_installed':2863 $action_links[] = '<span title="' . esc_attr__( 'This plugin is already installed and is up to date' ) . ' ">' . __( 'Installed' ) . '</span>';2864 break;2865 }2866 }2867 2868 $action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin );2869 ?>2870 <tr>2871 <td class="name"><strong><?php echo $title; ?></strong>2872 <div class="action-links"><?php if ( !empty( $action_links ) ) echo implode( ' | ', $action_links ); ?></div>2873 </td>2874 <td class="vers"><?php echo $version; ?></td>2875 <td class="vers">2876 <div class="star-holder" title="<?php printf( _n( '( based on %s rating )', '( based on %s ratings )', $plugin['num_ratings'] ), number_format_i18n( $plugin['num_ratings'] ) ) ?>">2877 <div class="star star-rating" style="width: <?php echo esc_attr( $plugin['rating'] ) ?>px"></div>2878 <div class="star star5"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '5 stars' ) ?>" /></div>2879 <div class="star star4"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '4 stars' ) ?>" /></div>2880 <div class="star star3"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '3 stars' ) ?>" /></div>2881 <div class="star star2"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '2 stars' ) ?>" /></div>2882 <div class="star star1"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '1 star' ) ?>" /></div>2883 </div>2884 </td>2885 <td class="desc"><?php echo $description, $author; ?></td>2886 </tr>2887 <?php2888 }2889 }2890 }2891 2892 class WP_Themes_Table extends WP_List_Table {2893 2894 var $search = array();2895 var $features = array();2896 2897 function WP_Themes_Table() {2898 parent::__construct( array(2899 'screen' => 'themes',2900 ) );2901 }2902 2903 function check_permissions() {2904 if ( !current_user_can('switch_themes') && !current_user_can('edit_theme_options') )2905 wp_die( __( 'Cheatin’ uh?' ) );2906 }2907 2908 function prepare_items() {2909 global $ct;2910 2911 $ct = current_theme_info();2912 2913 $themes = get_allowed_themes();2914 2915 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';2916 2917 if ( '' !== $search ) {2918 $this->search = array_merge( $this->search, array_filter( array_map( 'trim', explode( ',', $search ) ) ) );2919 $this->search = array_unique( $this->search );2920 }2921 2922 if ( !empty( $_REQUEST['features'] ) ) {2923 $this->features = $_REQUEST['features'];2924 $this->features = array_map( 'trim', $this->features );2925 $this->features = array_map( 'sanitize_title_with_dashes', $this->features );2926 $this->features = array_unique( $this->features );2927 }2928 2929 if ( $this->search || $this->features ) {2930 foreach ( $themes as $key => $theme ) {2931 if ( !$this->search_theme( $theme ) )2932 unset( $themes[ $key ] );2933 }2934 }2935 2936 unset( $themes[$ct->name] );2937 uksort( $themes, "strnatcasecmp" );2938 2939 $per_page = 15;2940 $page = $this->get_pagenum();2941 2942 $start = ( $page - 1 ) * $per_page;2943 2944 $this->items = array_slice( $themes, $start, $per_page );2945 2946 $this->set_pagination_args( array(2947 'query_var' => 'pagenum',2948 'total_items' => count( $themes ),2949 'per_page' => $per_page,2950 ) );2951 }2952 2953 function no_items() {2954 if ( current_user_can( 'install_themes' ) )2955 printf( __( 'You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress.org Theme Directory at any time: just click on the <em><a href="%s">Install Themes</a></em> tab above.' ), 'theme-install.php' );2956 else2957 printf( __( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ), get_site_option( 'site_name' ) );2958 }2959 2960 function display_table() {2961 ?>2962 <div class="tablenav">2963 <?php $this->pagination( 'top' ); ?>2964 <br class="clear" />2965 </div>2966 2967 <table id="availablethemes" cellspacing="0" cellpadding="0">2968 <tbody id="the-list" class="list:themes">2969 <?php $this->display_rows(); ?>2970 </tbody>2971 </table>2972 2973 <div class="tablenav">2974 <?php $this->pagination( 'bottom' ); ?>2975 <br class="clear" />2976 </div>2977 <?php2978 }2979 2980 function get_columns() {2981 return array();2982 }2983 2984 function display_rows() {2985 $themes = $this->items;2986 $theme_names = array_keys( $themes );2987 natcasesort( $theme_names );2988 2989 $table = array();2990 $rows = ceil( count( $theme_names ) / 3 );2991 for ( $row = 1; $row <= $rows; $row++ )2992 for ( $col = 1; $col <= 3; $col++ )2993 $table[$row][$col] = array_shift( $theme_names );2994 2995 foreach ( $table as $row => $cols ) {2996 ?>2997 <tr>2998 <?php2999 foreach ( $cols as $col => $theme_name ) {3000 $class = array( 'available-theme' );3001 if ( $row == 1 ) $class[] = 'top';3002 if ( $col == 1 ) $class[] = 'left';3003 if ( $row == $rows ) $class[] = 'bottom';3004 if ( $col == 3 ) $class[] = 'right';3005 ?>3006 <td class="<?php echo join( ' ', $class ); ?>">3007 <?php if ( !empty( $theme_name ) ) :3008 $template = $themes[$theme_name]['Template'];3009 $stylesheet = $themes[$theme_name]['Stylesheet'];3010 $title = $themes[$theme_name]['Title'];3011 $version = $themes[$theme_name]['Version'];3012 $description = $themes[$theme_name]['Description'];3013 $author = $themes[$theme_name]['Author'];3014 $screenshot = $themes[$theme_name]['Screenshot'];3015 $stylesheet_dir = $themes[$theme_name]['Stylesheet Dir'];3016 $template_dir = $themes[$theme_name]['Template Dir'];3017 $parent_theme = $themes[$theme_name]['Parent Theme'];3018 $theme_root = $themes[$theme_name]['Theme Root'];3019 $theme_root_uri = $themes[$theme_name]['Theme Root URI'];3020 $preview_link = esc_url( get_option( 'home' ) . '/' );3021 if ( is_ssl() )3022 $preview_link = str_replace( 'http://', 'https://', $preview_link );3023 $preview_link = htmlspecialchars( add_query_arg( array( 'preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'TB_iframe' => 'true' ), $preview_link ) );3024 $preview_text = esc_attr( sprintf( __( 'Preview of “%s”' ), $title ) );3025 $tags = $themes[$theme_name]['Tags'];3026 $thickbox_class = 'thickbox thickbox-preview';3027 $activate_link = wp_nonce_url( "themes.php?action=activate&template=".urlencode( $template )."&stylesheet=".urlencode( $stylesheet ), 'switch-theme_' . $template );3028 $activate_text = esc_attr( sprintf( __( 'Activate “%s”' ), $title ) );3029 $actions = array();3030 $actions[] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __( 'Activate' ) . '</a>';3031 $actions[] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr( sprintf( __( 'Preview “%s”' ), $theme_name ) ) . '">' . __( 'Preview' ) . '</a>';3032 if ( current_user_can( 'delete_themes' ) )3033 $actions[] = '<a class="submitdelete deletion" href="' . wp_nonce_url( "themes.php?action=delete&template=$stylesheet", 'delete-theme_' . $stylesheet ) . '" onclick="' . "return confirm( '" . esc_js( sprintf( __( "You are about to delete this theme '%s'\n 'Cancel' to stop, 'OK' to delete." ), $theme_name ) ) . "' );" . '">' . __( 'Delete' ) . '</a>';3034 $actions = apply_filters( 'theme_action_links', $actions, $themes[$theme_name] );3035 3036 $actions = implode ( ' | ', $actions );3037 ?>3038 <a href="<?php echo $preview_link; ?>" class="<?php echo $thickbox_class; ?> screenshot">3039 <?php if ( $screenshot ) : ?>3040 <img src="<?php echo $theme_root_uri . '/' . $stylesheet . '/' . $screenshot; ?>" alt="" />3041 <?php endif; ?>3042 </a>3043 <h3><?php3044 /* translators: 1: theme title, 2: theme version, 3: theme author */3045 printf( __( '%1$s %2$s by %3$s' ), $title, $version, $author ) ; ?></h3>3046 <p class="description"><?php echo $description; ?></p>3047 <span class='action-links'><?php echo $actions ?></span>3048 <?php if ( current_user_can( 'edit_themes' ) && $parent_theme ) {3049 /* translators: 1: theme title, 2: template dir, 3: stylesheet_dir, 4: theme title, 5: parent_theme */ ?>3050 <p><?php printf( __( 'The template files are located in <code>%2$s</code>. The stylesheet files are located in <code>%3$s</code>. <strong>%4$s</strong> uses templates from <strong>%5$s</strong>. Changes made to the templates will affect both themes.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ), $title, $parent_theme ); ?></p>3051 <?php } else { ?>3052 <p><?php printf( __( 'All of this theme’s files are located in <code>%2$s</code>.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ) ); ?></p>3053 <?php } ?>3054 <?php if ( $tags ) : ?>3055 <p><?php _e( 'Tags:' ); ?> <?php echo join( ', ', $tags ); ?></p>3056 <?php endif; ?>3057 <?php theme_update_available( $themes[$theme_name] ); ?>3058 <?php endif; // end if not empty theme_name ?>3059 </td>3060 <?php } // end foreach $cols ?>3061 </tr>3062 <?php } // end foreach $table3063 }3064 3065 function search_theme( $theme ) {3066 $matched = 0;3067 3068 // Match all phrases3069 if ( count( $this->search ) > 0 ) {3070 foreach ( $this->search as $word ) {3071 $matched = 0;3072 3073 // In a tag?3074 if ( in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) )3075 $matched = 1;3076 3077 // In one of the fields?3078 foreach ( array( 'Name', 'Title', 'Description', 'Author', 'Template', 'Stylesheet' ) AS $field ) {3079 if ( stripos( $theme[$field], $word ) !== false )3080 $matched++;3081 }3082 3083 if ( $matched == 0 )3084 return false;3085 }3086 }3087 3088 // Now search the features3089 if ( count( $this->features ) > 0 ) {3090 foreach ( $this->features as $word ) {3091 // In a tag?3092 if ( !in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) )3093 return false;3094 }3095 }3096 3097 // Only get here if each word exists in the tags or one of the fields3098 return true;3099 }3100 }3101 3102 class WP_Theme_Install_Table extends WP_List_Table {3103 3104 function WP_Theme_Install_Table() {3105 parent::WP_List_Table( array(3106 'screen' => 'theme-install',3107 ) );3108 }3109 3110 function check_permissions() {3111 if ( ! current_user_can('install_themes') )3112 wp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) );3113 }3114 3115 function prepare_items() {3116 include( ABSPATH . 'wp-admin/includes/theme-install.php' );3117 3118 global $tabs, $tab, $paged, $type, $term, $theme_field_defaults;3119 3120 wp_reset_vars( array( 'tab' ) );3121 3122 $paged = $this->get_pagenum();3123 3124 $per_page = 30;3125 3126 // These are the tabs which are shown on the page,3127 $tabs = array();3128 $tabs['dashboard'] = __( 'Search' );3129 if ( 'search' == $tab )3130 $tabs['search'] = __( 'Search Results' );3131 $tabs['upload'] = __( 'Upload' );3132 $tabs['featured'] = _x( 'Featured','Theme Installer' );3133 //$tabs['popular'] = _x( 'Popular','Theme Installer' );3134 $tabs['new'] = _x( 'Newest','Theme Installer' );3135 $tabs['updated'] = _x( 'Recently Updated','Theme Installer' );3136 3137 $nonmenu_tabs = array( 'theme-information' ); // Valid actions to perform which do not have a Menu item.3138 3139 $tabs = apply_filters( 'install_themes_tabs', $tabs );3140 $nonmenu_tabs = apply_filters( 'install_themes_nonmenu_tabs', $nonmenu_tabs );3141 3142 // If a non-valid menu tab has been selected, And its not a non-menu action.3143 if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs ) ) )3144 $tab = key( $tabs );3145 3146 $args = array( 'page' => $paged, 'per_page' => $per_page, 'fields' => $theme_field_defaults );3147 3148 switch ( $tab ) {3149 case 'search':3150 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : '';3151 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '';3152 3153 switch ( $type ) {3154 case 'tag':3155 $terms = explode( ',', $term );3156 $terms = array_map( 'trim', $terms );3157 $terms = array_map( 'sanitize_title_with_dashes', $terms );3158 $args['tag'] = $terms;3159 break;3160 case 'term':3161 $args['search'] = $term;3162 break;3163 case 'author':3164 $args['author'] = $term;3165 break;3166 }3167 3168 if ( !empty( $_POST['features'] ) ) {3169 $terms = $_POST['features'];3170 $terms = array_map( 'trim', $terms );3171 $terms = array_map( 'sanitize_title_with_dashes', $terms );3172 $args['tag'] = $terms;3173 $_REQUEST['s'] = implode( ',', $terms );3174 $_REQUEST['type'] = 'tag';3175 }3176 3177 add_action( 'install_themes_table_header', 'install_theme_search_form' );3178 break;3179 3180 case 'featured':3181 //case 'popular':3182 case 'new':3183 case 'updated':3184 $args['browse'] = $tab;3185 break;3186 3187 default:3188 $args = false;3189 }3190 3191 if ( !$args )3192 return;3193 3194 $api = themes_api( 'query_themes', $args );3195 3196 if ( is_wp_error( $api ) )3197 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' );3198 3199 $this->items = $api->themes;3200 3201 $this->set_pagination_args( array(3202 'total_items' => $api->info['results'],3203 'per_page' => $per_page,3204 ) );3205 }3206 3207 function no_items() {3208 _e( 'No themes match your request.' );3209 }3210 3211 function get_views() {3212 global $tabs, $tab;3213 3214 $display_tabs = array();3215 foreach ( (array) $tabs as $action => $text ) {3216 $class = ( $action == $tab ) ? ' class="current"' : '';3217 $href = self_admin_url('theme-install.php?tab=' . $action);3218 $display_tabs[$action] = "<a href='$href'$class>$text</a>";3219 }3220 3221 return $display_tabs;3222 }3223 3224 function get_columns() {3225 return array();3226 }3227 3228 function display_table() {3229 ?>3230 <div class="tablenav">3231 <div class="alignleft actions">3232 <?php do_action( 'install_themes_table_header' ); ?>3233 </div>3234 <?php $this->pagination( 'top' ); ?>3235 <br class="clear" />3236 </div>3237 3238 <table id="availablethemes" cellspacing="0" cellpadding="0">3239 <tbody id="the-list" class="list:themes">3240 <?php $this->display_rows(); ?>3241 </tbody>3242 </table>3243 3244 <div class="tablenav">3245 <?php $this->pagination( 'bottom' ); ?>3246 <br class="clear" />3247 </div>3248 <?php3249 }3250 3251 function display_rows() {3252 $themes = $this->items;3253 3254 $rows = ceil( count( $themes ) / 3 );3255 $table = array();3256 $theme_keys = array_keys( $themes );3257 for ( $row = 1; $row <= $rows; $row++ )3258 for ( $col = 1; $col <= 3; $col++ )3259 $table[$row][$col] = array_shift( $theme_keys );3260 3261 foreach ( $table as $row => $cols ) {3262 echo "\t<tr>\n";3263 foreach ( $cols as $col => $theme_index ) {3264 $class = array( 'available-theme' );3265 if ( $row == 1 ) $class[] = 'top';3266 if ( $col == 1 ) $class[] = 'left';3267 if ( $row == $rows ) $class[] = 'bottom';3268 if ( $col == 3 ) $class[] = 'right';3269 ?>3270 <td class="<?php echo join( ' ', $class ); ?>"><?php3271 if ( isset( $themes[$theme_index] ) )3272 display_theme( $themes[$theme_index] );3273 ?></td>3274 <?php } // end foreach $cols3275 echo "\t</tr>\n";3276 } // end foreach $table3277 }3278 }3279 -
trunk/wp-admin/includes/list-table-links.php
r15954 r15955 9 9 * @subpackage Administration 10 10 */ 11 12 class WP_Media_Table extends WP_List_Table {13 14 function WP_Media_Table() {15 global $detached;16 17 $detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );18 19 parent::WP_List_Table( array(20 'screen' => $detached ? 'upload-detached' : 'upload',21 'plural' => 'media'22 ) );23 }24 25 function check_permissions() {26 if ( !current_user_can('upload_files') )27 wp_die( __( 'You do not have permission to upload files.' ) );28 }29 30 function prepare_items() {31 global $lost, $wpdb, $wp_query, $post_mime_types, $avail_post_mime_types;32 33 $q = $_REQUEST;34 35 if ( !empty( $lost ) )36 $q['post__in'] = implode( ',', $lost );37 38 list( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $q );39 40 $this->is_trash = isset( $_REQUEST['status'] ) && 'trash' == $_REQUEST['status'];41 42 $this->set_pagination_args( array(43 'total_items' => $wp_query->found_posts,44 'total_pages' => $wp_query->max_num_pages,45 'per_page' => $wp_query->query_vars['posts_per_page'],46 ) );47 }48 49 function get_views() {50 global $wpdb, $post_mime_types, $detached, $avail_post_mime_types;51 52 $type_links = array();53 $_num_posts = (array) wp_count_attachments();54 $_total_posts = array_sum($_num_posts) - $_num_posts['trash'];55 if ( !isset( $total_orphans ) )56 $total_orphans = $wpdb->get_var( "SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent < 1" );57 $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));58 foreach ( $matches as $type => $reals )59 foreach ( $reals as $real )60 $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];61 62 $class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : '';63 $type_links['all'] = "<li><a href='upload.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $_total_posts, 'uploaded files' ), number_format_i18n( $_total_posts ) ) . '</a>';64 foreach ( $post_mime_types as $mime_type => $label ) {65 $class = '';66 67 if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )68 continue;69 70 if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )71 $class = ' class="current"';72 if ( !empty( $num_posts[$mime_type] ) )73 $type_links[$mime_type] = "<li><a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( _n( $label[2][0], $label[2][1], $num_posts[$mime_type] ), number_format_i18n( $num_posts[$mime_type] )) . '</a>';74 }75 $type_links['detached'] = '<li><a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( _nx( 'Unattached <span class="count">(%s)</span>', 'Unattached <span class="count">(%s)</span>', $total_orphans, 'detached files' ), number_format_i18n( $total_orphans ) ) . '</a>';76 77 if ( !empty($_num_posts['trash']) )78 $type_links['trash'] = '<li><a href="upload.php?status=trash"' . ( (isset($_GET['status']) && $_GET['status'] == 'trash' ) ? ' class="current"' : '') . '>' . sprintf( _nx( 'Trash <span class="count">(%s)</span>', 'Trash <span class="count">(%s)</span>', $_num_posts['trash'], 'uploaded files' ), number_format_i18n( $_num_posts['trash'] ) ) . '</a>';79 80 return $type_links;81 }82 83 function get_bulk_actions() {84 global $detached;85 86 $actions = array();87 $actions['delete'] = __( 'Delete Permanently' );88 if ( $detached )89 $actions['attach'] = __( 'Attach to a post' );90 91 return $actions;92 }93 94 function extra_tablenav( $which ) {95 global $post_type, $detached;96 ?>97 <div class="alignleft actions">98 <?php99 if ( 'top' == $which && !is_singular() && !$detached && !$this->is_trash ) {100 $this->months_dropdown( $post_type );101 102 do_action( 'restrict_manage_posts' );103 ?>104 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />105 <?php106 }107 108 if ( $detached ) { ?>109 <input type="submit" id="find_detached" name="find_detached" value="<?php esc_attr_e( 'Scan for lost attachments' ); ?>" class="button-secondary" />110 <?php } elseif ( $this->is_trash && current_user_can( 'edit_others_posts' ) ) { ?>111 <input type="submit" id="delete_all" name="delete_all" value="<?php esc_attr_e( 'Empty Trash' ); ?>" class="button-secondary apply" />112 <?php } ?>113 </div>114 <?php115 }116 117 function current_action() {118 if ( isset( $_REQUEST['find_detached'] ) )119 return 'find_detached';120 121 if ( isset( $_REQUEST['found_post_id'] ) && isset( $_REQUEST['media'] ) )122 return 'attach';123 124 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )125 return 'delete_all';126 127 return parent::current_action();128 }129 130 function has_items() {131 return have_posts();132 }133 134 function no_items() {135 _e( 'No media attachments found.' );136 }137 138 function get_columns() {139 $posts_columns = array();140 $posts_columns['cb'] = '<input type="checkbox" />';141 $posts_columns['icon'] = '';142 /* translators: column name */143 $posts_columns['title'] = _x( 'File', 'column name' );144 $posts_columns['author'] = __( 'Author' );145 //$posts_columns['tags'] = _x( 'Tags', 'column name' );146 /* translators: column name */147 if ( 'upload' == $this->_screen->id ) {148 $posts_columns['parent'] = _x( 'Attached to', 'column name' );149 $posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="' . esc_url( admin_url( 'images/comment-grey-bubble.png' ) ) . '" /></div>';150 }151 /* translators: column name */152 $posts_columns['date'] = _x( 'Date', 'column name' );153 $posts_columns = apply_filters( 'manage_media_columns', $posts_columns, 'upload' != $this->_screen->id );154 155 return $posts_columns;156 }157 158 function get_sortable_columns() {159 return array(160 'title' => 'title',161 'author' => 'author',162 'parent' => 'parent',163 'comments' => 'comment_count',164 'date' => 'date',165 );166 }167 168 function display_rows() {169 global $detached, $post, $id;170 171 if ( $detached ) {172 $this->display_orphans();173 return;174 }175 176 add_filter( 'the_title','esc_html' );177 $alt = '';178 179 while ( have_posts() ) : the_post();180 181 if ( $this->is_trash && $post->post_status != 'trash'182 || !$this->is_trash && $post->post_status == 'trash' )183 continue;184 185 $alt = ( 'alternate' == $alt ) ? '' : 'alternate';186 $post_owner = ( get_current_user_id() == $post->post_author ) ? 'self' : 'other';187 $att_title = _draft_or_post_title();188 ?>189 <tr id='post-<?php echo $id; ?>' class='<?php echo trim( $alt . ' author-' . $post_owner . ' status-' . $post->post_status ); ?>' valign="top">190 <?php191 192 list( $columns, $hidden ) = $this->get_column_info();193 foreach ( $columns as $column_name => $column_display_name ) {194 $class = "class='$column_name column-$column_name'";195 196 $style = '';197 if ( in_array( $column_name, $hidden ) )198 $style = ' style="display:none;"';199 200 $attributes = $class . $style;201 202 switch ( $column_name ) {203 204 case 'cb':205 ?>206 <th scope="row" class="check-column"><?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?><input type="checkbox" name="media[]" value="<?php the_ID(); ?>" /><?php } ?></th>207 <?php208 break;209 210 case 'icon':211 $attributes = 'class="column-icon media-icon"' . $style;212 ?>213 <td <?php echo $attributes ?>><?php214 if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {215 if ( $this->is_trash ) {216 echo $thumb;217 } else {218 ?>219 <a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>">220 <?php echo $thumb; ?>221 </a>222 223 <?php }224 }225 ?>226 </td>227 <?php228 break;229 230 case 'title':231 ?>232 <td <?php echo $attributes ?>><strong><?php if ( $this->is_trash ) echo $att_title; else { ?><a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php echo $att_title; ?></a><?php } ?></strong>233 <p>234 <?php235 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )236 echo esc_html( strtoupper( $matches[1] ) );237 else238 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );239 ?>240 </p>241 <?php242 $actions = array();243 if ( current_user_can( 'edit_post', $post->ID ) && !$this->is_trash )244 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';245 if ( current_user_can( 'delete_post', $post->ID ) ) {246 if ( $this->is_trash )247 $actions['untrash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=untrash&post=$post->ID", 'untrash-attachment_' . $post->ID ) . "'>" . __( 'Restore' ) . "</a>";248 elseif ( EMPTY_TRASH_DAYS && MEDIA_TRASH )249 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";250 if ( $this->is_trash || !EMPTY_TRASH_DAYS || !MEDIA_TRASH ) {251 $delete_ays = ( !$this->is_trash && !MEDIA_TRASH ) ? " onclick='return showNotice.warn();'" : '';252 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";253 }254 }255 if ( !$this->is_trash ) {256 $title =_draft_or_post_title( $post->post_parent );257 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';258 }259 $actions = apply_filters( 'media_row_actions', $actions, $post );260 echo $this->row_actions( $actions );261 ?>262 </td>263 <?php264 break;265 266 case 'author':267 ?>268 <td <?php echo $attributes ?>><?php the_author() ?></td>269 <?php270 break;271 272 case 'tags':273 ?>274 <td <?php echo $attributes ?>><?php275 $tags = get_the_tags();276 if ( !empty( $tags ) ) {277 $out = array();278 foreach ( $tags as $c )279 $out[] = "<a href='edit.php?tag=$c->slug'> " . esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'post_tag', 'display' ) ) . "</a>";280 echo join( ', ', $out );281 } else {282 _e( 'No Tags' );283 }284 ?>285 </td>286 <?php287 break;288 289 case 'desc':290 ?>291 <td <?php echo $attributes ?>><?php echo has_excerpt() ? $post->post_excerpt : ''; ?></td>292 <?php293 break;294 295 case 'date':296 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {297 $t_time = $h_time = __( 'Unpublished' );298 } else {299 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );300 $m_time = $post->post_date;301 $time = get_post_time( 'G', true, $post, false );302 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {303 if ( $t_diff < 0 )304 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );305 else306 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );307 } else {308 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );309 }310 }311 ?>312 <td <?php echo $attributes ?>><?php echo $h_time ?></td>313 <?php314 break;315 316 case 'parent':317 if ( $post->post_parent > 0 ) {318 if ( get_post( $post->post_parent ) ) {319 $title =_draft_or_post_title( $post->post_parent );320 }321 ?>322 <td <?php echo $attributes ?>>323 <strong><a href="<?php echo get_edit_post_link( $post->post_parent ); ?>"><?php echo $title ?></a></strong>,324 <?php echo get_the_time( __( 'Y/m/d' ) ); ?>325 </td>326 <?php327 } else {328 ?>329 <td <?php echo $attributes ?>><?php _e( '(Unattached)' ); ?><br />330 <a class="hide-if-no-js" onclick="findPosts.open( 'media[]','<?php echo $post->ID ?>' );return false;" href="#the-list"><?php _e( 'Attach' ); ?></a></td>331 <?php332 }333 break;334 335 case 'comments':336 $attributes = 'class="comments column-comments num"' . $style;337 ?>338 <td <?php echo $attributes ?>>339 <div class="post-com-count-wrapper">340 <?php341 $pending_comments = get_pending_comments_num( $post->ID );342 343 $this->comments_bubble( $post->ID, $pending_comments );344 ?>345 </div>346 </td>347 <?php348 break;349 350 case 'actions':351 ?>352 <td <?php echo $attributes ?>>353 <a href="media.php?action=edit&attachment_id=<?php the_ID(); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php _e( 'Edit' ); ?></a> |354 <a href="<?php the_permalink(); ?>"><?php _e( 'Get permalink' ); ?></a>355 </td>356 <?php357 break;358 359 default:360 ?>361 <td <?php echo $attributes ?>>362 <?php do_action( 'manage_media_custom_column', $column_name, $id ); ?>363 </td>364 <?php365 break;366 }367 }368 ?>369 </tr>370 <?php endwhile;371 }372 373 function display_orphans() {374 global $post;375 376 $class = '';377 378 while ( have_posts() ) : the_post();379 380 $class = ( 'alternate' == $class ) ? '' : 'alternate';381 $att_title = esc_html( _draft_or_post_title( $post->ID ) );382 383 $edit_link = '<a href="' . get_edit_post_link( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ) . '">%s</a>';384 ?>385 <tr id='post-<?php echo $post->ID; ?>' class='<?php echo $class; ?>' valign="top">386 <th scope="row" class="check-column">387 <?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?>388 <input type="checkbox" name="media[]" value="<?php echo esc_attr( $post->ID ); ?>" />389 <?php } ?>390 </th>391 392 <td class="media-icon">393 <?php if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {394 printf( $edit_link, $thumb );395 } ?>396 </td>397 398 <td class="media column-media">399 <strong><?php printf( $edit_link, $att_title ); ?></strong><br />400 <?php401 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )402 echo esc_html( strtoupper( $matches[1] ) );403 else404 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );405 ?>406 <?php407 $actions = array();408 if ( current_user_can( 'edit_post', $post->ID ) )409 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';410 if ( current_user_can( 'delete_post', $post->ID ) )411 if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) {412 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";413 } else {414 $delete_ays = !MEDIA_TRASH ? " onclick='return showNotice.warn();'" : '';415 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";416 }417 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $att_title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';418 if ( current_user_can( 'edit_post', $post->ID ) )419 $actions['attach'] = '<a href="#the-list" onclick="findPosts.open( \'media[]\',\''.$post->ID.'\' );return false;" class="hide-if-no-js">'.__( 'Attach' ).'</a>';420 $actions = apply_filters( 'media_row_actions', $actions, $post );421 422 echo $this->row_actions( $actions );423 ?>424 </td>425 <td class="author column-author">426 <?php $author = get_userdata( $post->post_author ); echo $author->display_name; ?>427 </td>428 <?php429 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {430 $t_time = $h_time = __( 'Unpublished' );431 } else {432 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );433 $m_time = $post->post_date;434 $time = get_post_time( 'G', true );435 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {436 if ( $t_diff < 0 )437 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );438 else439 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );440 } else {441 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );442 }443 }444 ?>445 <td class="date column-date"><?php echo $h_time ?></td>446 </tr>447 <?php448 endwhile;449 }450 }451 452 class WP_Terms_Table extends WP_List_Table {453 454 var $callback_args;455 456 function WP_Terms_Table() {457 global $post_type, $taxonomy, $tax, $current_screen;458 459 wp_reset_vars( array( 'action', 'taxonomy', 'post_type' ) );460 461 if ( empty( $taxonomy ) )462 $taxonomy = 'post_tag';463 464 if ( !taxonomy_exists( $taxonomy ) )465 wp_die( __( 'Invalid taxonomy' ) );466 467 $tax = get_taxonomy( $taxonomy );468 469 if ( empty( $post_type ) || !in_array( $post_type, get_post_types( array( 'public' => true ) ) ) )470 $post_type = 'post';471 472 if ( !isset( $current_screen ) )473 set_current_screen( 'edit-' . $taxonomy );474 475 parent::WP_List_Table( array(476 'screen' => $current_screen,477 'plural' => 'tags',478 'singular' => 'tag',479 ) );480 }481 482 function check_permissions( $type = 'manage' ) {483 global $tax;484 485 $cap = 'manage' == $type ? $tax->cap->manage_terms : $tax->cap->edit_terms;486 487 if ( !current_user_can( $tax->cap->manage_terms ) )488 wp_die( __( 'Cheatin’ uh?' ) );489 }490 491 function prepare_items() {492 global $taxonomy;493 494 $tags_per_page = $this->get_items_per_page( 'edit_' . $taxonomy . '_per_page' );495 496 if ( 'post_tag' == $taxonomy ) {497 $tags_per_page = apply_filters( 'edit_tags_per_page', $tags_per_page );498 $tags_per_page = apply_filters( 'tagsperpage', $tags_per_page ); // Old filter499 } elseif ( 'category' == $taxonomy ) {500 $tags_per_page = apply_filters( 'edit_categories_per_page', $tags_per_page ); // Old filter501 }502 503 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';504 505 $args = array(506 'search' => $search,507 'page' => $this->get_pagenum(),508 'number' => $tags_per_page,509 );510 511 if ( !empty( $_REQUEST['orderby'] ) )512 $args['orderby'] = trim( stripslashes( $_REQUEST['orderby'] ) );513 514 if ( !empty( $_REQUEST['order'] ) )515 $args['order'] = trim( stripslashes( $_REQUEST['order'] ) );516 517 $this->callback_args = $args;518 519 $this->set_pagination_args( array(520 'total_items' => wp_count_terms( $taxonomy, compact( 'search' ) ),521 'per_page' => $tags_per_page,522 ) );523 }524 525 function get_bulk_actions() {526 $actions = array();527 $actions['delete'] = __( 'Delete' );528 529 return $actions;530 }531 532 function current_action() {533 if ( isset( $_REQUEST['action'] ) && isset( $_REQUEST['delete_tags'] ) && ( 'delete' == $_REQUEST['action'] || 'delete' == $_REQUEST['action2'] ) )534 return 'bulk-delete';535 536 return parent::current_action();537 }538 539 function get_columns() {540 global $taxonomy;541 542 $columns = array(543 'cb' => '<input type="checkbox" />',544 'name' => __( 'Name' ),545 'description' => __( 'Description' ),546 'slug' => __( 'Slug' ),547 );548 549 if ( 'link_category' == $taxonomy )550 $columns['links'] = __( 'Links' );551 else552 $columns['posts'] = __( 'Posts' );553 554 return $columns;555 }556 557 function get_sortable_columns() {558 return array(559 'name' => 'name',560 'description' => 'description',561 'slug' => 'slug',562 'posts' => 'count',563 'links' => 'count'564 );565 }566 567 function display_rows() {568 global $taxonomy;569 570 $args = wp_parse_args( $this->callback_args, array(571 'page' => 1,572 'number' => 20,573 'search' => '',574 'hide_empty' => 0575 ) );576 577 extract( $args, EXTR_SKIP );578 579 $args['offset'] = $offset = ( $page - 1 ) * $number;580 581 // convert it to table rows582 $out = '';583 $count = 0;584 if ( is_taxonomy_hierarchical( $taxonomy ) && !isset( $orderby ) ) {585 // We'll need the full set of terms then.586 $args['number'] = $args['offset'] = 0;587 588 $terms = get_terms( $taxonomy, $args );589 if ( !empty( $search ) ) // Ignore children on searches.590 $children = array();591 else592 $children = _get_term_hierarchy( $taxonomy );593 594 // Some funky recursion to get the job done( Paging & parents mainly ) is contained within, Skip it for non-hierarchical taxonomies for performance sake595 $out .= $this->_rows( $taxonomy, $terms, $children, $offset, $number, $count );596 } else {597 $terms = get_terms( $taxonomy, $args );598 foreach ( $terms as $term )599 $out .= $this->single_row( $term, 0, $taxonomy );600 $count = $number; // Only displaying a single page.601 }602 603 echo $out;604 }605 606 function _rows( $taxonomy, $terms, &$children, $start = 0, $per_page = 20, &$count, $parent = 0, $level = 0 ) {607 608 $end = $start + $per_page;609 610 $output = '';611 foreach ( $terms as $key => $term ) {612 613 if ( $count >= $end )614 break;615 616 if ( $term->parent != $parent && empty( $_REQUEST['s'] ) )617 continue;618 619 // If the page starts in a subtree, print the parents.620 if ( $count == $start && $term->parent > 0 && empty( $_REQUEST['s'] ) ) {621 $my_parents = $parent_ids = array();622 $p = $term->parent;623 while ( $p ) {624 $my_parent = get_term( $p, $taxonomy );625 $my_parents[] = $my_parent;626 $p = $my_parent->parent;627 if ( in_array( $p, $parent_ids ) ) // Prevent parent loops.628 break;629 $parent_ids[] = $p;630 }631 unset( $parent_ids );632 633 $num_parents = count( $my_parents );634 while ( $my_parent = array_pop( $my_parents ) ) {635 $output .= "\t" . $this->single_row( $my_parent, $level - $num_parents, $taxonomy );636 $num_parents--;637 }638 }639 640 if ( $count >= $start )641 $output .= "\t" . $this->single_row( $term, $level, $taxonomy );642 643 ++$count;644 645 unset( $terms[$key] );646 647 if ( isset( $children[$term->term_id] ) && empty( $_REQUEST['s'] ) )648 $output .= $this->_rows( $taxonomy, $terms, $children, $start, $per_page, $count, $term->term_id, $level + 1 );649 }650 651 return $output;652 }653 654 function single_row( $tag, $level = 0 ) {655 static $row_class = '';656 $row_class = ( $row_class == '' ? ' class="alternate"' : '' );657 658 $this->level = $level;659 660 echo '<tr id="tag-' . $tag->term_id . '"' . $row_class . '>';661 echo $this->single_row_columns( $tag );662 echo '</tr>';663 }664 665 function column_cb( $tag ) {666 global $taxonomy, $tax;667 668 $default_term = get_option( 'default_' . $taxonomy );669 670 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )671 return '<input type="checkbox" name="delete_tags[]" value="' . $tag->term_id . '" />';672 else673 return ' ';674 }675 676 function column_name( $tag ) {677 global $taxonomy, $tax, $post_type;678 679 $default_term = get_option( 'default_' . $taxonomy );680 681 $pad = str_repeat( '— ', max( 0, $this->level ) );682 $name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag );683 $qe_data = get_term( $tag->term_id, $taxonomy, OBJECT, 'edit' );684 $edit_link = get_edit_term_link( $tag->term_id, $taxonomy, $post_type );685 686 $out = '<strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $name ) ) . '">' . $name . '</a></strong><br />';687 688 $actions = array();689 if ( current_user_can( $tax->cap->edit_terms ) ) {690 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';691 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __( 'Quick Edit' ) . '</a>';692 }693 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )694 $actions['delete'] = "<a class='delete-tag' href='" . wp_nonce_url( "edit-tags.php?action=delete&taxonomy=$taxonomy&tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id ) . "'>" . __( 'Delete' ) . "</a>";695 696 $actions = apply_filters( 'tag_row_actions', $actions, $tag );697 $actions = apply_filters( "${taxonomy}_row_actions", $actions, $tag );698 699 $out .= $this->row_actions( $actions );700 $out .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';701 $out .= '<div class="name">' . $qe_data->name . '</div>';702 $out .= '<div class="slug">' . apply_filters( 'editable_slug', $qe_data->slug ) . '</div>';703 $out .= '<div class="parent">' . $qe_data->parent . '</div></div></td>';704 705 return $out;706 }707 708 function column_description( $tag ) {709 return $tag->description;710 }711 712 function column_slug( $tag ) {713 return apply_filters( 'editable_slug', $tag->slug );714 }715 716 function column_posts( $tag ) {717 global $taxonomy, $post_type;718 719 $count = number_format_i18n( $tag->count );720 721 if ( 'post_tag' == $taxonomy ) {722 $tagsel = 'tag';723 } elseif ( 'category' == $taxonomy ) {724 $tagsel = 'category_name';725 } elseif ( ! empty( $tax->query_var ) ) {726 $tagsel = $tax->query_var;727 } else {728 $tagsel = $taxonomy;729 }730 731 return "<a href='edit.php?$tagsel=$tag->slug&post_type=$post_type'>$count</a>";732 }733 734 function column_links( $tag ) {735 $count = number_format_i18n( $tag->count );736 return $count;737 }738 739 function column_default( $tag, $column_name ) {740 global $taxonomy;741 742 return apply_filters( "manage_${taxonomy}_custom_column", '', $column_name, $tag->term_id );743 $out .= "</td>";744 }745 746 /**747 * Outputs the hidden row displayed when inline editing748 *749 * @since 3.1.0750 */751 function inline_edit() {752 global $tax;753 754 if ( ! current_user_can( $tax->cap->edit_terms ) )755 return;756 757 list( $columns, $hidden ) = $this->get_column_info();758 759 $col_count = count( $columns ) - count( $hidden );760 ?>761 762 <form method="get" action=""><table style="display: none"><tbody id="inlineedit">763 <tr id="inline-edit" class="inline-edit-row" style="display: none"><td colspan="<?php echo $col_count; ?>">764 765 <fieldset><div class="inline-edit-col">766 <h4><?php _e( 'Quick Edit' ); ?></h4>767 768 <label>769 <span class="title"><?php _e( 'Name' ); ?></span>770 <span class="input-text-wrap"><input type="text" name="name" class="ptitle" value="" /></span>771 </label>772 <?php if ( !global_terms_enabled() ) { ?>773 <label>774 <span class="title"><?php _e( 'Slug' ); ?></span>775 <span class="input-text-wrap"><input type="text" name="slug" class="ptitle" value="" /></span>776 </label>777 <?php } ?>778 779 </div></fieldset>780 <?php781 782 $core_columns = array( 'cb' => true, 'description' => true, 'name' => true, 'slug' => true, 'posts' => true );783 784 foreach ( $columns as $column_name => $column_display_name ) {785 if ( isset( $core_columns[$column_name] ) )786 continue;787 do_action( 'quick_edit_custom_box', $column_name, $type, $tax->taxonomy );788 }789 790 ?>791 792 <p class="inline-edit-save submit">793 <a accesskey="c" href="#inline-edit" title="<?php _e( 'Cancel' ); ?>" class="cancel button-secondary alignleft"><?php _e( 'Cancel' ); ?></a>794 <?php $update_text = $tax->labels->update_item; ?>795 <a accesskey="s" href="#inline-edit" title="<?php echo esc_attr( $update_text ); ?>" class="save button-primary alignright"><?php echo $update_text; ?></a>796 <img class="waiting" style="display:none;" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" />797 <span class="error" style="display:none;"></span>798 <?php wp_nonce_field( 'taxinlineeditnonce', '_inline_edit', false ); ?>799 <input type="hidden" name="taxonomy" value="<?php echo esc_attr( $tax->name ); ?>" />800 <br class="clear" />801 </p>802 </td></tr>803 </tbody></table></form>804 <?php805 }806 }807 808 class WP_Users_Table extends WP_List_Table {809 810 function WP_Users_Table() {811 parent::WP_List_Table( array(812 'screen' => 'users',813 'plural' => 'users'814 ) );815 }816 817 function check_permissions() {818 if ( !current_user_can('list_users') )819 wp_die(__('Cheatin’ uh?'));820 }821 822 function prepare_items() {823 global $role, $usersearch;824 825 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';826 827 $role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : '';828 829 $users_per_page = $this->get_items_per_page( 'users_per_page' );830 831 $paged = $this->get_pagenum();832 833 $args = array(834 'number' => $users_per_page,835 'offset' => ( $paged-1 ) * $users_per_page,836 'role' => $role,837 'search' => $usersearch838 );839 840 if ( isset( $_REQUEST['orderby'] ) )841 $args['orderby'] = $_REQUEST['orderby'];842 843 if ( isset( $_REQUEST['order'] ) )844 $args['order'] = $_REQUEST['order'];845 846 // Query the user IDs for this page847 $wp_user_search = new WP_User_Query( $args );848 849 $this->items = $wp_user_search->get_results();850 851 $this->set_pagination_args( array(852 'total_items' => $wp_user_search->get_total(),853 'per_page' => $users_per_page,854 ) );855 }856 857 function no_items() {858 _e( 'No matching users were found.' );859 }860 861 function get_views() {862 global $wp_roles, $role;863 864 $users_of_blog = count_users();865 $total_users = $users_of_blog['total_users'];866 $avail_roles =& $users_of_blog['avail_roles'];867 unset($users_of_blog);868 869 $current_role = false;870 $class = empty($role) ? ' class="current"' : '';871 $role_links = array();872 $role_links['all'] = "<li><a href='users.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>';873 foreach ( $wp_roles->get_names() as $this_role => $name ) {874 if ( !isset($avail_roles[$this_role]) )875 continue;876 877 $class = '';878 879 if ( $this_role == $role ) {880 $current_role = $role;881 $class = ' class="current"';882 }883 884 $name = translate_user_role( $name );885 /* translators: User role name with count */886 $name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, $avail_roles[$this_role] );887 $role_links[$this_role] = "<li><a href='users.php?role=$this_role'$class>$name</a>";888 }889 890 return $role_links;891 }892 893 function get_bulk_actions() {894 $actions = array();895 896 if ( !is_multisite() && current_user_can( 'delete_users' ) )897 $actions['delete'] = __( 'Delete' );898 else899 $actions['remove'] = __( 'Remove' );900 901 return $actions;902 }903 904 function extra_tablenav( $which ) {905 if ( 'top' != $which )906 return;907 ?>908 <div class="alignleft actions">909 <label class="screen-reader-text" for="new_role"><?php _e( 'Change role to…' ) ?></label>910 <select name="new_role" id="new_role">911 <option value=''><?php _e( 'Change role to…' ) ?></option>912 <?php wp_dropdown_roles(); ?>913 </select>914 <input type="submit" value="<?php esc_attr_e( 'Change' ); ?>" name="changeit" class="button-secondary" />915 </div>916 <?php917 }918 919 function current_action() {920 if ( isset($_REQUEST['changeit']) && !empty($_REQUEST['new_role']) )921 return 'promote';922 923 return parent::current_action();924 }925 926 function get_columns() {927 return array(928 'cb' => '<input type="checkbox" />',929 'username' => __( 'Login' ),930 'name' => __( 'Name' ),931 'email' => __( 'E-mail' ),932 'role' => __( 'Role' ),933 'posts' => __( 'Posts' )934 );935 }936 937 function get_sortable_columns() {938 return array(939 'username' => 'login',940 'name' => 'name',941 'email' => 'email',942 'posts' => 'post_count',943 );944 }945 946 function display_rows() {947 // Query the post counts for this page948 $post_counts = count_many_users_posts( array_keys( $this->items ) );949 950 $style = '';951 foreach ( $this->items as $userid => $user_object ) {952 $role = reset( $user_object->roles );953 954 if ( is_multisite() && empty( $role ) )955 continue;956 957 $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"';958 echo "\n\t", $this->single_row( $user_object, $style, $role, $post_counts[ $userid ] );959 }960 }961 962 /**963 * Generate HTML for a single row on the users.php admin panel.964 *965 * @since 2.1.0966 *967 * @param object $user_object968 * @param string $style Optional. Attributes added to the TR element. Must be sanitized.969 * @param string $role Key for the $wp_roles array.970 * @param int $numposts Optional. Post count to display for this user. Defaults to zero, as in, a new user has made zero posts.971 * @return string972 */973 function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) {974 global $wp_roles;975 976 if ( !( is_object( $user_object ) && is_a( $user_object, 'WP_User' ) ) )977 $user_object = new WP_User( (int) $user_object );978 $user_object = sanitize_user_object( $user_object, 'display' );979 $email = $user_object->user_email;980 $url = $user_object->user_url;981 $short_url = str_replace( 'http://', '', $url );982 $short_url = str_replace( 'www.', '', $short_url );983 if ( '/' == substr( $short_url, -1 ) )984 $short_url = substr( $short_url, 0, -1 );985 if ( strlen( $short_url ) > 35 )986 $short_url = substr( $short_url, 0, 32 ).'...';987 $checkbox = '';988 // Check if the user for this row is editable989 if ( current_user_can( 'list_users' ) ) {990 // Set up the user editing link991 // TODO: make profile/user-edit determination a separate function992 if ( get_current_user_id() == $user_object->ID ) {993 $edit_link = 'profile.php';994 } else {995 $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( esc_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" ) );996 }997 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";998 999 // Set up the hover actions for this user1000 $actions = array();1001 1002 if ( current_user_can( 'edit_user', $user_object->ID ) ) {1003 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";1004 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';1005 } else {1006 $edit = "<strong>$user_object->user_login</strong><br />";1007 }1008 1009 if ( !is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) )1010 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=delete&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Delete' ) . "</a>";1011 if ( is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'remove_user', $user_object->ID ) )1012 $actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=remove&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . "</a>";1013 $actions = apply_filters( 'user_row_actions', $actions, $user_object );1014 $edit .= $this->row_actions( $actions );1015 1016 // Set up the checkbox ( because the user is editable, otherwise its empty )1017 $checkbox = "<input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='$role' value='{$user_object->ID}' />";1018 1019 } else {1020 $edit = '<strong>' . $user_object->user_login . '</strong>';1021 }1022 $role_name = isset( $wp_roles->role_names[$role] ) ? translate_user_role( $wp_roles->role_names[$role] ) : __( 'None' );1023 $r = "<tr id='user-$user_object->ID'$style>";1024 $avatar = get_avatar( $user_object->ID, 32 );1025 1026 list( $columns, $hidden ) = $this->get_column_info();1027 1028 foreach ( $columns as $column_name => $column_display_name ) {1029 $class = "class=\"$column_name column-$column_name\"";1030 1031 $style = '';1032 if ( in_array( $column_name, $hidden ) )1033 $style = ' style="display:none;"';1034 1035 $attributes = "$class$style";1036 1037 switch ( $column_name ) {1038 case 'cb':1039 $r .= "<th scope='row' class='check-column'>$checkbox</th>";1040 break;1041 case 'username':1042 $r .= "<td $attributes>$avatar $edit</td>";1043 break;1044 case 'name':1045 $r .= "<td $attributes>$user_object->first_name $user_object->last_name</td>";1046 break;1047 case 'email':1048 $r .= "<td $attributes><a href='mailto:$email' title='" . sprintf( __( 'E-mail: %s' ), $email ) . "'>$email</a></td>";1049 break;1050 case 'role':1051 $r .= "<td $attributes>$role_name</td>";1052 break;1053 case 'posts':1054 $attributes = 'class="posts column-posts num"' . $style;1055 $r .= "<td $attributes>";1056 if ( $numposts > 0 ) {1057 $r .= "<a href='edit.php?author=$user_object->ID' title='" . __( 'View posts by this author' ) . "' class='edit'>";1058 $r .= $numposts;1059 $r .= '</a>';1060 } else {1061 $r .= 0;1062 }1063 $r .= "</td>";1064 break;1065 default:1066 $r .= "<td $attributes>";1067 $r .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID );1068 $r .= "</td>";1069 }1070 }1071 $r .= '</tr>';1072 1073 return $r;1074 }1075 }1076 1077 class WP_Comments_Table extends WP_List_Table {1078 1079 var $checkbox = true;1080 var $from_ajax = false;1081 1082 var $pending_count = array();1083 1084 function WP_Comments_Table() {1085 global $mode;1086 1087 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'detail' : $_REQUEST['mode'];1088 1089 if ( get_option('show_avatars') && 'single' != $mode )1090 add_filter( 'comment_author', 'floated_admin_avatar' );1091 1092 parent::WP_List_Table( array(1093 'screen' => 'edit-comments',1094 'plural' => 'comments'1095 ) );1096 }1097 1098 function check_permissions() {1099 if ( !current_user_can('edit_posts') )1100 wp_die(__('Cheatin’ uh?'));1101 }1102 1103 function prepare_items() {1104 global $post_id, $comment_status, $search;1105 1106 if ( isset( $_REQUEST['p'] ) )1107 $post_id = absint( $_REQUEST['p'] );1108 elseif ( isset( $_REQUEST['post'] ) )1109 $post_id = absint( $_REQUEST['post'] );1110 elseif ( isset( $_REQUEST['post_ID'] ) )1111 $post_id = absint( $_REQUEST['post_ID'] );1112 else1113 $post_id = 0;1114 1115 $comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all';1116 if ( !in_array( $comment_status, array( 'all', 'moderated', 'approved', 'spam', 'trash' ) ) )1117 $comment_status = 'all';1118 1119 $comment_type = !empty( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : '';1120 1121 $search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : '';1122 1123 $user_id = ( isset( $_REQUEST['user_id'] ) ) ? $_REQUEST['user_id'] : '';1124 1125 $comments_per_page = $this->get_items_per_page( 'edit_comments_per_page' );1126 $comments_per_page = apply_filters( 'comments_per_page', $comments_per_page, $comment_status );1127 1128 if ( isset( $_POST['number'] ) )1129 $number = (int) $_POST['number'];1130 else1131 $number = $comments_per_page + min( 8, $comments_per_page ); // Grab a few extra1132 1133 $page = $this->get_pagenum();1134 1135 $start = $offset = ( $page - 1 ) * $comments_per_page;1136 1137 $status_map = array(1138 'moderated' => 'hold',1139 'approved' => 'approve'1140 );1141 1142 $args = array(1143 'status' => isset( $status_map[$comment_status] ) ? $status_map[$comment_status] : $comment_status,1144 'search' => $search,1145 'user_id' => $user_id,1146 'offset' => $start,1147 'number' => $number,1148 'post_id' => $post_id,1149 'type' => $comment_type,1150 'orderby' => @$_REQUEST['orderby'],1151 'order' => @$_REQUEST['order'],1152 );1153 1154 $_comments = get_comments( $args );1155 1156 update_comment_cache( $_comments );1157 1158 $this->items = array_slice( $_comments, 0, $comments_per_page );1159 $this->extra_items = array_slice( $_comments, $comments_per_page );1160 1161 $total_comments = get_comments( array_merge( $args, array('count' => true, 'offset' => 0, 'number' => 0) ) );1162 1163 $_comment_post_ids = array();1164 foreach ( $_comments as $_c ) {1165 $_comment_post_ids[] = $_c->comment_post_ID;1166 }1167 1168 $this->pending_count = get_pending_comments_num( $_comment_post_ids );1169 1170 $this->set_pagination_args( array(1171 'total_items' => $total_comments,1172 'per_page' => $comments_per_page,1173 ) );1174 }1175 1176 function get_views() {1177 global $post_id, $comment_status;1178 1179 $status_links = array();1180 $num_comments = ( $post_id ) ? wp_count_comments( $post_id ) : wp_count_comments();1181 //, number_format_i18n($num_comments->moderated) ), "<span class='comment-count'>" . number_format_i18n($num_comments->moderated) . "</span>"),1182 //, number_format_i18n($num_comments->spam) ), "<span class='spam-comment-count'>" . number_format_i18n($num_comments->spam) . "</span>")1183 $stati = array(1184 'all' => _nx_noop('All', 'All', 'comments'), // singular not used1185 'moderated' => _n_noop('Pending <span class="count">(<span class="pending-count">%s</span>)</span>', 'Pending <span class="count">(<span class="pending-count">%s</span>)</span>'),1186 'approved' => _n_noop('Approved', 'Approved'), // singular not used1187 'spam' => _n_noop('Spam <span class="count">(<span class="spam-count">%s</span>)</span>', 'Spam <span class="count">(<span class="spam-count">%s</span>)</span>'),1188 'trash' => _n_noop('Trash <span class="count">(<span class="trash-count">%s</span>)</span>', 'Trash <span class="count">(<span class="trash-count">%s</span>)</span>')1189 );1190 1191 if ( !EMPTY_TRASH_DAYS )1192 unset($stati['trash']);1193 1194 $link = 'edit-comments.php';1195 if ( !empty($comment_type) && 'all' != $comment_type )1196 $link = add_query_arg( 'comment_type', $comment_type, $link );1197 1198 foreach ( $stati as $status => $label ) {1199 $class = ( $status == $comment_status ) ? ' class="current"' : '';1200 1201 if ( !isset( $num_comments->$status ) )1202 $num_comments->$status = 10;1203 $link = add_query_arg( 'comment_status', $status, $link );1204 if ( $post_id )1205 $link = add_query_arg( 'p', absint( $post_id ), $link );1206 /*1207 // I toyed with this, but decided against it. Leaving it in here in case anyone thinks it is a good idea. ~ Mark1208 if ( !empty( $_REQUEST['s'] ) )1209 $link = add_query_arg( 's', esc_attr( stripslashes( $_REQUEST['s'] ) ), $link );1210 */1211 $status_links[$status] = "<li class='$status'><a href='$link'$class>" . sprintf(1212 _n( $label[0], $label[1], $num_comments->$status ),1213 number_format_i18n( $num_comments->$status )1214 ) . '</a>';1215 }1216 1217 $status_links = apply_filters( 'comment_status_links', $status_links );1218 return $status_links;1219 }1220 1221 function get_bulk_actions() {1222 global $comment_status;1223 1224 $actions = array();1225 if ( in_array( $comment_status, array( 'all', 'approved' ) ) )1226 $actions['unapprove'] = __( 'Unapprove' );1227 if ( in_array( $comment_status, array( 'all', 'moderated', 'spam' ) ) )1228 $actions['approve'] = __( 'Approve' );1229 if ( in_array( $comment_status, array( 'all', 'moderated', 'approved' ) ) )1230 $actions['spam'] = _x( 'Mark as Spam', 'comment' );1231 1232 if ( 'trash' == $comment_status )1233 $actions['untrash'] = __( 'Restore' );1234 elseif ( 'spam' == $comment_status )1235 $actions['unspam'] = _x( 'Not Spam', 'comment' );1236 1237 if ( in_array( $comment_status, array( 'trash', 'spam' ) ) || !EMPTY_TRASH_DAYS )1238 $actions['delete'] = __( 'Delete Permanently' );1239 else1240 $actions['trash'] = __( 'Move to Trash' );1241 1242 return $actions;1243 }1244 1245 function extra_tablenav( $which ) {1246 global $comment_status, $comment_type;1247 ?>1248 <div class="alignleft actions">1249 <?php1250 if ( 'top' == $which ) {1251 ?>1252 <select name="comment_type">1253 <option value=""><?php _e( 'Show all comment types' ); ?></option>1254 <?php1255 $comment_types = apply_filters( 'admin_comment_types_dropdown', array(1256 'comment' => __( 'Comments' ),1257 'pings' => __( 'Pings' ),1258 ) );1259 1260 foreach ( $comment_types as $type => $label )1261 echo "\t<option value='" . esc_attr( $type ) . "'" . selected( $comment_type, $type, false ) . ">$label</option>\n";1262 ?>1263 </select>1264 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />1265 <?php1266 }1267 1268 if ( ( 'spam' == $comment_status || 'trash' == $comment_status ) && current_user_can( 'moderate_comments' ) ) {1269 wp_nonce_field( 'bulk-destroy', '_destroy_nonce' );1270 $title = ( 'spam' == $comment_status ) ? esc_attr__( 'Empty Spam' ) : esc_attr__( 'Empty Trash' );1271 ?>1272 <input type="submit" name="delete_all" id="delete_all" value="<?php echo $title ?>" class="button-secondary apply" />1273 <?php1274 }1275 ?>1276 <?php1277 do_action( 'manage_comments_nav', $comment_status );1278 echo '</div>';1279 }1280 1281 function current_action() {1282 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )1283 return 'delete_all';1284 1285 return parent::current_action();1286 }1287 1288 function get_columns() {1289 global $mode;1290 1291 $columns = array();1292 1293 if ( $this->checkbox )1294 $columns['cb'] = '<input type="checkbox" />';1295 1296 $columns['author'] = __( 'Author' );1297 $columns['comment'] = _x( 'Comment', 'column name' );1298 1299 if ( 'single' !== $mode )1300 $columns['response'] = _x( 'Comment', 'column name' );1301 1302 return $columns;1303 }1304 1305 function get_sortable_columns() {1306 return array(1307 'author' => 'comment_author',1308 'comment' => 'comment_content',1309 'response' => 'comment_post_ID'1310 );1311 }1312 1313 function display_table() {1314 extract( $this->_args );1315 1316 $this->display_tablenav( 'top' );1317 1318 ?>1319 <table class="<?php echo implode( ' ', $this->get_table_classes() ); ?>" cellspacing="0">1320 <thead>1321 <tr>1322 <?php $this->print_column_headers(); ?>1323 </tr>1324 </thead>1325 1326 <tfoot>1327 <tr>1328 <?php $this->print_column_headers( false ); ?>1329 </tr>1330 </tfoot>1331 1332 <tbody id="the-comment-list" class="list:comment">1333 <?php $this->display_rows(); ?>1334 </tbody>1335 1336 <tbody id="the-extra-comment-list" class="list:comment" style="display: none;">1337 <?php $this->items = $this->extra_items; $this->display_rows(); ?>1338 </tbody>1339 </table>1340 <?php1341 1342 $this->display_tablenav( 'bottom' );1343 }1344 1345 function single_row( $a_comment ) {1346 global $post, $comment, $the_comment_status;1347 1348 $comment = $a_comment;1349 $the_comment_status = wp_get_comment_status( $comment->comment_ID );1350 1351 $post = get_post( $comment->comment_post_ID );1352 1353 $this->user_can = current_user_can( 'edit_comment', $comment->comment_ID );1354 1355 echo "<tr id='comment-$comment->comment_ID' class='$the_comment_status'>";1356 echo $this->single_row_columns( $comment );1357 echo "</tr>\n";1358 }1359 1360 function column_cb( $comment ) {1361 if ( $this->user_can )1362 echo "<input type='checkbox' name='delete_comments[]' value='$comment->comment_ID' />";1363 }1364 1365 function column_comment( $comment ) {1366 global $post, $comment_status, $the_comment_status;1367 1368 $user_can = $this->user_can;1369 1370 $comment_url = esc_url( get_comment_link( $comment->comment_ID ) );1371 1372 $ptime = date( 'G', strtotime( $comment->comment_date ) );1373 if ( ( abs( time() - $ptime ) ) < 86400 )1374 $ptime = sprintf( __( '%s ago' ), human_time_diff( $ptime ) );1375 else1376 $ptime = mysql2date( __( 'Y/m/d \a\t g:i A' ), $comment->comment_date );1377 1378 if ( $user_can ) {1379 $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) );1380 $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) );1381 1382 $url = "comment.php?c=$comment->comment_ID";1383 1384 $approve_url = esc_url( $url . "&action=approvecomment&$approve_nonce" );1385 $unapprove_url = esc_url( $url . "&action=unapprovecomment&$approve_nonce" );1386 $spam_url = esc_url( $url . "&action=spamcomment&$del_nonce" );1387 $unspam_url = esc_url( $url . "&action=unspamcomment&$del_nonce" );1388 $trash_url = esc_url( $url . "&action=trashcomment&$del_nonce" );1389 $untrash_url = esc_url( $url . "&action=untrashcomment&$del_nonce" );1390 $delete_url = esc_url( $url . "&action=deletecomment&$del_nonce" );1391 }1392 1393 echo '<div id="submitted-on">';1394 /* translators: 2: comment date, 3: comment time */1395 printf( __( '<a href="%1$s">%2$s at %3$s</a>' ), $comment_url,1396 /* translators: comment date format. See http://php.net/date */ get_comment_date( __( 'Y/m/d' ) ),1397 /* translators: comment time format. See http://php.net/date */ get_comment_date( get_option( 'time_format' ) ) );1398 1399 if ( $comment->comment_parent ) {1400 $parent = get_comment( $comment->comment_parent );1401 $parent_link = esc_url( get_comment_link( $comment->comment_parent ) );1402 $name = get_comment_author( $parent->comment_ID );1403 printf( ' | '.__( 'In reply to <a href="%1$s">%2$s</a>.' ), $parent_link, $name );1404 }1405 1406 echo '</div>';1407 comment_text();1408 if ( $user_can ) { ?>1409 <div id="inline-<?php echo $comment->comment_ID; ?>" class="hidden">1410 <textarea class="comment" rows="1" cols="1"><?php echo esc_html( apply_filters( 'comment_edit_pre', $comment->comment_content ) ); ?></textarea>1411 <div class="author-email"><?php echo esc_attr( $comment->comment_author_email ); ?></div>1412 <div class="author"><?php echo esc_attr( $comment->comment_author ); ?></div>1413 <div class="author-url"><?php echo esc_attr( $comment->comment_author_url ); ?></div>1414 <div class="comment_status"><?php echo $comment->comment_approved; ?></div>1415 </div>1416 <?php1417 }1418 1419 if ( $user_can ) {1420 // preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash1421 $actions = array(1422 'approve' => '', 'unapprove' => '',1423 'reply' => '',1424 'quickedit' => '',1425 'edit' => '',1426 'spam' => '', 'unspam' => '',1427 'trash' => '', 'untrash' => '', 'delete' => ''1428 );1429 1430 if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments1431 if ( 'approved' == $the_comment_status )1432 $actions['unapprove'] = "<a href='$unapprove_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=unapproved vim-u vim-destructive' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';1433 else if ( 'unapproved' == $the_comment_status )1434 $actions['approve'] = "<a href='$approve_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=approved vim-a vim-destructive' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';1435 } else {1436 $actions['approve'] = "<a href='$approve_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved vim-a' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';1437 $actions['unapprove'] = "<a href='$unapprove_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved vim-u' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';1438 }1439 1440 if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) {1441 $actions['spam'] = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1 vim-s vim-destructive' title='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>';1442 } elseif ( 'spam' == $the_comment_status ) {1443 $actions['unspam'] = "<a href='$unspam_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:unspam=1 vim-z vim-destructive'>" . _x( 'Not Spam', 'comment' ) . '</a>';1444 } elseif ( 'trash' == $the_comment_status ) {1445 $actions['untrash'] = "<a href='$untrash_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:untrash=1 vim-z vim-destructive'>" . __( 'Restore' ) . '</a>';1446 }1447 1448 if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) {1449 $actions['delete'] = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID::delete=1 delete vim-d vim-destructive'>" . __( 'Delete Permanently' ) . '</a>';1450 } else {1451 $actions['trash'] = "<a href='$trash_url' class='delete:the-comment-list:comment-$comment->comment_ID::trash=1 delete vim-d vim-destructive' title='" . esc_attr__( 'Move this comment to the trash' ) . "'>" . _x( 'Trash', 'verb' ) . '</a>';1452 }1453 1454 if ( 'trash' != $the_comment_status ) {1455 $actions['edit'] = "<a href='comment.php?action=editcomment&c={$comment->comment_ID}' title='" . esc_attr__( 'Edit comment' ) . "'>". __( 'Edit' ) . '</a>';1456 $actions['quickedit'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\',\'edit\' );return false;" class="vim-q" title="'.esc_attr__( 'Quick Edit' ).'" href="#">' . __( 'Quick Edit' ) . '</a>';1457 if ( 'spam' != $the_comment_status )1458 $actions['reply'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\' );return false;" class="vim-r" title="'.esc_attr__( 'Reply to this comment' ).'" href="#">' . __( 'Reply' ) . '</a>';1459 }1460 1461 $actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment );1462 1463 $i = 0;1464 echo '<div class="row-actions">';1465 foreach ( $actions as $action => $link ) {1466 ++$i;1467 ( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';1468 1469 // Reply and quickedit need a hide-if-no-js span when not added with ajax1470 if ( ( 'reply' == $action || 'quickedit' == $action ) && ! $this->from_ajax )1471 $action .= ' hide-if-no-js';1472 elseif ( ( $action == 'untrash' && $the_comment_status == 'trash' ) || ( $action == 'unspam' && $the_comment_status == 'spam' ) ) {1473 if ( '1' == get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) )1474 $action .= ' approve';1475 else1476 $action .= ' unapprove';1477 }1478 1479 echo "<span class='$action'>$sep$link</span>";1480 }1481 echo '</div>';1482 }1483 }1484 1485 function column_author( $comment ) {1486 global $comment_status;1487 1488 $author_url = get_comment_author_url();1489 if ( 'http://' == $author_url )1490 $author_url = '';1491 $author_url_display = preg_replace( '|http://(www\.)?|i', '', $author_url );1492 if ( strlen( $author_url_display ) > 50 )1493 $author_url_display = substr( $author_url_display, 0, 49 ) . '...';1494 1495 echo "<strong>"; comment_author(); echo '</strong><br />';1496 if ( !empty( $author_url ) )1497 echo "<a title='$author_url' href='$author_url'>$author_url_display</a><br />";1498 1499 if ( $this->user_can ) {1500 if ( !empty( $comment->comment_author_email ) ) {1501 comment_author_email_link();1502 echo '<br />';1503 }1504 echo '<a href="edit-comments.php?s=';1505 comment_author_IP();1506 echo '&mode=detail';1507 if ( 'spam' == $comment_status )1508 echo '&comment_status=spam';1509 echo '">';1510 comment_author_IP();1511 echo '</a>';1512 }1513 }1514 1515 function column_date( $comment ) {1516 return get_comment_date( __( 'Y/m/d \a\t g:ia' ) );1517 }1518 1519 function column_response( $comment ) {1520 global $post;1521 1522 if ( isset( $this->pending_count[$post->ID] ) ) {1523 $pending_comments = $this->pending_count[$post->ID];1524 } else {1525 $_pending_count_temp = get_pending_comments_num( array( $post->ID ) );1526 $pending_comments = $this->pending_count[$post->ID] = $_pending_count_temp[$post->ID];1527 }1528 1529 if ( current_user_can( 'edit_post', $post->ID ) ) {1530 $post_link = "<a href='" . get_edit_post_link( $post->ID ) . "'>";1531 $post_link .= get_the_title( $post->ID ) . '</a>';1532 } else {1533 $post_link = get_the_title( $post->ID );1534 }1535 1536 echo '<div class="response-links"><span class="post-com-count-wrapper">';1537 echo $post_link . '<br />';1538 $this->comments_bubble( $post->ID, $pending_comments );1539 echo '</span> ';1540 echo "<a href='" . get_permalink( $post->ID ) . "'>#</a>";1541 echo '</div>';1542 if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) )1543 echo $thumb;1544 }1545 1546 function column_default( $comment, $column_name ) {1547 do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID );1548 }1549 }1550 1551 class WP_Post_Comments_Table extends WP_Comments_Table {1552 1553 function get_columns() {1554 return array(1555 'author' => __( 'Author' ),1556 'comment' => _x( 'Comment', 'column name' ),1557 );1558 }1559 1560 function get_sortable_columns() {1561 return array();1562 }1563 }1564 11 1565 12 class WP_Links_Table extends WP_List_Table { … … 1746 193 } 1747 194 1748 class WP_Sites_Table extends WP_List_Table { 195 ?> 1749 196 1750 function WP_Sites_Table() {1751 parent::WP_List_Table( array(1752 'screen' => 'sites-network',1753 'plural' => 'sites',1754 ) );1755 }1756 1757 function check_permissions() {1758 if ( ! current_user_can( 'manage_sites' ) )1759 wp_die( __( 'You do not have permission to access this page.' ) );1760 }1761 1762 function prepare_items() {1763 global $s, $mode, $wpdb;1764 1765 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'list' : $_REQUEST['mode'];1766 1767 $per_page = $this->get_items_per_page( 'sites_network_per_page' );1768 1769 $pagenum = $this->get_pagenum();1770 1771 $s = isset( $_REQUEST['s'] ) ? stripslashes( trim( $_REQUEST[ 's' ] ) ) : '';1772 $like_s = esc_sql( like_escape( $s ) );1773 1774 $query = "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' ";1775 1776 if ( isset( $_REQUEST['searchaction'] ) ) {1777 if ( 'name' == $_REQUEST['searchaction'] ) {1778 $query .= " AND ( {$wpdb->blogs}.domain LIKE '%{$like_s}%' OR {$wpdb->blogs}.path LIKE '%{$like_s}%' ) ";1779 } elseif ( 'id' == $_REQUEST['searchaction'] ) {1780 $query .= " AND {$wpdb->blogs}.blog_id = '{$like_s}' ";1781 } elseif ( 'ip' == $_REQUEST['searchaction'] ) {1782 $query = "SELECT *1783 FROM {$wpdb->blogs}, {$wpdb->registration_log}1784 WHERE site_id = '{$wpdb->siteid}'1785 AND {$wpdb->blogs}.blog_id = {$wpdb->registration_log}.blog_id1786 AND {$wpdb->registration_log}.IP LIKE ( '%{$like_s}%' )";1787 }1788 }1789 1790 $order_by = isset( $_REQUEST['orderby'] ) ? $_REQUEST['orderby'] : 'id';1791 if ( $order_by == 'registered' ) {1792 $query .= ' ORDER BY registered ';1793 } elseif ( $order_by == 'lastupdated' ) {1794 $query .= ' ORDER BY last_updated ';1795 } elseif ( $order_by == 'blogname' ) {1796 $query .= ' ORDER BY domain ';1797 } else {1798 $order_by = 'id';1799 $query .= " ORDER BY {$wpdb->blogs}.blog_id ";1800 }1801 1802 $order = ( isset( $_REQUEST['order'] ) && 'DESC' == strtoupper( $_REQUEST['order'] ) ) ? "DESC" : "ASC";1803 $query .= $order;1804 1805 $total = $wpdb->get_var( str_replace( 'SELECT *', 'SELECT COUNT( blog_id )', $query ) );1806 1807 $query .= " LIMIT " . intval( ( $pagenum - 1 ) * $per_page ) . ", " . intval( $per_page );1808 $this->items = $wpdb->get_results( $query, ARRAY_A );1809 1810 $this->set_pagination_args( array(1811 'total_items' => $total,1812 'per_page' => $per_page,1813 ) );1814 }1815 1816 function no_items() {1817 _e( 'No sites found.' );1818 }1819 1820 function get_bulk_actions() {1821 $actions = array();1822 $actions['delete'] = __( 'Delete' );1823 $actions['spam'] = _x( 'Mark as Spam', 'site' );1824 $actions['notspam'] = _x( 'Not Spam', 'site' );1825 1826 return $actions;1827 }1828 1829 function pagination( $which ) {1830 global $mode;1831 1832 parent::pagination( $which );1833 1834 if ( 'top' == $which )1835 $this->view_switcher( $mode );1836 }1837 1838 function get_columns() {1839 $blogname_columns = ( is_subdomain_install() ) ? __( 'Domain' ) : __( 'Path' );1840 $sites_columns = array(1841 'cb' => '<input type="checkbox" />',1842 'blogname' => $blogname_columns,1843 'lastupdated' => __( 'Last Updated' ),1844 'registered' => _x( 'Registered', 'site' ),1845 'users' => __( 'Users' )1846 );1847 1848 if ( has_filter( 'wpmublogsaction' ) )1849 $sites_columns['plugins'] = __( 'Actions' );1850 1851 $sites_columns = apply_filters( 'wpmu_blogs_columns', $sites_columns );1852 1853 return $sites_columns;1854 }1855 1856 function get_sortable_columns() {1857 return array(1858 'id' => 'id',1859 'blogname' => 'blogname',1860 'lastupdated' => 'lastupdated',1861 'registered' => 'registered',1862 );1863 }1864 1865 function display_rows() {1866 global $current_site, $mode;1867 1868 $status_list = array(1869 'archived' => array( 'site-archived', __( 'Archived' ) ),1870 'spam' => array( 'site-spammed', _x( 'Spam', 'site' ) ),1871 'deleted' => array( 'site-deleted', __( 'Deleted' ) ),1872 'mature' => array( 'site-mature', __( 'Mature' ) )1873 );1874 1875 $class = '';1876 foreach ( $this->items as $blog ) {1877 $class = ( 'alternate' == $class ) ? '' : 'alternate';1878 reset( $status_list );1879 1880 $blog_states = array();1881 foreach ( $status_list as $status => $col ) {1882 if ( get_blog_status( $blog['blog_id'], $status ) == 1 ) {1883 $class = $col[0];1884 $blog_states[] = $col[1];1885 }1886 }1887 $blog_state = '';1888 if ( ! empty( $blog_states ) ) {1889 $state_count = count( $blog_states );1890 $i = 0;1891 $blog_state .= ' - ';1892 foreach ( $blog_states as $state ) {1893 ++$i;1894 ( $i == $state_count ) ? $sep = '' : $sep = ', ';1895 $blog_state .= "<span class='post-state'>$state$sep</span>";1896 }1897 }1898 echo "<tr class='$class'>";1899 1900 $blogname = ( is_subdomain_install() ) ? str_replace( '.'.$current_site->domain, '', $blog['domain'] ) : $blog['path'];1901 1902 list( $columns, $hidden ) = $this->get_column_info();1903 1904 foreach ( $columns as $column_name => $column_display_name ) {1905 switch ( $column_name ) {1906 case 'cb': ?>1907 <th scope="row" class="check-column">1908 <input type="checkbox" id="blog_<?php echo $blog['blog_id'] ?>" name="allblogs[]" value="<?php echo esc_attr( $blog['blog_id'] ) ?>" />1909 </th>1910 <?php1911 break;1912 1913 case 'id': ?>1914 <th valign="top" scope="row">1915 <?php echo $blog['blog_id'] ?>1916 </th>1917 <?php1918 break;1919 1920 case 'blogname': ?>1921 <td class="column-title">1922 <a href="<?php echo esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ); ?>" class="edit"><?php echo $blogname . $blog_state; ?></a>1923 <?php1924 if ( 'list' != $mode )1925 echo '<p>' . sprintf( _x( '%1$s – <em>%2$s</em>', '%1$s: site name. %2$s: site tagline.' ), get_blog_option( $blog['blog_id'], 'blogname' ), get_blog_option( $blog['blog_id'], 'blogdescription ' ) ) . '</p>';1926 1927 // Preordered.1928 $actions = array(1929 'edit' => '', 'backend' => '',1930 'activate' => '', 'deactivate' => '',1931 'archive' => '', 'unarchive' => '',1932 'spam' => '', 'unspam' => '',1933 'delete' => '',1934 'visit' => '',1935 );1936 1937 $actions['edit'] = '<span class="edit"><a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ) . '">' . __( 'Edit' ) . '</a></span>';1938 $actions['backend'] = "<span class='backend'><a href='" . esc_url( get_admin_url( $blog['blog_id'] ) ) . "' class='edit'>" . __( 'Dashboard' ) . '</a></span>';1939 if ( $current_site->blog_id != $blog['blog_id'] ) {1940 if ( get_blog_status( $blog['blog_id'], 'deleted' ) == '1' )1941 $actions['activate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=activateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to activate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Activate' ) . '</a></span>';1942 else1943 $actions['deactivate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deactivateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to deactivate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Deactivate' ) . '</a></span>';1944 1945 if ( get_blog_status( $blog['blog_id'], 'archived' ) == '1' )1946 $actions['unarchive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unarchiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unarchive the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Unarchive' ) . '</a></span>';1947 else1948 $actions['archive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=archiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to archive the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Archive', 'verb; site' ) . '</a></span>';1949 1950 if ( get_blog_status( $blog['blog_id'], 'spam' ) == '1' )1951 $actions['unspam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unspamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unspam the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Not Spam', 'site' ) . '</a></span>';1952 else1953 $actions['spam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=spamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to mark the site %s as spam.' ), $blogname ) ) ) ) . '">' . _x( 'Spam', 'site' ) . '</a></span>';1954 1955 $actions['delete'] = '<span class="delete"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deleteblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to delete the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Delete' ) . '</a></span>';1956 }1957 1958 $actions['visit'] = "<span class='view'><a href='" . esc_url( get_home_url( $blog['blog_id'] ) ) . "' rel='permalink'>" . __( 'Visit' ) . '</a></span>';1959 $actions = array_filter( $actions );1960 echo $this->row_actions( $actions );1961 ?>1962 </td>1963 <?php1964 break;1965 1966 case 'lastupdated': ?>1967 <td valign="top">1968 <?php1969 if ( 'list' == $mode )1970 $date = 'Y/m/d';1971 else1972 $date = 'Y/m/d \<\b\r \/\> g:i:s a';1973 echo ( $blog['last_updated'] == '0000-00-00 00:00:00' ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] ); ?>1974 </td>1975 <?php1976 break;1977 case 'registered': ?>1978 <td valign="top">1979 <?php1980 if ( $blog['registered'] == '0000-00-00 00:00:00' )1981 echo '—';1982 else1983 echo mysql2date( $date, $blog['registered'] );1984 ?>1985 </td>1986 <?php1987 break;1988 case 'users': ?>1989 <td valign="top">1990 <?php1991 $blogusers = get_users( array( 'blog_id' => $blog['blog_id'], 'number' => 6) );1992 if ( is_array( $blogusers ) ) {1993 $blogusers_warning = '';1994 if ( count( $blogusers ) > 5 ) {1995 $blogusers = array_slice( $blogusers, 0, 5 );1996 $blogusers_warning = __( 'Only showing first 5 users.' ) . ' <a href="' . esc_url( get_admin_url( $blog['blog_id'], 'users.php' ) ) . '">' . __( 'More' ) . '</a>';1997 }1998 foreach ( $blogusers as $user_object ) {1999 echo '<a href="' . esc_url( admin_url( 'user-edit.php?user_id=' . $user_object->ID ) ) . '">' . esc_html( $user_object->user_login ) . '</a> ';2000 if ( 'list' != $mode )2001 echo '( ' . $user_object->user_email . ' )';2002 echo '<br />';2003 }2004 if ( $blogusers_warning != '' )2005 echo '<strong>' . $blogusers_warning . '</strong><br />';2006 }2007 ?>2008 </td>2009 <?php2010 break;2011 2012 case 'plugins': ?>2013 <?php if ( has_filter( 'wpmublogsaction' ) ) { ?>2014 <td valign="top">2015 <?php do_action( 'wpmublogsaction', $blog['blog_id'] ); ?>2016 </td>2017 <?php } ?>2018 <?php break;2019 2020 default: ?>2021 <?php if ( has_filter( 'manage_blogs_custom_column' ) ) { ?>2022 <td valign="top">2023 <?php do_action( 'manage_blogs_custom_column', $column_name, $blog['blog_id'] ); ?>2024 </td>2025 <?php } ?>2026 <?php break;2027 }2028 }2029 ?>2030 </tr>2031 <?php2032 }2033 }2034 }2035 2036 class WP_MS_Users_Table extends WP_List_Table {2037 2038 function WP_MS_Users_Table() {2039 parent::WP_List_Table( array(2040 'screen' => 'users-network',2041 ) );2042 }2043 2044 function check_permissions() {2045 if ( !is_multisite() )2046 wp_die( __( 'Multisite support is not enabled.' ) );2047 2048 if ( ! current_user_can( 'manage_network_users' ) )2049 wp_die( __( 'You do not have permission to access this page.' ) );2050 }2051 2052 function prepare_items() {2053 global $usersearch;2054 2055 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';2056 2057 $users_per_page = $this->get_items_per_page( 'users_network_per_page' );2058 2059 $paged = $this->get_pagenum();2060 2061 $args = array(2062 'number' => $users_per_page,2063 'offset' => ( $paged-1 ) * $users_per_page,2064 'search' => $usersearch,2065 'blog_id' => 02066 );2067 2068 if ( isset( $_REQUEST['orderby'] ) )2069 $args['orderby'] = $_REQUEST['orderby'];2070 2071 if ( isset( $_REQUEST['order'] ) )2072 $args['order'] = $_REQUEST['order'];2073 2074 // Query the user IDs for this page2075 $wp_user_search = new WP_User_Query( $args );2076 2077 $this->items = $wp_user_search->get_results();2078 2079 $this->set_pagination_args( array(2080 'total_items' => $wp_user_search->get_total(),2081 'per_page' => $users_per_page,2082 ) );2083 }2084 2085 function get_bulk_actions() {2086 $actions = array();2087 $actions['delete'] = __( 'Delete' );2088 $actions['spam'] = _x( 'Mark as Spam', 'user' );2089 $actions['notspam'] = _x( 'Not Spam', 'user' );2090 2091 return $actions;2092 }2093 2094 function no_items() {2095 _e( 'No users found.' );2096 }2097 2098 function pagination( $which ) {2099 global $mode;2100 2101 parent::pagination ( $which );2102 2103 if ( 'top' == $which )2104 $this->view_switcher( $mode );2105 }2106 2107 function get_columns() {2108 $users_columns = array(2109 'cb' => '<input type="checkbox" />',2110 'login' => __( 'Login' ),2111 'name' => __( 'Name' ),2112 'email' => __( 'E-mail' ),2113 'registered' => _x( 'Registered', 'user' ),2114 'blogs' => __( 'Sites' )2115 );2116 $users_columns = apply_filters( 'wpmu_users_columns', $users_columns );2117 2118 return $users_columns;2119 }2120 2121 function get_sortable_columns() {2122 return array(2123 'id' => 'id',2124 'login' => 'login',2125 'name' => 'name',2126 'email' => 'email',2127 'registered' => 'registered',2128 );2129 }2130 2131 function display_rows() {2132 global $current_site, $mode;2133 2134 $class = '';2135 $super_admins = get_super_admins();2136 foreach ( $this->items as $user ) {2137 $class = ( 'alternate' == $class ) ? '' : 'alternate';2138 2139 $status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' );2140 2141 foreach ( $status_list as $status => $col ) {2142 if ( $user->$status )2143 $class = $col;2144 }2145 2146 ?>2147 <tr class="<?php echo $class; ?>">2148 <?php2149 2150 list( $columns, $hidden ) = $this->get_column_info();2151 2152 foreach ( $columns as $column_name => $column_display_name ) :2153 switch ( $column_name ) {2154 case 'cb': ?>2155 <th scope="row" class="check-column">2156 <input type="checkbox" id="blog_<?php echo $user->ID ?>" name="allusers[]" value="<?php echo esc_attr( $user->ID ) ?>" />2157 </th>2158 <?php2159 break;2160 2161 case 'id': ?>2162 <th valign="top" scope="row">2163 <?php echo $user->ID ?>2164 </th>2165 <?php2166 break;2167 2168 case 'login':2169 $avatar = get_avatar( $user->user_email, 32 );2170 $edit_link = ( get_current_user_id() == $user->ID ) ? 'profile.php' : 'user-edit.php?user_id=' . $user->ID;2171 ?>2172 <td class="username column-username">2173 <?php echo $avatar; ?><strong><a href="<?php echo esc_url( self_admin_url( $edit_link ) ); ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a><?php2174 if ( in_array( $user->user_login, $super_admins ) )2175 echo ' - ' . __( 'Super admin' );2176 ?></strong>2177 <br/>2178 <?php2179 $actions = array();2180 $actions['edit'] = '<a href="' . esc_url( self_admin_url( $edit_link ) ) . '">' . __( 'Edit' ) . '</a>';2181 2182 if ( ! in_array( $user->user_login, $super_admins ) ) {2183 $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deleteuser' ) . '&action=deleteuser&id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';2184 }2185 2186 echo $this->row_actions( $actions );2187 ?>2188 </div>2189 </td>2190 <?php2191 break;2192 2193 case 'name': ?>2194 <td class="name column-name"><?php echo $user->display_name ?></td>2195 <?php2196 break;2197 2198 case 'email': ?>2199 <td class="email column-email"><a href="mailto:<?php echo $user->user_email ?>"><?php echo $user->user_email ?></a></td>2200 <?php2201 break;2202 2203 case 'registered':2204 if ( 'list' == $mode )2205 $date = 'Y/m/d';2206 else2207 $date = 'Y/m/d \<\b\r \/\> g:i:s a';2208 ?>2209 <td><?php echo mysql2date( $date, $user->user_registered ); ?></td>2210 <?php2211 break;2212 2213 case 'blogs':2214 $blogs = get_blogs_of_user( $user->ID, true );2215 ?>2216 <td>2217 <?php2218 if ( is_array( $blogs ) ) {2219 foreach ( (array) $blogs as $key => $val ) {2220 $path = ( $val->path == '/' ) ? '' : $val->path;2221 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . str_replace( '.' . $current_site->domain, '', $val->domain . $path ) . '</a>';2222 echo ' <small class="row-actions">';2223 2224 // Edit2225 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . __( 'Edit' ) . '</a> | ';2226 2227 // View2228 echo '<a ';2229 if ( get_blog_status( $val->userblog_id, 'spam' ) == 1 )2230 echo 'style="background-color: #faa" ';2231 echo 'href="' . esc_url( get_home_url( $val->userblog_id ) ) . '">' . __( 'View' ) . '</a>';2232 2233 echo '</small><br />';2234 }2235 }2236 ?>2237 </td>2238 <?php2239 break;2240 2241 default: ?>2242 <td><?php do_action( 'manage_users_custom_column', $column_name, $user->ID ); ?></td>2243 <?php2244 break;2245 }2246 endforeach2247 ?>2248 </tr>2249 <?php2250 }2251 }2252 }2253 2254 class WP_Plugins_Table extends WP_List_Table {2255 2256 function WP_Plugins_Table() {2257 global $status, $page;2258 2259 $default_status = get_user_option( 'plugins_last_view' );2260 if ( empty( $default_status ) )2261 $default_status = 'all';2262 $status = isset( $_REQUEST['plugin_status'] ) ? $_REQUEST['plugin_status'] : $default_status;2263 if ( !in_array( $status, array( 'all', 'active', 'inactive', 'recently_activated', 'upgrade', 'network', 'mustuse', 'dropins', 'search' ) ) )2264 $status = 'all';2265 if ( $status != $default_status && 'search' != $status )2266 update_user_meta( get_current_user_id(), 'plugins_last_view', $status );2267 2268 $page = $this->get_pagenum();2269 2270 parent::WP_List_Table( array(2271 'screen' => 'plugins',2272 'plural' => 'plugins',2273 ) );2274 }2275 2276 function check_permissions() {2277 if ( is_multisite() ) {2278 $menu_perms = get_site_option( 'menu_items', array() );2279 2280 if ( empty( $menu_perms['plugins'] ) ) {2281 if ( !is_super_admin() )2282 wp_die( __( 'Cheatin’ uh?' ) );2283 }2284 }2285 2286 if ( !current_user_can('activate_plugins') )2287 wp_die( __( 'You do not have sufficient permissions to manage plugins for this site.' ) );2288 }2289 2290 function prepare_items() {2291 global $status, $plugins, $totals, $page, $orderby, $order, $s;2292 2293 wp_reset_vars( array( 'orderby', 'order', 's' ) );2294 2295 $plugins = array(2296 'all' => apply_filters( 'all_plugins', get_plugins() ),2297 'search' => array(),2298 'active' => array(),2299 'inactive' => array(),2300 'recently_activated' => array(),2301 'upgrade' => array(),2302 'mustuse' => array(),2303 'dropins' => array()2304 );2305 2306 if ( ! is_multisite() || ( is_network_admin() && current_user_can('manage_network_plugins') ) ) {2307 if ( apply_filters( 'show_advanced_plugins', true, 'mustuse' ) )2308 $plugins['mustuse'] = get_mu_plugins();2309 if ( apply_filters( 'show_advanced_plugins', true, 'dropins' ) )2310 $plugins['dropins'] = get_dropins();2311 }2312 2313 set_transient( 'plugin_slugs', array_keys( $plugins['all'] ), 86400 );2314 2315 $recently_activated = get_option( 'recently_activated', array() );2316 2317 $one_week = 7*24*60*60;2318 foreach ( $recently_activated as $key => $time )2319 if ( $time + $one_week < time() )2320 unset( $recently_activated[$key] );2321 update_option( 'recently_activated', $recently_activated );2322 2323 $current = get_site_transient( 'update_plugins' );2324 2325 foreach ( array( 'all', 'mustuse', 'dropins' ) as $type ) {2326 foreach ( (array) $plugins[$type] as $plugin_file => $plugin_data ) {2327 // Translate, Apply Markup, Sanitize HTML2328 $plugins[$type][$plugin_file] = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, false, true );2329 }2330 }2331 2332 foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) {2333 // Filter into individual sections2334 if ( is_plugin_active_for_network($plugin_file) && !is_network_admin() ) {2335 unset( $plugins['all'][ $plugin_file ] );2336 continue;2337 } elseif ( is_multisite() && is_network_only_plugin( $plugin_file ) && !current_user_can( 'manage_network_plugins' ) ) {2338 $plugins['network'][ $plugin_file ] = $plugin_data;2339 } elseif ( ( !is_network_admin() && is_plugin_active( $plugin_file ) )2340 || ( is_network_admin() && is_plugin_active_for_network( $plugin_file ) ) ) {2341 $plugins['active'][ $plugin_file ] = $plugin_data;2342 } else {2343 if ( !is_network_admin() && isset( $recently_activated[ $plugin_file ] ) ) // Was the plugin recently activated?2344 $plugins['recently_activated'][ $plugin_file ] = $plugin_data;2345 $plugins['inactive'][ $plugin_file ] = $plugin_data;2346 }2347 2348 if ( isset( $current->response[ $plugin_file ] ) )2349 $plugins['upgrade'][ $plugin_file ] = $plugin_data;2350 }2351 2352 if ( !current_user_can( 'update_plugins' ) )2353 $plugins['upgrade'] = array();2354 2355 if ( $s ) {2356 $status = 'search';2357 $plugins['search'] = array_filter( $plugins['all'], array( $this, '_search_callback' ) );2358 }2359 2360 $totals = array();2361 foreach ( $plugins as $type => $list )2362 $totals[ $type ] = count( $list );2363 2364 if ( empty( $plugins[ $status ] ) && !in_array( $status, array( 'all', 'search' ) ) )2365 $status = 'all';2366 2367 $this->items = $plugins[ $status ];2368 $total_this_page = $totals[ $status ];2369 2370 if ( $orderby ) {2371 $orderby = ucfirst( $orderby );2372 $order = strtoupper( $order );2373 2374 uasort( $this->items, array( $this, '_order_callback' ) );2375 }2376 2377 $plugins_per_page = $this->get_items_per_page( 'plugins_per_page', 999 );2378 2379 $start = ( $page - 1 ) * $plugins_per_page;2380 2381 if ( $total_this_page > $plugins_per_page )2382 $this->items = array_slice( $this->items, $start, $plugins_per_page );2383 2384 $this->set_pagination_args( array(2385 'total_items' => $total_this_page,2386 'per_page' => $plugins_per_page,2387 ) );2388 }2389 2390 function _search_callback( $plugin ) {2391 static $term;2392 if ( is_null( $term ) )2393 $term = stripslashes( $_REQUEST['s'] );2394 2395 foreach ( $plugin as $value )2396 if ( stripos( $value, $term ) !== false )2397 return true;2398 2399 return false;2400 }2401 2402 function _order_callback( $plugin_a, $plugin_b ) {2403 global $orderby, $order;2404 2405 $a = $plugin_a[$orderby];2406 $b = $plugin_b[$orderby];2407 2408 if ( $a == $b )2409 return 0;2410 2411 if ( 'DESC' == $order )2412 return ( $a < $b ) ? 1 : -1;2413 else2414 return ( $a < $b ) ? -1 : 1;2415 }2416 2417 function no_items() {2418 global $plugins;2419 2420 if ( !empty( $plugins['all'] ) )2421 _e( 'No plugins found.' );2422 else2423 _e( 'You do not appear to have any plugins available at this time.' );2424 }2425 2426 function get_columns() {2427 global $status;2428 2429 return array(2430 'cb' => !in_array( $status, array( 'mustuse', 'dropins' ) ) ? '<input type="checkbox" />' : '',2431 'name' => __( 'Plugin' ),2432 'description' => __( 'Description' ),2433 );2434 }2435 2436 function get_sortable_columns() {2437 return array(2438 'name' => 'name',2439 'description' => 'description',2440 );2441 }2442 2443 function display_tablenav( $which ) {2444 global $status;2445 2446 if ( !in_array( $status, array( 'mustuse', 'dropins' ) ) )2447 parent::display_tablenav( $which );2448 }2449 2450 function get_views() {2451 global $totals, $status;2452 2453 $status_links = array();2454 foreach ( $totals as $type => $count ) {2455 if ( !$count )2456 continue;2457 2458 switch ( $type ) {2459 case 'all':2460 $text = _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $count, 'plugins' );2461 break;2462 case 'active':2463 $text = _n( 'Active <span class="count">(%s)</span>', 'Active <span class="count">(%s)</span>', $count );2464 break;2465 case 'recently_activated':2466 $text = _n( 'Recently Active <span class="count">(%s)</span>', 'Recently Active <span class="count">(%s)</span>', $count );2467 break;2468 case 'inactive':2469 $text = _n( 'Inactive <span class="count">(%s)</span>', 'Inactive <span class="count">(%s)</span>', $count );2470 break;2471 case 'network':2472 $text = _n( 'Network <span class="count">(%s)</span>', 'Network <span class="count">(%s)</span>', $count );2473 break;2474 case 'mustuse':2475 $text = _n( 'Must-Use <span class="count">(%s)</span>', 'Must-Use <span class="count">(%s)</span>', $count );2476 break;2477 case 'dropins':2478 $text = _n( 'Drop-ins <span class="count">(%s)</span>', 'Drop-ins <span class="count">(%s)</span>', $count );2479 break;2480 case 'upgrade':2481 $text = _n( 'Upgrade Available <span class="count">(%s)</span>', 'Upgrade Available <span class="count">(%s)</span>', $count );2482 break;2483 case 'search':2484 $text = _n( 'Search Results <span class="count">(%s)</span>', 'Search Results <span class="count">(%s)</span>', $count );2485 break;2486 }2487 2488 $status_links[$type] = sprintf( "<li><a href='%s' %s>%s</a>",2489 add_query_arg('plugin_status', $type, 'plugins.php'),2490 ( $type == $status ) ? ' class="current"' : '',2491 sprintf( $text, number_format_i18n( $count ) )2492 );2493 }2494 2495 return $status_links;2496 }2497 2498 function get_bulk_actions() {2499 global $status;2500 2501 $actions = array();2502 if ( 'active' != $status )2503 $actions['activate-selected'] = __( 'Activate' );2504 if ( is_multisite() && 'network' != $status )2505 $actions['network-activate-selected'] = __( 'Network Activate' );2506 if ( 'inactive' != $status && 'recent' != $status )2507 $actions['deactivate-selected'] = __( 'Deactivate' );2508 if ( current_user_can( 'update_plugins' ) )2509 $actions['update-selected'] = __( 'Update' );2510 if ( current_user_can( 'delete_plugins' ) && ( 'active' != $status ) )2511 $actions['delete-selected'] = __( 'Delete' );2512 2513 return $actions;2514 }2515 2516 function bulk_actions( $which ) {2517 global $status;2518 2519 if ( in_array( $status, array( 'mustuse', 'dropins' ) ) )2520 return;2521 2522 parent::bulk_actions( $which );2523 }2524 2525 function extra_tablenav( $which ) {2526 global $status;2527 2528 if ( 'recently_activated' == $status ) { ?>2529 <div class="alignleft actions">2530 <input type="submit" name="clear-recent-list" value="<?php esc_attr_e( 'Clear List' ) ?>" class="button-secondary" />2531 </div>2532 <?php }2533 }2534 2535 function current_action() {2536 if ( isset($_POST['clear-recent-list']) )2537 return 'clear-recent-list';2538 2539 return parent::current_action();2540 }2541 2542 function display_rows() {2543 global $status, $page, $s;2544 2545 $context = $status;2546 2547 foreach ( $this->items as $plugin_file => $plugin_data ) {2548 // preorder2549 $actions = array(2550 'network_deactivate' => '', 'deactivate' => '',2551 'network_only' => '', 'activate' => '',2552 'network_activate' => '',2553 'edit' => '',2554 'delete' => '',2555 );2556 2557 if ( 'mustuse' == $context ) {2558 if ( is_multisite() && !is_network_admin() )2559 continue;2560 $is_active = true;2561 } elseif ( 'dropins' == $context ) {2562 if ( is_multisite() && !is_network_admin() )2563 continue;2564 $dropins = _get_dropins();2565 $plugin_name = $plugin_file;2566 if ( $plugin_file != $plugin_data['Name'] )2567 $plugin_name .= '<br/>' . $plugin_data['Name'];2568 if ( true === ( $dropins[ $plugin_file ][1] ) ) { // Doesn't require a constant2569 $is_active = true;2570 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';2571 } elseif ( constant( $dropins[ $plugin_file ][1] ) ) { // Constant is true2572 $is_active = true;2573 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';2574 } else {2575 $is_active = false;2576 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . ' <span class="attention">' . __('Inactive:') . '</span></strong> ' . sprintf( __( 'Requires <code>%s</code> in <code>wp-config.php</code>.' ), "define('" . $dropins[ $plugin_file ][1] . "', true);" ) . '</p>';2577 }2578 if ( $plugin_data['Description'] )2579 $description .= '<p>' . $plugin_data['Description'] . '</p>';2580 } else {2581 $is_active_for_network = is_plugin_active_for_network($plugin_file);2582 if ( is_network_admin() )2583 $is_active = $is_active_for_network;2584 else2585 $is_active = is_plugin_active( $plugin_file );2586 2587 if ( $is_active_for_network && !is_super_admin() && !is_network_admin() )2588 continue;2589 2590 if ( is_network_admin() ) {2591 if ( $is_active_for_network ) {2592 if ( current_user_can( 'manage_network_plugins' ) )2593 $actions['network_deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Network Deactivate') . '</a>';2594 } else {2595 if ( current_user_can( 'manage_network_plugins' ) )2596 $actions['network_activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin for all sites in this network') . '" class="edit">' . __('Network Activate') . '</a>';2597 if ( current_user_can('delete_plugins') )2598 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';2599 }2600 } else {2601 if ( $is_active ) {2602 $actions['deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Deactivate') . '</a>';2603 } else {2604 if ( is_network_only_plugin( $plugin_file ) && !is_network_admin() )2605 continue;2606 2607 $actions['activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin') . '" class="edit">' . __('Activate') . '</a>';2608 2609 if ( current_user_can('delete_plugins') )2610 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';2611 } // end if $is_active2612 } // end if is_network_admin()2613 2614 if ( current_user_can('edit_plugins') && is_writable(WP_PLUGIN_DIR . '/' . $plugin_file) )2615 $actions['edit'] = '<a href="plugin-editor.php?file=' . $plugin_file . '" title="' . __('Open this file in the Plugin Editor') . '" class="edit">' . __('Edit') . '</a>';2616 } // end if $context2617 2618 $actions = apply_filters( 'plugin_action_links', array_filter( $actions ), $plugin_file, $plugin_data, $context );2619 $actions = apply_filters( "plugin_action_links_$plugin_file", $actions, $plugin_file, $plugin_data, $context );2620 2621 $class = $is_active ? 'active' : 'inactive';2622 $checkbox = in_array( $status, array( 'mustuse', 'dropins' ) ) ? '' : "<input type='checkbox' name='checked[]' value='" . esc_attr( $plugin_file ) . "' />";2623 if ( 'dropins' != $status ) {2624 $description = '<p>' . $plugin_data['Description'] . '</p>';2625 $plugin_name = $plugin_data['Name'];2626 }2627 2628 $id = sanitize_title( $plugin_name );2629 2630 echo "2631 <tr id='$id' class='$class'>2632 <th scope='row' class='check-column'>$checkbox</th>2633 <td class='plugin-title'><strong>$plugin_name</strong></td>2634 <td class='desc'>$description</td>2635 </tr>2636 <tr class='$class second'>2637 <td></td>2638 <td class='plugin-title'>";2639 2640 echo $this->row_actions( $actions, true );2641 2642 echo "</td>2643 <td class='desc'>";2644 $plugin_meta = array();2645 if ( !empty( $plugin_data['Version'] ) )2646 $plugin_meta[] = sprintf( __( 'Version %s' ), $plugin_data['Version'] );2647 if ( !empty( $plugin_data['Author'] ) ) {2648 $author = $plugin_data['Author'];2649 if ( !empty( $plugin_data['AuthorURI'] ) )2650 $author = '<a href="' . $plugin_data['AuthorURI'] . '" title="' . __( 'Visit author homepage' ) . '">' . $plugin_data['Author'] . '</a>';2651 $plugin_meta[] = sprintf( __( 'By %s' ), $author );2652 }2653 if ( ! empty( $plugin_data['PluginURI'] ) )2654 $plugin_meta[] = '<a href="' . $plugin_data['PluginURI'] . '" title="' . __( 'Visit plugin site' ) . '">' . __( 'Visit plugin site' ) . '</a>';2655 2656 $plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status );2657 echo implode( ' | ', $plugin_meta );2658 echo "</td>2659 </tr>\n";2660 2661 do_action( 'after_plugin_row', $plugin_file, $plugin_data, $status );2662 do_action( "after_plugin_row_$plugin_file", $plugin_file, $plugin_data, $status );2663 }2664 }2665 }2666 2667 class WP_Plugin_Install_Table extends WP_List_Table {2668 2669 function WP_Plugin_Install_Table() {2670 parent::WP_List_Table( array(2671 'screen' => 'plugin-install',2672 ) );2673 }2674 2675 function check_permissions() {2676 if ( ! current_user_can('install_plugins') )2677 wp_die(__('You do not have sufficient permissions to install plugins on this site.'));2678 }2679 2680 function prepare_items() {2681 include( ABSPATH . 'wp-admin/includes/plugin-install.php' );2682 2683 global $tabs, $tab, $paged, $type, $term;2684 2685 wp_reset_vars( array( 'tab' ) );2686 2687 $paged = $this->get_pagenum();2688 2689 $per_page = 30;2690 2691 // These are the tabs which are shown on the page2692 $tabs = array();2693 $tabs['dashboard'] = __( 'Search' );2694 if ( 'search' == $tab )2695 $tabs['search'] = __( 'Search Results' );2696 $tabs['upload'] = __( 'Upload' );2697 $tabs['featured'] = _x( 'Featured','Plugin Installer' );2698 $tabs['popular'] = _x( 'Popular','Plugin Installer' );2699 $tabs['new'] = _x( 'Newest','Plugin Installer' );2700 $tabs['updated'] = _x( 'Recently Updated','Plugin Installer' );2701 2702 $nonmenu_tabs = array( 'plugin-information' ); //Valid actions to perform which do not have a Menu item.2703 2704 $tabs = apply_filters( 'install_plugins_tabs', $tabs );2705 $nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs );2706 2707 // If a non-valid menu tab has been selected, And its not a non-menu action.2708 if ( empty( $tab ) || ( !isset( $tabs[ $tab ] ) && !in_array( $tab, (array) $nonmenu_tabs ) ) )2709 $tab = key( $tabs );2710 2711 $args = array( 'page' => $paged, 'per_page' => $per_page );2712 2713 switch ( $tab ) {2714 case 'search':2715 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : '';2716 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '';2717 2718 switch ( $type ) {2719 case 'tag':2720 $args['tag'] = sanitize_title_with_dashes( $term );2721 break;2722 case 'term':2723 $args['search'] = $term;2724 break;2725 case 'author':2726 $args['author'] = $term;2727 break;2728 }2729 2730 add_action( 'install_plugins_table_header', 'install_search_form' );2731 break;2732 2733 case 'featured':2734 case 'popular':2735 case 'new':2736 case 'updated':2737 $args['browse'] = $tab;2738 break;2739 2740 default:2741 $args = false;2742 }2743 2744 if ( !$args )2745 return;2746 2747 $api = plugins_api( 'query_plugins', $args );2748 2749 if ( is_wp_error( $api ) )2750 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' );2751 2752 $this->items = $api->plugins;2753 2754 $this->set_pagination_args( array(2755 'total_items' => $api->info['results'],2756 'per_page' => $per_page,2757 ) );2758 }2759 2760 function no_items() {2761 _e( 'No plugins match your request.' );2762 }2763 2764 function get_views() {2765 global $tabs, $tab;2766 2767 $display_tabs = array();2768 foreach ( (array) $tabs as $action => $text ) {2769 $class = ( $action == $tab ) ? ' class="current"' : '';2770 $href = admin_url('plugin-install.php?tab=' . $action);2771 $display_tabs[$action] = "<a href='$href'$class>$text</a>";2772 }2773 2774 return $display_tabs;2775 }2776 2777 function display_tablenav( $which ) {2778 if ( 'top' == $which ) { ?>2779 <div class="tablenav">2780 <div class="alignleft actions">2781 <?php do_action( 'install_plugins_table_header' ); ?>2782 </div>2783 <?php $this->pagination( $which ); ?>2784 <br class="clear" />2785 </div>2786 <?php } else { ?>2787 <div class="tablenav">2788 <?php $this->pagination( $which ); ?>2789 <br class="clear" />2790 </div>2791 <?php2792 }2793 }2794 2795 function get_table_classes() {2796 extract( $this->_args );2797 2798 return array( 'widefat', $plural );2799 }2800 2801 function get_columns() {2802 return array(2803 'name' => __( 'Name' ),2804 'version' => __( 'Version' ),2805 'rating' => __( 'Rating' ),2806 'description' => __( 'Description' ),2807 );2808 }2809 2810 function display_rows() {2811 $plugins_allowedtags = array(2812 'a' => array( 'href' => array(),'title' => array(), 'target' => array() ),2813 'abbr' => array( 'title' => array() ),'acronym' => array( 'title' => array() ),2814 'code' => array(), 'pre' => array(), 'em' => array(),'strong' => array(),2815 'ul' => array(), 'ol' => array(), 'li' => array(), 'p' => array(), 'br' => array()2816 );2817 2818 foreach ( (array) $this->items as $plugin ) {2819 if ( is_object( $plugin ) )2820 $plugin = (array) $plugin;2821 2822 $title = wp_kses( $plugin['name'], $plugins_allowedtags );2823 //Limit description to 400char, and remove any HTML.2824 $description = strip_tags( $plugin['description'] );2825 if ( strlen( $description ) > 400 )2826 $description = mb_substr( $description, 0, 400 ) . '…';2827 //remove any trailing entities2828 $description = preg_replace( '/&[^;\s]{0,6}$/', '', $description );2829 //strip leading/trailing & multiple consecutive lines2830 $description = trim( $description );2831 $description = preg_replace( "|(\r?\n)+|", "\n", $description );2832 //\n => <br>2833 $description = nl2br( $description );2834 $version = wp_kses( $plugin['version'], $plugins_allowedtags );2835 2836 $name = strip_tags( $title . ' ' . $version );2837 2838 $author = $plugin['author'];2839 if ( ! empty( $plugin['author'] ) )2840 $author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '.</cite>';2841 2842 $author = wp_kses( $author, $plugins_allowedtags );2843 2844 $action_links = array();2845 $action_links[] = '<a href="' . admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin['slug'] .2846 '&TB_iframe=true&width=600&height=550' ) . '" class="thickbox" title="' .2847 esc_attr( sprintf( __( 'More information about %s' ), $name ) ) . '">' . __( 'Details' ) . '</a>';2848 2849 if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) {2850 $status = install_plugin_install_status( $plugin );2851 2852 switch ( $status['status'] ) {2853 case 'install':2854 if ( $status['url'] )2855 $action_links[] = '<a class="install-now" href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Install %s' ), $name ) ) . '">' . __( 'Install Now' ) . '</a>';2856 break;2857 case 'update_available':2858 if ( $status['url'] )2859 $action_links[] = '<a href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Update to version %s' ), $status['version'] ) ) . '">' . sprintf( __( 'Update Now' ), $status['version'] ) . '</a>';2860 break;2861 case 'latest_installed':2862 case 'newer_installed':2863 $action_links[] = '<span title="' . esc_attr__( 'This plugin is already installed and is up to date' ) . ' ">' . __( 'Installed' ) . '</span>';2864 break;2865 }2866 }2867 2868 $action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin );2869 ?>2870 <tr>2871 <td class="name"><strong><?php echo $title; ?></strong>2872 <div class="action-links"><?php if ( !empty( $action_links ) ) echo implode( ' | ', $action_links ); ?></div>2873 </td>2874 <td class="vers"><?php echo $version; ?></td>2875 <td class="vers">2876 <div class="star-holder" title="<?php printf( _n( '( based on %s rating )', '( based on %s ratings )', $plugin['num_ratings'] ), number_format_i18n( $plugin['num_ratings'] ) ) ?>">2877 <div class="star star-rating" style="width: <?php echo esc_attr( $plugin['rating'] ) ?>px"></div>2878 <div class="star star5"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '5 stars' ) ?>" /></div>2879 <div class="star star4"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '4 stars' ) ?>" /></div>2880 <div class="star star3"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '3 stars' ) ?>" /></div>2881 <div class="star star2"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '2 stars' ) ?>" /></div>2882 <div class="star star1"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '1 star' ) ?>" /></div>2883 </div>2884 </td>2885 <td class="desc"><?php echo $description, $author; ?></td>2886 </tr>2887 <?php2888 }2889 }2890 }2891 2892 class WP_Themes_Table extends WP_List_Table {2893 2894 var $search = array();2895 var $features = array();2896 2897 function WP_Themes_Table() {2898 parent::__construct( array(2899 'screen' => 'themes',2900 ) );2901 }2902 2903 function check_permissions() {2904 if ( !current_user_can('switch_themes') && !current_user_can('edit_theme_options') )2905 wp_die( __( 'Cheatin’ uh?' ) );2906 }2907 2908 function prepare_items() {2909 global $ct;2910 2911 $ct = current_theme_info();2912 2913 $themes = get_allowed_themes();2914 2915 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';2916 2917 if ( '' !== $search ) {2918 $this->search = array_merge( $this->search, array_filter( array_map( 'trim', explode( ',', $search ) ) ) );2919 $this->search = array_unique( $this->search );2920 }2921 2922 if ( !empty( $_REQUEST['features'] ) ) {2923 $this->features = $_REQUEST['features'];2924 $this->features = array_map( 'trim', $this->features );2925 $this->features = array_map( 'sanitize_title_with_dashes', $this->features );2926 $this->features = array_unique( $this->features );2927 }2928 2929 if ( $this->search || $this->features ) {2930 foreach ( $themes as $key => $theme ) {2931 if ( !$this->search_theme( $theme ) )2932 unset( $themes[ $key ] );2933 }2934 }2935 2936 unset( $themes[$ct->name] );2937 uksort( $themes, "strnatcasecmp" );2938 2939 $per_page = 15;2940 $page = $this->get_pagenum();2941 2942 $start = ( $page - 1 ) * $per_page;2943 2944 $this->items = array_slice( $themes, $start, $per_page );2945 2946 $this->set_pagination_args( array(2947 'query_var' => 'pagenum',2948 'total_items' => count( $themes ),2949 'per_page' => $per_page,2950 ) );2951 }2952 2953 function no_items() {2954 if ( current_user_can( 'install_themes' ) )2955 printf( __( 'You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress.org Theme Directory at any time: just click on the <em><a href="%s">Install Themes</a></em> tab above.' ), 'theme-install.php' );2956 else2957 printf( __( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ), get_site_option( 'site_name' ) );2958 }2959 2960 function display_table() {2961 ?>2962 <div class="tablenav">2963 <?php $this->pagination( 'top' ); ?>2964 <br class="clear" />2965 </div>2966 2967 <table id="availablethemes" cellspacing="0" cellpadding="0">2968 <tbody id="the-list" class="list:themes">2969 <?php $this->display_rows(); ?>2970 </tbody>2971 </table>2972 2973 <div class="tablenav">2974 <?php $this->pagination( 'bottom' ); ?>2975 <br class="clear" />2976 </div>2977 <?php2978 }2979 2980 function get_columns() {2981 return array();2982 }2983 2984 function display_rows() {2985 $themes = $this->items;2986 $theme_names = array_keys( $themes );2987 natcasesort( $theme_names );2988 2989 $table = array();2990 $rows = ceil( count( $theme_names ) / 3 );2991 for ( $row = 1; $row <= $rows; $row++ )2992 for ( $col = 1; $col <= 3; $col++ )2993 $table[$row][$col] = array_shift( $theme_names );2994 2995 foreach ( $table as $row => $cols ) {2996 ?>2997 <tr>2998 <?php2999 foreach ( $cols as $col => $theme_name ) {3000 $class = array( 'available-theme' );3001 if ( $row == 1 ) $class[] = 'top';3002 if ( $col == 1 ) $class[] = 'left';3003 if ( $row == $rows ) $class[] = 'bottom';3004 if ( $col == 3 ) $class[] = 'right';3005 ?>3006 <td class="<?php echo join( ' ', $class ); ?>">3007 <?php if ( !empty( $theme_name ) ) :3008 $template = $themes[$theme_name]['Template'];3009 $stylesheet = $themes[$theme_name]['Stylesheet'];3010 $title = $themes[$theme_name]['Title'];3011 $version = $themes[$theme_name]['Version'];3012 $description = $themes[$theme_name]['Description'];3013 $author = $themes[$theme_name]['Author'];3014 $screenshot = $themes[$theme_name]['Screenshot'];3015 $stylesheet_dir = $themes[$theme_name]['Stylesheet Dir'];3016 $template_dir = $themes[$theme_name]['Template Dir'];3017 $parent_theme = $themes[$theme_name]['Parent Theme'];3018 $theme_root = $themes[$theme_name]['Theme Root'];3019 $theme_root_uri = $themes[$theme_name]['Theme Root URI'];3020 $preview_link = esc_url( get_option( 'home' ) . '/' );3021 if ( is_ssl() )3022 $preview_link = str_replace( 'http://', 'https://', $preview_link );3023 $preview_link = htmlspecialchars( add_query_arg( array( 'preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'TB_iframe' => 'true' ), $preview_link ) );3024 $preview_text = esc_attr( sprintf( __( 'Preview of “%s”' ), $title ) );3025 $tags = $themes[$theme_name]['Tags'];3026 $thickbox_class = 'thickbox thickbox-preview';3027 $activate_link = wp_nonce_url( "themes.php?action=activate&template=".urlencode( $template )."&stylesheet=".urlencode( $stylesheet ), 'switch-theme_' . $template );3028 $activate_text = esc_attr( sprintf( __( 'Activate “%s”' ), $title ) );3029 $actions = array();3030 $actions[] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __( 'Activate' ) . '</a>';3031 $actions[] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr( sprintf( __( 'Preview “%s”' ), $theme_name ) ) . '">' . __( 'Preview' ) . '</a>';3032 if ( current_user_can( 'delete_themes' ) )3033 $actions[] = '<a class="submitdelete deletion" href="' . wp_nonce_url( "themes.php?action=delete&template=$stylesheet", 'delete-theme_' . $stylesheet ) . '" onclick="' . "return confirm( '" . esc_js( sprintf( __( "You are about to delete this theme '%s'\n 'Cancel' to stop, 'OK' to delete." ), $theme_name ) ) . "' );" . '">' . __( 'Delete' ) . '</a>';3034 $actions = apply_filters( 'theme_action_links', $actions, $themes[$theme_name] );3035 3036 $actions = implode ( ' | ', $actions );3037 ?>3038 <a href="<?php echo $preview_link; ?>" class="<?php echo $thickbox_class; ?> screenshot">3039 <?php if ( $screenshot ) : ?>3040 <img src="<?php echo $theme_root_uri . '/' . $stylesheet . '/' . $screenshot; ?>" alt="" />3041 <?php endif; ?>3042 </a>3043 <h3><?php3044 /* translators: 1: theme title, 2: theme version, 3: theme author */3045 printf( __( '%1$s %2$s by %3$s' ), $title, $version, $author ) ; ?></h3>3046 <p class="description"><?php echo $description; ?></p>3047 <span class='action-links'><?php echo $actions ?></span>3048 <?php if ( current_user_can( 'edit_themes' ) && $parent_theme ) {3049 /* translators: 1: theme title, 2: template dir, 3: stylesheet_dir, 4: theme title, 5: parent_theme */ ?>3050 <p><?php printf( __( 'The template files are located in <code>%2$s</code>. The stylesheet files are located in <code>%3$s</code>. <strong>%4$s</strong> uses templates from <strong>%5$s</strong>. Changes made to the templates will affect both themes.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ), $title, $parent_theme ); ?></p>3051 <?php } else { ?>3052 <p><?php printf( __( 'All of this theme’s files are located in <code>%2$s</code>.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ) ); ?></p>3053 <?php } ?>3054 <?php if ( $tags ) : ?>3055 <p><?php _e( 'Tags:' ); ?> <?php echo join( ', ', $tags ); ?></p>3056 <?php endif; ?>3057 <?php theme_update_available( $themes[$theme_name] ); ?>3058 <?php endif; // end if not empty theme_name ?>3059 </td>3060 <?php } // end foreach $cols ?>3061 </tr>3062 <?php } // end foreach $table3063 }3064 3065 function search_theme( $theme ) {3066 $matched = 0;3067 3068 // Match all phrases3069 if ( count( $this->search ) > 0 ) {3070 foreach ( $this->search as $word ) {3071 $matched = 0;3072 3073 // In a tag?3074 if ( in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) )3075 $matched = 1;3076 3077 // In one of the fields?3078 foreach ( array( 'Name', 'Title', 'Description', 'Author', 'Template', 'Stylesheet' ) AS $field ) {3079 if ( stripos( $theme[$field], $word ) !== false )3080 $matched++;3081 }3082 3083 if ( $matched == 0 )3084 return false;3085 }3086 }3087 3088 // Now search the features3089 if ( count( $this->features ) > 0 ) {3090 foreach ( $this->features as $word ) {3091 // In a tag?3092 if ( !in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) )3093 return false;3094 }3095 }3096 3097 // Only get here if each word exists in the tags or one of the fields3098 return true;3099 }3100 }3101 3102 class WP_Theme_Install_Table extends WP_List_Table {3103 3104 function WP_Theme_Install_Table() {3105 parent::WP_List_Table( array(3106 'screen' => 'theme-install',3107 ) );3108 }3109 3110 function check_permissions() {3111 if ( ! current_user_can('install_themes') )3112 wp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) );3113 }3114 3115 function prepare_items() {3116 include( ABSPATH . 'wp-admin/includes/theme-install.php' );3117 3118 global $tabs, $tab, $paged, $type, $term, $theme_field_defaults;3119 3120 wp_reset_vars( array( 'tab' ) );3121 3122 $paged = $this->get_pagenum();3123 3124 $per_page = 30;3125 3126 // These are the tabs which are shown on the page,3127 $tabs = array();3128 $tabs['dashboard'] = __( 'Search' );3129 if ( 'search' == $tab )3130 $tabs['search'] = __( 'Search Results' );3131 $tabs['upload'] = __( 'Upload' );3132 $tabs['featured'] = _x( 'Featured','Theme Installer' );3133 //$tabs['popular'] = _x( 'Popular','Theme Installer' );3134 $tabs['new'] = _x( 'Newest','Theme Installer' );3135 $tabs['updated'] = _x( 'Recently Updated','Theme Installer' );3136 3137 $nonmenu_tabs = array( 'theme-information' ); // Valid actions to perform which do not have a Menu item.3138 3139 $tabs = apply_filters( 'install_themes_tabs', $tabs );3140 $nonmenu_tabs = apply_filters( 'install_themes_nonmenu_tabs', $nonmenu_tabs );3141 3142 // If a non-valid menu tab has been selected, And its not a non-menu action.3143 if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs ) ) )3144 $tab = key( $tabs );3145 3146 $args = array( 'page' => $paged, 'per_page' => $per_page, 'fields' => $theme_field_defaults );3147 3148 switch ( $tab ) {3149 case 'search':3150 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : '';3151 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '';3152 3153 switch ( $type ) {3154 case 'tag':3155 $terms = explode( ',', $term );3156 $terms = array_map( 'trim', $terms );3157 $terms = array_map( 'sanitize_title_with_dashes', $terms );3158 $args['tag'] = $terms;3159 break;3160 case 'term':3161 $args['search'] = $term;3162 break;3163 case 'author':3164 $args['author'] = $term;3165 break;3166 }3167 3168 if ( !empty( $_POST['features'] ) ) {3169 $terms = $_POST['features'];3170 $terms = array_map( 'trim', $terms );3171 $terms = array_map( 'sanitize_title_with_dashes', $terms );3172 $args['tag'] = $terms;3173 $_REQUEST['s'] = implode( ',', $terms );3174 $_REQUEST['type'] = 'tag';3175 }3176 3177 add_action( 'install_themes_table_header', 'install_theme_search_form' );3178 break;3179 3180 case 'featured':3181 //case 'popular':3182 case 'new':3183 case 'updated':3184 $args['browse'] = $tab;3185 break;3186 3187 default:3188 $args = false;3189 }3190 3191 if ( !$args )3192 return;3193 3194 $api = themes_api( 'query_themes', $args );3195 3196 if ( is_wp_error( $api ) )3197 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' );3198 3199 $this->items = $api->themes;3200 3201 $this->set_pagination_args( array(3202 'total_items' => $api->info['results'],3203 'per_page' => $per_page,3204 ) );3205 }3206 3207 function no_items() {3208 _e( 'No themes match your request.' );3209 }3210 3211 function get_views() {3212 global $tabs, $tab;3213 3214 $display_tabs = array();3215 foreach ( (array) $tabs as $action => $text ) {3216 $class = ( $action == $tab ) ? ' class="current"' : '';3217 $href = self_admin_url('theme-install.php?tab=' . $action);3218 $display_tabs[$action] = "<a href='$href'$class>$text</a>";3219 }3220 3221 return $display_tabs;3222 }3223 3224 function get_columns() {3225 return array();3226 }3227 3228 function display_table() {3229 ?>3230 <div class="tablenav">3231 <div class="alignleft actions">3232 <?php do_action( 'install_themes_table_header' ); ?>3233 </div>3234 <?php $this->pagination( 'top' ); ?>3235 <br class="clear" />3236 </div>3237 3238 <table id="availablethemes" cellspacing="0" cellpadding="0">3239 <tbody id="the-list" class="list:themes">3240 <?php $this->display_rows(); ?>3241 </tbody>3242 </table>3243 3244 <div class="tablenav">3245 <?php $this->pagination( 'bottom' ); ?>3246 <br class="clear" />3247 </div>3248 <?php3249 }3250 3251 function display_rows() {3252 $themes = $this->items;3253 3254 $rows = ceil( count( $themes ) / 3 );3255 $table = array();3256 $theme_keys = array_keys( $themes );3257 for ( $row = 1; $row <= $rows; $row++ )3258 for ( $col = 1; $col <= 3; $col++ )3259 $table[$row][$col] = array_shift( $theme_keys );3260 3261 foreach ( $table as $row => $cols ) {3262 echo "\t<tr>\n";3263 foreach ( $cols as $col => $theme_index ) {3264 $class = array( 'available-theme' );3265 if ( $row == 1 ) $class[] = 'top';3266 if ( $col == 1 ) $class[] = 'left';3267 if ( $row == $rows ) $class[] = 'bottom';3268 if ( $col == 3 ) $class[] = 'right';3269 ?>3270 <td class="<?php echo join( ' ', $class ); ?>"><?php3271 if ( isset( $themes[$theme_index] ) )3272 display_theme( $themes[$theme_index] );3273 ?></td>3274 <?php } // end foreach $cols3275 echo "\t</tr>\n";3276 } // end foreach $table3277 }3278 }3279 -
trunk/wp-admin/includes/list-table-media.php
r15954 r15955 450 450 } 451 451 452 class WP_Terms_Table extends WP_List_Table { 453 454 var $callback_args; 455 456 function WP_Terms_Table() { 457 global $post_type, $taxonomy, $tax, $current_screen; 458 459 wp_reset_vars( array( 'action', 'taxonomy', 'post_type' ) ); 460 461 if ( empty( $taxonomy ) ) 462 $taxonomy = 'post_tag'; 463 464 if ( !taxonomy_exists( $taxonomy ) ) 465 wp_die( __( 'Invalid taxonomy' ) ); 466 467 $tax = get_taxonomy( $taxonomy ); 468 469 if ( empty( $post_type ) || !in_array( $post_type, get_post_types( array( 'public' => true ) ) ) ) 470 $post_type = 'post'; 471 472 if ( !isset( $current_screen ) ) 473 set_current_screen( 'edit-' . $taxonomy ); 474 475 parent::WP_List_Table( array( 476 'screen' => $current_screen, 477 'plural' => 'tags', 478 'singular' => 'tag', 479 ) ); 480 } 481 482 function check_permissions( $type = 'manage' ) { 483 global $tax; 484 485 $cap = 'manage' == $type ? $tax->cap->manage_terms : $tax->cap->edit_terms; 486 487 if ( !current_user_can( $tax->cap->manage_terms ) ) 488 wp_die( __( 'Cheatin’ uh?' ) ); 489 } 490 491 function prepare_items() { 492 global $taxonomy; 493 494 $tags_per_page = $this->get_items_per_page( 'edit_' . $taxonomy . '_per_page' ); 495 496 if ( 'post_tag' == $taxonomy ) { 497 $tags_per_page = apply_filters( 'edit_tags_per_page', $tags_per_page ); 498 $tags_per_page = apply_filters( 'tagsperpage', $tags_per_page ); // Old filter 499 } elseif ( 'category' == $taxonomy ) { 500 $tags_per_page = apply_filters( 'edit_categories_per_page', $tags_per_page ); // Old filter 501 } 502 503 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : ''; 504 505 $args = array( 506 'search' => $search, 507 'page' => $this->get_pagenum(), 508 'number' => $tags_per_page, 509 ); 510 511 if ( !empty( $_REQUEST['orderby'] ) ) 512 $args['orderby'] = trim( stripslashes( $_REQUEST['orderby'] ) ); 513 514 if ( !empty( $_REQUEST['order'] ) ) 515 $args['order'] = trim( stripslashes( $_REQUEST['order'] ) ); 516 517 $this->callback_args = $args; 518 519 $this->set_pagination_args( array( 520 'total_items' => wp_count_terms( $taxonomy, compact( 'search' ) ), 521 'per_page' => $tags_per_page, 522 ) ); 523 } 524 525 function get_bulk_actions() { 526 $actions = array(); 527 $actions['delete'] = __( 'Delete' ); 528 529 return $actions; 530 } 531 532 function current_action() { 533 if ( isset( $_REQUEST['action'] ) && isset( $_REQUEST['delete_tags'] ) && ( 'delete' == $_REQUEST['action'] || 'delete' == $_REQUEST['action2'] ) ) 534 return 'bulk-delete'; 535 536 return parent::current_action(); 537 } 538 539 function get_columns() { 540 global $taxonomy; 541 542 $columns = array( 543 'cb' => '<input type="checkbox" />', 544 'name' => __( 'Name' ), 545 'description' => __( 'Description' ), 546 'slug' => __( 'Slug' ), 547 ); 548 549 if ( 'link_category' == $taxonomy ) 550 $columns['links'] = __( 'Links' ); 551 else 552 $columns['posts'] = __( 'Posts' ); 553 554 return $columns; 555 } 556 557 function get_sortable_columns() { 558 return array( 559 'name' => 'name', 560 'description' => 'description', 561 'slug' => 'slug', 562 'posts' => 'count', 563 'links' => 'count' 564 ); 565 } 566 567 function display_rows() { 568 global $taxonomy; 569 570 $args = wp_parse_args( $this->callback_args, array( 571 'page' => 1, 572 'number' => 20, 573 'search' => '', 574 'hide_empty' => 0 575 ) ); 576 577 extract( $args, EXTR_SKIP ); 578 579 $args['offset'] = $offset = ( $page - 1 ) * $number; 580 581 // convert it to table rows 582 $out = ''; 583 $count = 0; 584 if ( is_taxonomy_hierarchical( $taxonomy ) && !isset( $orderby ) ) { 585 // We'll need the full set of terms then. 586 $args['number'] = $args['offset'] = 0; 587 588 $terms = get_terms( $taxonomy, $args ); 589 if ( !empty( $search ) ) // Ignore children on searches. 590 $children = array(); 591 else 592 $children = _get_term_hierarchy( $taxonomy ); 593 594 // Some funky recursion to get the job done( Paging & parents mainly ) is contained within, Skip it for non-hierarchical taxonomies for performance sake 595 $out .= $this->_rows( $taxonomy, $terms, $children, $offset, $number, $count ); 596 } else { 597 $terms = get_terms( $taxonomy, $args ); 598 foreach ( $terms as $term ) 599 $out .= $this->single_row( $term, 0, $taxonomy ); 600 $count = $number; // Only displaying a single page. 601 } 602 603 echo $out; 604 } 605 606 function _rows( $taxonomy, $terms, &$children, $start = 0, $per_page = 20, &$count, $parent = 0, $level = 0 ) { 607 608 $end = $start + $per_page; 609 610 $output = ''; 611 foreach ( $terms as $key => $term ) { 612 613 if ( $count >= $end ) 614 break; 615 616 if ( $term->parent != $parent && empty( $_REQUEST['s'] ) ) 617 continue; 618 619 // If the page starts in a subtree, print the parents. 620 if ( $count == $start && $term->parent > 0 && empty( $_REQUEST['s'] ) ) { 621 $my_parents = $parent_ids = array(); 622 $p = $term->parent; 623 while ( $p ) { 624 $my_parent = get_term( $p, $taxonomy ); 625 $my_parents[] = $my_parent; 626 $p = $my_parent->parent; 627 if ( in_array( $p, $parent_ids ) ) // Prevent parent loops. 628 break; 629 $parent_ids[] = $p; 630 } 631 unset( $parent_ids ); 632 633 $num_parents = count( $my_parents ); 634 while ( $my_parent = array_pop( $my_parents ) ) { 635 $output .= "\t" . $this->single_row( $my_parent, $level - $num_parents, $taxonomy ); 636 $num_parents--; 637 } 638 } 639 640 if ( $count >= $start ) 641 $output .= "\t" . $this->single_row( $term, $level, $taxonomy ); 642 643 ++$count; 644 645 unset( $terms[$key] ); 646 647 if ( isset( $children[$term->term_id] ) && empty( $_REQUEST['s'] ) ) 648 $output .= $this->_rows( $taxonomy, $terms, $children, $start, $per_page, $count, $term->term_id, $level + 1 ); 649 } 650 651 return $output; 652 } 653 654 function single_row( $tag, $level = 0 ) { 655 static $row_class = ''; 656 $row_class = ( $row_class == '' ? ' class="alternate"' : '' ); 657 658 $this->level = $level; 659 660 echo '<tr id="tag-' . $tag->term_id . '"' . $row_class . '>'; 661 echo $this->single_row_columns( $tag ); 662 echo '</tr>'; 663 } 664 665 function column_cb( $tag ) { 666 global $taxonomy, $tax; 667 668 $default_term = get_option( 'default_' . $taxonomy ); 669 670 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term ) 671 return '<input type="checkbox" name="delete_tags[]" value="' . $tag->term_id . '" />'; 672 else 673 return ' '; 674 } 675 676 function column_name( $tag ) { 677 global $taxonomy, $tax, $post_type; 678 679 $default_term = get_option( 'default_' . $taxonomy ); 680 681 $pad = str_repeat( '— ', max( 0, $this->level ) ); 682 $name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag ); 683 $qe_data = get_term( $tag->term_id, $taxonomy, OBJECT, 'edit' ); 684 $edit_link = get_edit_term_link( $tag->term_id, $taxonomy, $post_type ); 685 686 $out = '<strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $name ) ) . '">' . $name . '</a></strong><br />'; 687 688 $actions = array(); 689 if ( current_user_can( $tax->cap->edit_terms ) ) { 690 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>'; 691 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __( 'Quick Edit' ) . '</a>'; 692 } 693 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term ) 694 $actions['delete'] = "<a class='delete-tag' href='" . wp_nonce_url( "edit-tags.php?action=delete&taxonomy=$taxonomy&tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id ) . "'>" . __( 'Delete' ) . "</a>"; 695 696 $actions = apply_filters( 'tag_row_actions', $actions, $tag ); 697 $actions = apply_filters( "${taxonomy}_row_actions", $actions, $tag ); 698 699 $out .= $this->row_actions( $actions ); 700 $out .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">'; 701 $out .= '<div class="name">' . $qe_data->name . '</div>'; 702 $out .= '<div class="slug">' . apply_filters( 'editable_slug', $qe_data->slug ) . '</div>'; 703 $out .= '<div class="parent">' . $qe_data->parent . '</div></div></td>'; 704 705 return $out; 706 } 707 708 function column_description( $tag ) { 709 return $tag->description; 710 } 711 712 function column_slug( $tag ) { 713 return apply_filters( 'editable_slug', $tag->slug ); 714 } 715 716 function column_posts( $tag ) { 717 global $taxonomy, $post_type; 718 719 $count = number_format_i18n( $tag->count ); 720 721 if ( 'post_tag' == $taxonomy ) { 722 $tagsel = 'tag'; 723 } elseif ( 'category' == $taxonomy ) { 724 $tagsel = 'category_name'; 725 } elseif ( ! empty( $tax->query_var ) ) { 726 $tagsel = $tax->query_var; 727 } else { 728 $tagsel = $taxonomy; 729 } 730 731 return "<a href='edit.php?$tagsel=$tag->slug&post_type=$post_type'>$count</a>"; 732 } 733 734 function column_links( $tag ) { 735 $count = number_format_i18n( $tag->count ); 736 return $count; 737 } 738 739 function column_default( $tag, $column_name ) { 740 global $taxonomy; 741 742 return apply_filters( "manage_${taxonomy}_custom_column", '', $column_name, $tag->term_id ); 743 $out .= "</td>"; 744 } 745 746 /** 747 * Outputs the hidden row displayed when inline editing 748 * 749 * @since 3.1.0 750 */ 751 function inline_edit() { 752 global $tax; 753 754 if ( ! current_user_can( $tax->cap->edit_terms ) ) 755 return; 756 757 list( $columns, $hidden ) = $this->get_column_info(); 758 759 $col_count = count( $columns ) - count( $hidden ); 760 ?> 761 762 <form method="get" action=""><table style="display: none"><tbody id="inlineedit"> 763 <tr id="inline-edit" class="inline-edit-row" style="display: none"><td colspan="<?php echo $col_count; ?>"> 764 765 <fieldset><div class="inline-edit-col"> 766 <h4><?php _e( 'Quick Edit' ); ?></h4> 767 768 <label> 769 <span class="title"><?php _e( 'Name' ); ?></span> 770 <span class="input-text-wrap"><input type="text" name="name" class="ptitle" value="" /></span> 771 </label> 772 <?php if ( !global_terms_enabled() ) { ?> 773 <label> 774 <span class="title"><?php _e( 'Slug' ); ?></span> 775 <span class="input-text-wrap"><input type="text" name="slug" class="ptitle" value="" /></span> 776 </label> 777 <?php } ?> 778 779 </div></fieldset> 780 <?php 781 782 $core_columns = array( 'cb' => true, 'description' => true, 'name' => true, 'slug' => true, 'posts' => true ); 783 784 foreach ( $columns as $column_name => $column_display_name ) { 785 if ( isset( $core_columns[$column_name] ) ) 786 continue; 787 do_action( 'quick_edit_custom_box', $column_name, $type, $tax->taxonomy ); 788 } 789 790 ?> 791 792 <p class="inline-edit-save submit"> 793 <a accesskey="c" href="#inline-edit" title="<?php _e( 'Cancel' ); ?>" class="cancel button-secondary alignleft"><?php _e( 'Cancel' ); ?></a> 794 <?php $update_text = $tax->labels->update_item; ?> 795 <a accesskey="s" href="#inline-edit" title="<?php echo esc_attr( $update_text ); ?>" class="save button-primary alignright"><?php echo $update_text; ?></a> 796 <img class="waiting" style="display:none;" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" /> 797 <span class="error" style="display:none;"></span> 798 <?php wp_nonce_field( 'taxinlineeditnonce', '_inline_edit', false ); ?> 799 <input type="hidden" name="taxonomy" value="<?php echo esc_attr( $tax->name ); ?>" /> 800 <br class="clear" /> 801 </p> 802 </td></tr> 803 </tbody></table></form> 804 <?php 805 } 806 } 807 808 class WP_Users_Table extends WP_List_Table { 809 810 function WP_Users_Table() { 811 parent::WP_List_Table( array( 812 'screen' => 'users', 813 'plural' => 'users' 814 ) ); 815 } 816 817 function check_permissions() { 818 if ( !current_user_can('list_users') ) 819 wp_die(__('Cheatin’ uh?')); 820 } 821 822 function prepare_items() { 823 global $role, $usersearch; 824 825 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : ''; 826 827 $role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : ''; 828 829 $users_per_page = $this->get_items_per_page( 'users_per_page' ); 830 831 $paged = $this->get_pagenum(); 832 833 $args = array( 834 'number' => $users_per_page, 835 'offset' => ( $paged-1 ) * $users_per_page, 836 'role' => $role, 837 'search' => $usersearch 838 ); 839 840 if ( isset( $_REQUEST['orderby'] ) ) 841 $args['orderby'] = $_REQUEST['orderby']; 842 843 if ( isset( $_REQUEST['order'] ) ) 844 $args['order'] = $_REQUEST['order']; 845 846 // Query the user IDs for this page 847 $wp_user_search = new WP_User_Query( $args ); 848 849 $this->items = $wp_user_search->get_results(); 850 851 $this->set_pagination_args( array( 852 'total_items' => $wp_user_search->get_total(), 853 'per_page' => $users_per_page, 854 ) ); 855 } 856 857 function no_items() { 858 _e( 'No matching users were found.' ); 859 } 860 861 function get_views() { 862 global $wp_roles, $role; 863 864 $users_of_blog = count_users(); 865 $total_users = $users_of_blog['total_users']; 866 $avail_roles =& $users_of_blog['avail_roles']; 867 unset($users_of_blog); 868 869 $current_role = false; 870 $class = empty($role) ? ' class="current"' : ''; 871 $role_links = array(); 872 $role_links['all'] = "<li><a href='users.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>'; 873 foreach ( $wp_roles->get_names() as $this_role => $name ) { 874 if ( !isset($avail_roles[$this_role]) ) 875 continue; 876 877 $class = ''; 878 879 if ( $this_role == $role ) { 880 $current_role = $role; 881 $class = ' class="current"'; 882 } 883 884 $name = translate_user_role( $name ); 885 /* translators: User role name with count */ 886 $name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, $avail_roles[$this_role] ); 887 $role_links[$this_role] = "<li><a href='users.php?role=$this_role'$class>$name</a>"; 888 } 889 890 return $role_links; 891 } 892 893 function get_bulk_actions() { 894 $actions = array(); 895 896 if ( !is_multisite() && current_user_can( 'delete_users' ) ) 897 $actions['delete'] = __( 'Delete' ); 898 else 899 $actions['remove'] = __( 'Remove' ); 900 901 return $actions; 902 } 903 904 function extra_tablenav( $which ) { 905 if ( 'top' != $which ) 906 return; 907 ?> 908 <div class="alignleft actions"> 909 <label class="screen-reader-text" for="new_role"><?php _e( 'Change role to…' ) ?></label> 910 <select name="new_role" id="new_role"> 911 <option value=''><?php _e( 'Change role to…' ) ?></option> 912 <?php wp_dropdown_roles(); ?> 913 </select> 914 <input type="submit" value="<?php esc_attr_e( 'Change' ); ?>" name="changeit" class="button-secondary" /> 915 </div> 916 <?php 917 } 918 919 function current_action() { 920 if ( isset($_REQUEST['changeit']) && !empty($_REQUEST['new_role']) ) 921 return 'promote'; 922 923 return parent::current_action(); 924 } 925 926 function get_columns() { 927 return array( 928 'cb' => '<input type="checkbox" />', 929 'username' => __( 'Login' ), 930 'name' => __( 'Name' ), 931 'email' => __( 'E-mail' ), 932 'role' => __( 'Role' ), 933 'posts' => __( 'Posts' ) 934 ); 935 } 936 937 function get_sortable_columns() { 938 return array( 939 'username' => 'login', 940 'name' => 'name', 941 'email' => 'email', 942 'posts' => 'post_count', 943 ); 944 } 945 946 function display_rows() { 947 // Query the post counts for this page 948 $post_counts = count_many_users_posts( array_keys( $this->items ) ); 949 950 $style = ''; 951 foreach ( $this->items as $userid => $user_object ) { 952 $role = reset( $user_object->roles ); 953 954 if ( is_multisite() && empty( $role ) ) 955 continue; 956 957 $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"'; 958 echo "\n\t", $this->single_row( $user_object, $style, $role, $post_counts[ $userid ] ); 959 } 960 } 961 962 /** 963 * Generate HTML for a single row on the users.php admin panel. 964 * 965 * @since 2.1.0 966 * 967 * @param object $user_object 968 * @param string $style Optional. Attributes added to the TR element. Must be sanitized. 969 * @param string $role Key for the $wp_roles array. 970 * @param int $numposts Optional. Post count to display for this user. Defaults to zero, as in, a new user has made zero posts. 971 * @return string 972 */ 973 function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) { 974 global $wp_roles; 975 976 if ( !( is_object( $user_object ) && is_a( $user_object, 'WP_User' ) ) ) 977 $user_object = new WP_User( (int) $user_object ); 978 $user_object = sanitize_user_object( $user_object, 'display' ); 979 $email = $user_object->user_email; 980 $url = $user_object->user_url; 981 $short_url = str_replace( 'http://', '', $url ); 982 $short_url = str_replace( 'www.', '', $short_url ); 983 if ( '/' == substr( $short_url, -1 ) ) 984 $short_url = substr( $short_url, 0, -1 ); 985 if ( strlen( $short_url ) > 35 ) 986 $short_url = substr( $short_url, 0, 32 ).'...'; 987 $checkbox = ''; 988 // Check if the user for this row is editable 989 if ( current_user_can( 'list_users' ) ) { 990 // Set up the user editing link 991 // TODO: make profile/user-edit determination a separate function 992 if ( get_current_user_id() == $user_object->ID ) { 993 $edit_link = 'profile.php'; 994 } else { 995 $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( esc_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" ) ); 996 } 997 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />"; 998 999 // Set up the hover actions for this user 1000 $actions = array(); 1001 1002 if ( current_user_can( 'edit_user', $user_object->ID ) ) { 1003 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />"; 1004 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>'; 1005 } else { 1006 $edit = "<strong>$user_object->user_login</strong><br />"; 1007 } 1008 1009 if ( !is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) ) 1010 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=delete&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Delete' ) . "</a>"; 1011 if ( is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'remove_user', $user_object->ID ) ) 1012 $actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=remove&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . "</a>"; 1013 $actions = apply_filters( 'user_row_actions', $actions, $user_object ); 1014 $edit .= $this->row_actions( $actions ); 1015 1016 // Set up the checkbox ( because the user is editable, otherwise its empty ) 1017 $checkbox = "<input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='$role' value='{$user_object->ID}' />"; 1018 1019 } else { 1020 $edit = '<strong>' . $user_object->user_login . '</strong>'; 1021 } 1022 $role_name = isset( $wp_roles->role_names[$role] ) ? translate_user_role( $wp_roles->role_names[$role] ) : __( 'None' ); 1023 $r = "<tr id='user-$user_object->ID'$style>"; 1024 $avatar = get_avatar( $user_object->ID, 32 ); 1025 1026 list( $columns, $hidden ) = $this->get_column_info(); 1027 1028 foreach ( $columns as $column_name => $column_display_name ) { 1029 $class = "class=\"$column_name column-$column_name\""; 1030 1031 $style = ''; 1032 if ( in_array( $column_name, $hidden ) ) 1033 $style = ' style="display:none;"'; 1034 1035 $attributes = "$class$style"; 1036 1037 switch ( $column_name ) { 1038 case 'cb': 1039 $r .= "<th scope='row' class='check-column'>$checkbox</th>"; 1040 break; 1041 case 'username': 1042 $r .= "<td $attributes>$avatar $edit</td>"; 1043 break; 1044 case 'name': 1045 $r .= "<td $attributes>$user_object->first_name $user_object->last_name</td>"; 1046 break; 1047 case 'email': 1048 $r .= "<td $attributes><a href='mailto:$email' title='" . sprintf( __( 'E-mail: %s' ), $email ) . "'>$email</a></td>"; 1049 break; 1050 case 'role': 1051 $r .= "<td $attributes>$role_name</td>"; 1052 break; 1053 case 'posts': 1054 $attributes = 'class="posts column-posts num"' . $style; 1055 $r .= "<td $attributes>"; 1056 if ( $numposts > 0 ) { 1057 $r .= "<a href='edit.php?author=$user_object->ID' title='" . __( 'View posts by this author' ) . "' class='edit'>"; 1058 $r .= $numposts; 1059 $r .= '</a>'; 1060 } else { 1061 $r .= 0; 1062 } 1063 $r .= "</td>"; 1064 break; 1065 default: 1066 $r .= "<td $attributes>"; 1067 $r .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID ); 1068 $r .= "</td>"; 1069 } 1070 } 1071 $r .= '</tr>'; 1072 1073 return $r; 1074 } 1075 } 1076 1077 class WP_Comments_Table extends WP_List_Table { 1078 1079 var $checkbox = true; 1080 var $from_ajax = false; 1081 1082 var $pending_count = array(); 1083 1084 function WP_Comments_Table() { 1085 global $mode; 1086 1087 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'detail' : $_REQUEST['mode']; 1088 1089 if ( get_option('show_avatars') && 'single' != $mode ) 1090 add_filter( 'comment_author', 'floated_admin_avatar' ); 1091 1092 parent::WP_List_Table( array( 1093 'screen' => 'edit-comments', 1094 'plural' => 'comments' 1095 ) ); 1096 } 1097 1098 function check_permissions() { 1099 if ( !current_user_can('edit_posts') ) 1100 wp_die(__('Cheatin’ uh?')); 1101 } 1102 1103 function prepare_items() { 1104 global $post_id, $comment_status, $search; 1105 1106 if ( isset( $_REQUEST['p'] ) ) 1107 $post_id = absint( $_REQUEST['p'] ); 1108 elseif ( isset( $_REQUEST['post'] ) ) 1109 $post_id = absint( $_REQUEST['post'] ); 1110 elseif ( isset( $_REQUEST['post_ID'] ) ) 1111 $post_id = absint( $_REQUEST['post_ID'] ); 1112 else 1113 $post_id = 0; 1114 1115 $comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all'; 1116 if ( !in_array( $comment_status, array( 'all', 'moderated', 'approved', 'spam', 'trash' ) ) ) 1117 $comment_status = 'all'; 1118 1119 $comment_type = !empty( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : ''; 1120 1121 $search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : ''; 1122 1123 $user_id = ( isset( $_REQUEST['user_id'] ) ) ? $_REQUEST['user_id'] : ''; 1124 1125 $comments_per_page = $this->get_items_per_page( 'edit_comments_per_page' ); 1126 $comments_per_page = apply_filters( 'comments_per_page', $comments_per_page, $comment_status ); 1127 1128 if ( isset( $_POST['number'] ) ) 1129 $number = (int) $_POST['number']; 1130 else 1131 $number = $comments_per_page + min( 8, $comments_per_page ); // Grab a few extra 1132 1133 $page = $this->get_pagenum(); 1134 1135 $start = $offset = ( $page - 1 ) * $comments_per_page; 1136 1137 $status_map = array( 1138 'moderated' => 'hold', 1139 'approved' => 'approve' 1140 ); 1141 1142 $args = array( 1143 'status' => isset( $status_map[$comment_status] ) ? $status_map[$comment_status] : $comment_status, 1144 'search' => $search, 1145 'user_id' => $user_id, 1146 'offset' => $start, 1147 'number' => $number, 1148 'post_id' => $post_id, 1149 'type' => $comment_type, 1150 'orderby' => @$_REQUEST['orderby'], 1151 'order' => @$_REQUEST['order'], 1152 ); 1153 1154 $_comments = get_comments( $args ); 1155 1156 update_comment_cache( $_comments ); 1157 1158 $this->items = array_slice( $_comments, 0, $comments_per_page ); 1159 $this->extra_items = array_slice( $_comments, $comments_per_page ); 1160 1161 $total_comments = get_comments( array_merge( $args, array('count' => true, 'offset' => 0, 'number' => 0) ) ); 1162 1163 $_comment_post_ids = array(); 1164 foreach ( $_comments as $_c ) { 1165 $_comment_post_ids[] = $_c->comment_post_ID; 1166 } 1167 1168 $this->pending_count = get_pending_comments_num( $_comment_post_ids ); 1169 1170 $this->set_pagination_args( array( 1171 'total_items' => $total_comments, 1172 'per_page' => $comments_per_page, 1173 ) ); 1174 } 1175 1176 function get_views() { 1177 global $post_id, $comment_status; 1178 1179 $status_links = array(); 1180 $num_comments = ( $post_id ) ? wp_count_comments( $post_id ) : wp_count_comments(); 1181 //, number_format_i18n($num_comments->moderated) ), "<span class='comment-count'>" . number_format_i18n($num_comments->moderated) . "</span>"), 1182 //, number_format_i18n($num_comments->spam) ), "<span class='spam-comment-count'>" . number_format_i18n($num_comments->spam) . "</span>") 1183 $stati = array( 1184 'all' => _nx_noop('All', 'All', 'comments'), // singular not used 1185 'moderated' => _n_noop('Pending <span class="count">(<span class="pending-count">%s</span>)</span>', 'Pending <span class="count">(<span class="pending-count">%s</span>)</span>'), 1186 'approved' => _n_noop('Approved', 'Approved'), // singular not used 1187 'spam' => _n_noop('Spam <span class="count">(<span class="spam-count">%s</span>)</span>', 'Spam <span class="count">(<span class="spam-count">%s</span>)</span>'), 1188 'trash' => _n_noop('Trash <span class="count">(<span class="trash-count">%s</span>)</span>', 'Trash <span class="count">(<span class="trash-count">%s</span>)</span>') 1189 ); 1190 1191 if ( !EMPTY_TRASH_DAYS ) 1192 unset($stati['trash']); 1193 1194 $link = 'edit-comments.php'; 1195 if ( !empty($comment_type) && 'all' != $comment_type ) 1196 $link = add_query_arg( 'comment_type', $comment_type, $link ); 1197 1198 foreach ( $stati as $status => $label ) { 1199 $class = ( $status == $comment_status ) ? ' class="current"' : ''; 1200 1201 if ( !isset( $num_comments->$status ) ) 1202 $num_comments->$status = 10; 1203 $link = add_query_arg( 'comment_status', $status, $link ); 1204 if ( $post_id ) 1205 $link = add_query_arg( 'p', absint( $post_id ), $link ); 1206 /* 1207 // I toyed with this, but decided against it. Leaving it in here in case anyone thinks it is a good idea. ~ Mark 1208 if ( !empty( $_REQUEST['s'] ) ) 1209 $link = add_query_arg( 's', esc_attr( stripslashes( $_REQUEST['s'] ) ), $link ); 1210 */ 1211 $status_links[$status] = "<li class='$status'><a href='$link'$class>" . sprintf( 1212 _n( $label[0], $label[1], $num_comments->$status ), 1213 number_format_i18n( $num_comments->$status ) 1214 ) . '</a>'; 1215 } 1216 1217 $status_links = apply_filters( 'comment_status_links', $status_links ); 1218 return $status_links; 1219 } 1220 1221 function get_bulk_actions() { 1222 global $comment_status; 1223 1224 $actions = array(); 1225 if ( in_array( $comment_status, array( 'all', 'approved' ) ) ) 1226 $actions['unapprove'] = __( 'Unapprove' ); 1227 if ( in_array( $comment_status, array( 'all', 'moderated', 'spam' ) ) ) 1228 $actions['approve'] = __( 'Approve' ); 1229 if ( in_array( $comment_status, array( 'all', 'moderated', 'approved' ) ) ) 1230 $actions['spam'] = _x( 'Mark as Spam', 'comment' ); 1231 1232 if ( 'trash' == $comment_status ) 1233 $actions['untrash'] = __( 'Restore' ); 1234 elseif ( 'spam' == $comment_status ) 1235 $actions['unspam'] = _x( 'Not Spam', 'comment' ); 1236 1237 if ( in_array( $comment_status, array( 'trash', 'spam' ) ) || !EMPTY_TRASH_DAYS ) 1238 $actions['delete'] = __( 'Delete Permanently' ); 1239 else 1240 $actions['trash'] = __( 'Move to Trash' ); 1241 1242 return $actions; 1243 } 1244 1245 function extra_tablenav( $which ) { 1246 global $comment_status, $comment_type; 1247 ?> 1248 <div class="alignleft actions"> 1249 <?php 1250 if ( 'top' == $which ) { 1251 ?> 1252 <select name="comment_type"> 1253 <option value=""><?php _e( 'Show all comment types' ); ?></option> 1254 <?php 1255 $comment_types = apply_filters( 'admin_comment_types_dropdown', array( 1256 'comment' => __( 'Comments' ), 1257 'pings' => __( 'Pings' ), 1258 ) ); 1259 1260 foreach ( $comment_types as $type => $label ) 1261 echo "\t<option value='" . esc_attr( $type ) . "'" . selected( $comment_type, $type, false ) . ">$label</option>\n"; 1262 ?> 1263 </select> 1264 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" /> 1265 <?php 1266 } 1267 1268 if ( ( 'spam' == $comment_status || 'trash' == $comment_status ) && current_user_can( 'moderate_comments' ) ) { 1269 wp_nonce_field( 'bulk-destroy', '_destroy_nonce' ); 1270 $title = ( 'spam' == $comment_status ) ? esc_attr__( 'Empty Spam' ) : esc_attr__( 'Empty Trash' ); 1271 ?> 1272 <input type="submit" name="delete_all" id="delete_all" value="<?php echo $title ?>" class="button-secondary apply" /> 1273 <?php 1274 } 1275 ?> 1276 <?php 1277 do_action( 'manage_comments_nav', $comment_status ); 1278 echo '</div>'; 1279 } 1280 1281 function current_action() { 1282 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) ) 1283 return 'delete_all'; 1284 1285 return parent::current_action(); 1286 } 1287 1288 function get_columns() { 1289 global $mode; 1290 1291 $columns = array(); 1292 1293 if ( $this->checkbox ) 1294 $columns['cb'] = '<input type="checkbox" />'; 1295 1296 $columns['author'] = __( 'Author' ); 1297 $columns['comment'] = _x( 'Comment', 'column name' ); 1298 1299 if ( 'single' !== $mode ) 1300 $columns['response'] = _x( 'Comment', 'column name' ); 1301 1302 return $columns; 1303 } 1304 1305 function get_sortable_columns() { 1306 return array( 1307 'author' => 'comment_author', 1308 'comment' => 'comment_content', 1309 'response' => 'comment_post_ID' 1310 ); 1311 } 1312 1313 function display_table() { 1314 extract( $this->_args ); 1315 1316 $this->display_tablenav( 'top' ); 1317 1318 ?> 1319 <table class="<?php echo implode( ' ', $this->get_table_classes() ); ?>" cellspacing="0"> 1320 <thead> 1321 <tr> 1322 <?php $this->print_column_headers(); ?> 1323 </tr> 1324 </thead> 1325 1326 <tfoot> 1327 <tr> 1328 <?php $this->print_column_headers( false ); ?> 1329 </tr> 1330 </tfoot> 1331 1332 <tbody id="the-comment-list" class="list:comment"> 1333 <?php $this->display_rows(); ?> 1334 </tbody> 1335 1336 <tbody id="the-extra-comment-list" class="list:comment" style="display: none;"> 1337 <?php $this->items = $this->extra_items; $this->display_rows(); ?> 1338 </tbody> 1339 </table> 1340 <?php 1341 1342 $this->display_tablenav( 'bottom' ); 1343 } 1344 1345 function single_row( $a_comment ) { 1346 global $post, $comment, $the_comment_status; 1347 1348 $comment = $a_comment; 1349 $the_comment_status = wp_get_comment_status( $comment->comment_ID ); 1350 1351 $post = get_post( $comment->comment_post_ID ); 1352 1353 $this->user_can = current_user_can( 'edit_comment', $comment->comment_ID ); 1354 1355 echo "<tr id='comment-$comment->comment_ID' class='$the_comment_status'>"; 1356 echo $this->single_row_columns( $comment ); 1357 echo "</tr>\n"; 1358 } 1359 1360 function column_cb( $comment ) { 1361 if ( $this->user_can ) 1362 echo "<input type='checkbox' name='delete_comments[]' value='$comment->comment_ID' />"; 1363 } 1364 1365 function column_comment( $comment ) { 1366 global $post, $comment_status, $the_comment_status; 1367 1368 $user_can = $this->user_can; 1369 1370 $comment_url = esc_url( get_comment_link( $comment->comment_ID ) ); 1371 1372 $ptime = date( 'G', strtotime( $comment->comment_date ) ); 1373 if ( ( abs( time() - $ptime ) ) < 86400 ) 1374 $ptime = sprintf( __( '%s ago' ), human_time_diff( $ptime ) ); 1375 else 1376 $ptime = mysql2date( __( 'Y/m/d \a\t g:i A' ), $comment->comment_date ); 1377 1378 if ( $user_can ) { 1379 $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) ); 1380 $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) ); 1381 1382 $url = "comment.php?c=$comment->comment_ID"; 1383 1384 $approve_url = esc_url( $url . "&action=approvecomment&$approve_nonce" ); 1385 $unapprove_url = esc_url( $url . "&action=unapprovecomment&$approve_nonce" ); 1386 $spam_url = esc_url( $url . "&action=spamcomment&$del_nonce" ); 1387 $unspam_url = esc_url( $url . "&action=unspamcomment&$del_nonce" ); 1388 $trash_url = esc_url( $url . "&action=trashcomment&$del_nonce" ); 1389 $untrash_url = esc_url( $url . "&action=untrashcomment&$del_nonce" ); 1390 $delete_url = esc_url( $url . "&action=deletecomment&$del_nonce" ); 1391 } 1392 1393 echo '<div id="submitted-on">'; 1394 /* translators: 2: comment date, 3: comment time */ 1395 printf( __( '<a href="%1$s">%2$s at %3$s</a>' ), $comment_url, 1396 /* translators: comment date format. See http://php.net/date */ get_comment_date( __( 'Y/m/d' ) ), 1397 /* translators: comment time format. See http://php.net/date */ get_comment_date( get_option( 'time_format' ) ) ); 1398 1399 if ( $comment->comment_parent ) { 1400 $parent = get_comment( $comment->comment_parent ); 1401 $parent_link = esc_url( get_comment_link( $comment->comment_parent ) ); 1402 $name = get_comment_author( $parent->comment_ID ); 1403 printf( ' | '.__( 'In reply to <a href="%1$s">%2$s</a>.' ), $parent_link, $name ); 1404 } 1405 1406 echo '</div>'; 1407 comment_text(); 1408 if ( $user_can ) { ?> 1409 <div id="inline-<?php echo $comment->comment_ID; ?>" class="hidden"> 1410 <textarea class="comment" rows="1" cols="1"><?php echo esc_html( apply_filters( 'comment_edit_pre', $comment->comment_content ) ); ?></textarea> 1411 <div class="author-email"><?php echo esc_attr( $comment->comment_author_email ); ?></div> 1412 <div class="author"><?php echo esc_attr( $comment->comment_author ); ?></div> 1413 <div class="author-url"><?php echo esc_attr( $comment->comment_author_url ); ?></div> 1414 <div class="comment_status"><?php echo $comment->comment_approved; ?></div> 1415 </div> 1416 <?php 1417 } 1418 1419 if ( $user_can ) { 1420 // preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash 1421 $actions = array( 1422 'approve' => '', 'unapprove' => '', 1423 'reply' => '', 1424 'quickedit' => '', 1425 'edit' => '', 1426 'spam' => '', 'unspam' => '', 1427 'trash' => '', 'untrash' => '', 'delete' => '' 1428 ); 1429 1430 if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments 1431 if ( 'approved' == $the_comment_status ) 1432 $actions['unapprove'] = "<a href='$unapprove_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=unapproved vim-u vim-destructive' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>'; 1433 else if ( 'unapproved' == $the_comment_status ) 1434 $actions['approve'] = "<a href='$approve_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=approved vim-a vim-destructive' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>'; 1435 } else { 1436 $actions['approve'] = "<a href='$approve_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved vim-a' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>'; 1437 $actions['unapprove'] = "<a href='$unapprove_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved vim-u' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>'; 1438 } 1439 1440 if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) { 1441 $actions['spam'] = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1 vim-s vim-destructive' title='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>'; 1442 } elseif ( 'spam' == $the_comment_status ) { 1443 $actions['unspam'] = "<a href='$unspam_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:unspam=1 vim-z vim-destructive'>" . _x( 'Not Spam', 'comment' ) . '</a>'; 1444 } elseif ( 'trash' == $the_comment_status ) { 1445 $actions['untrash'] = "<a href='$untrash_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:untrash=1 vim-z vim-destructive'>" . __( 'Restore' ) . '</a>'; 1446 } 1447 1448 if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) { 1449 $actions['delete'] = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID::delete=1 delete vim-d vim-destructive'>" . __( 'Delete Permanently' ) . '</a>'; 1450 } else { 1451 $actions['trash'] = "<a href='$trash_url' class='delete:the-comment-list:comment-$comment->comment_ID::trash=1 delete vim-d vim-destructive' title='" . esc_attr__( 'Move this comment to the trash' ) . "'>" . _x( 'Trash', 'verb' ) . '</a>'; 1452 } 1453 1454 if ( 'trash' != $the_comment_status ) { 1455 $actions['edit'] = "<a href='comment.php?action=editcomment&c={$comment->comment_ID}' title='" . esc_attr__( 'Edit comment' ) . "'>". __( 'Edit' ) . '</a>'; 1456 $actions['quickedit'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\',\'edit\' );return false;" class="vim-q" title="'.esc_attr__( 'Quick Edit' ).'" href="#">' . __( 'Quick Edit' ) . '</a>'; 1457 if ( 'spam' != $the_comment_status ) 1458 $actions['reply'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\' );return false;" class="vim-r" title="'.esc_attr__( 'Reply to this comment' ).'" href="#">' . __( 'Reply' ) . '</a>'; 1459 } 1460 1461 $actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment ); 1462 1463 $i = 0; 1464 echo '<div class="row-actions">'; 1465 foreach ( $actions as $action => $link ) { 1466 ++$i; 1467 ( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | '; 1468 1469 // Reply and quickedit need a hide-if-no-js span when not added with ajax 1470 if ( ( 'reply' == $action || 'quickedit' == $action ) && ! $this->from_ajax ) 1471 $action .= ' hide-if-no-js'; 1472 elseif ( ( $action == 'untrash' && $the_comment_status == 'trash' ) || ( $action == 'unspam' && $the_comment_status == 'spam' ) ) { 1473 if ( '1' == get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) ) 1474 $action .= ' approve'; 1475 else 1476 $action .= ' unapprove'; 1477 } 1478 1479 echo "<span class='$action'>$sep$link</span>"; 1480 } 1481 echo '</div>'; 1482 } 1483 } 1484 1485 function column_author( $comment ) { 1486 global $comment_status; 1487 1488 $author_url = get_comment_author_url(); 1489 if ( 'http://' == $author_url ) 1490 $author_url = ''; 1491 $author_url_display = preg_replace( '|http://(www\.)?|i', '', $author_url ); 1492 if ( strlen( $author_url_display ) > 50 ) 1493 $author_url_display = substr( $author_url_display, 0, 49 ) . '...'; 1494 1495 echo "<strong>"; comment_author(); echo '</strong><br />'; 1496 if ( !empty( $author_url ) ) 1497 echo "<a title='$author_url' href='$author_url'>$author_url_display</a><br />"; 1498 1499 if ( $this->user_can ) { 1500 if ( !empty( $comment->comment_author_email ) ) { 1501 comment_author_email_link(); 1502 echo '<br />'; 1503 } 1504 echo '<a href="edit-comments.php?s='; 1505 comment_author_IP(); 1506 echo '&mode=detail'; 1507 if ( 'spam' == $comment_status ) 1508 echo '&comment_status=spam'; 1509 echo '">'; 1510 comment_author_IP(); 1511 echo '</a>'; 1512 } 1513 } 1514 1515 function column_date( $comment ) { 1516 return get_comment_date( __( 'Y/m/d \a\t g:ia' ) ); 1517 } 1518 1519 function column_response( $comment ) { 1520 global $post; 1521 1522 if ( isset( $this->pending_count[$post->ID] ) ) { 1523 $pending_comments = $this->pending_count[$post->ID]; 1524 } else { 1525 $_pending_count_temp = get_pending_comments_num( array( $post->ID ) ); 1526 $pending_comments = $this->pending_count[$post->ID] = $_pending_count_temp[$post->ID]; 1527 } 1528 1529 if ( current_user_can( 'edit_post', $post->ID ) ) { 1530 $post_link = "<a href='" . get_edit_post_link( $post->ID ) . "'>"; 1531 $post_link .= get_the_title( $post->ID ) . '</a>'; 1532 } else { 1533 $post_link = get_the_title( $post->ID ); 1534 } 1535 1536 echo '<div class="response-links"><span class="post-com-count-wrapper">'; 1537 echo $post_link . '<br />'; 1538 $this->comments_bubble( $post->ID, $pending_comments ); 1539 echo '</span> '; 1540 echo "<a href='" . get_permalink( $post->ID ) . "'>#</a>"; 1541 echo '</div>'; 1542 if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) ) 1543 echo $thumb; 1544 } 1545 1546 function column_default( $comment, $column_name ) { 1547 do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID ); 1548 } 1549 } 1550 1551 class WP_Post_Comments_Table extends WP_Comments_Table { 1552 1553 function get_columns() { 1554 return array( 1555 'author' => __( 'Author' ), 1556 'comment' => _x( 'Comment', 'column name' ), 1557 ); 1558 } 1559 1560 function get_sortable_columns() { 1561 return array(); 1562 } 1563 } 1564 1565 class WP_Links_Table extends WP_List_Table { 1566 1567 function WP_Links_Table() { 1568 parent::WP_List_Table( array( 1569 'screen' => 'link-manager', 1570 'plural' => 'bookmarks', 1571 ) ); 1572 } 1573 1574 function check_permissions() { 1575 if ( ! current_user_can( 'manage_links' ) ) 1576 wp_die( __( 'You do not have sufficient permissions to edit the links for this site.' ) ); 1577 } 1578 1579 function prepare_items() { 1580 global $cat_id, $s, $orderby, $order; 1581 1582 wp_reset_vars( array( 'action', 'cat_id', 'linkurl', 'name', 'image', 'description', 'visible', 'target', 'category', 'link_id', 'submit', 'orderby', 'order', 'links_show_cat_id', 'rating', 'rel', 'notes', 'linkcheck[]', 's' ) ); 1583 1584 $args = array( 'hide_invisible' => 0, 'hide_empty' => 0 ); 1585 1586 if ( 'all' != $cat_id ) 1587 $args['category'] = $cat_id; 1588 if ( !empty( $s ) ) 1589 $args['search'] = $s; 1590 if ( !empty( $orderby ) ) 1591 $args['orderby'] = $orderby; 1592 if ( !empty( $order ) ) 1593 $args['order'] = $order; 1594 1595 $this->items = get_bookmarks( $args ); 1596 } 1597 1598 function no_items() { 1599 _e( 'No links found.' ); 1600 } 1601 1602 function get_bulk_actions() { 1603 $actions = array(); 1604 $actions['delete'] = __( 'Delete' ); 1605 1606 return $actions; 1607 } 1608 1609 function extra_tablenav( $which ) { 1610 global $cat_id; 1611 1612 if ( 'top' != $which ) 1613 return; 1614 ?> 1615 <div class="alignleft actions"> 1616 <?php 1617 $dropdown_options = array( 1618 'selected' => $cat_id, 1619 'name' => 'cat_id', 1620 'taxonomy' => 'link_category', 1621 'show_option_all' => __( 'View all categories' ), 1622 'hide_empty' => true, 1623 'hierarchical' => 1, 1624 'show_count' => 0, 1625 'orderby' => 'name', 1626 ); 1627 wp_dropdown_categories( $dropdown_options ); 1628 ?> 1629 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" /> 1630 </div> 1631 <?php 1632 } 1633 1634 function get_columns() { 1635 return array( 1636 'cb' => '<input type="checkbox" />', 1637 'name' => __( 'Name' ), 1638 'url' => __( 'URL' ), 1639 'categories' => __( 'Categories' ), 1640 'rel' => __( 'Relationship' ), 1641 'visible' => __( 'Visible' ), 1642 'rating' => __( 'Rating' ) 1643 ); 1644 } 1645 1646 function get_sortable_columns() { 1647 return array( 1648 'name' => 'name', 1649 'url' => 'url', 1650 'visible' => 'visible', 1651 'rating' => 'rating' 1652 ); 1653 } 1654 1655 function display_rows() { 1656 global $cat_id; 1657 1658 $alt = 0; 1659 1660 foreach ( $this->items as $link ) { 1661 $link = sanitize_bookmark( $link ); 1662 $link->link_name = esc_attr( $link->link_name ); 1663 $link->link_category = wp_get_link_cats( $link->link_id ); 1664 1665 $short_url = str_replace( 'http://', '', $link->link_url ); 1666 $short_url = preg_replace( '/^www\./i', '', $short_url ); 1667 if ( '/' == substr( $short_url, -1 ) ) 1668 $short_url = substr( $short_url, 0, -1 ); 1669 if ( strlen( $short_url ) > 35 ) 1670 $short_url = substr( $short_url, 0, 32 ).'...'; 1671 1672 $visible = ( $link->link_visible == 'Y' ) ? __( 'Yes' ) : __( 'No' ); 1673 $rating = $link->link_rating; 1674 $style = ( $alt++ % 2 ) ? '' : ' class="alternate"'; 1675 1676 $edit_link = get_edit_bookmark_link( $link ); 1677 ?> 1678 <tr id="link-<?php echo $link->link_id; ?>" valign="middle" <?php echo $style; ?>> 1679 <?php 1680 1681 list( $columns, $hidden ) = $this->get_column_info(); 1682 1683 foreach ( $columns as $column_name => $column_display_name ) { 1684 $class = "class='column-$column_name'"; 1685 1686 $style = ''; 1687 if ( in_array( $column_name, $hidden ) ) 1688 $style = ' style="display:none;"'; 1689 1690 $attributes = $class . $style; 1691 1692 switch ( $column_name ) { 1693 case 'cb': 1694 echo '<th scope="row" class="check-column"><input type="checkbox" name="linkcheck[]" value="'. esc_attr( $link->link_id ) .'" /></th>'; 1695 break; 1696 1697 case 'name': 1698 echo "<td $attributes><strong><a class='row-title' href='$edit_link' title='" . esc_attr( sprintf( __( 'Edit “%s”' ), $link->link_name ) ) . "'>$link->link_name</a></strong><br />"; 1699 1700 $actions = array(); 1701 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>'; 1702 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "link.php?action=delete&link_id=$link->link_id", 'delete-bookmark_' . $link->link_id ) . "' onclick=\"if ( confirm( '" . esc_js( sprintf( __( "You are about to delete this link '%s'\n 'Cancel' to stop, 'OK' to delete." ), $link->link_name ) ) . "' ) ) { return true;}return false;\">" . __( 'Delete' ) . "</a>"; 1703 echo $this->row_actions( $actions ); 1704 1705 echo '</td>'; 1706 break; 1707 case 'url': 1708 echo "<td $attributes><a href='$link->link_url' title='".sprintf( __( 'Visit %s' ), $link->link_name )."'>$short_url</a></td>"; 1709 break; 1710 case 'categories': 1711 ?><td <?php echo $attributes ?>><?php 1712 $cat_names = array(); 1713 foreach ( $link->link_category as $category ) { 1714 $cat = get_term( $category, 'link_category', OBJECT, 'display' ); 1715 if ( is_wp_error( $cat ) ) 1716 echo $cat->get_error_message(); 1717 $cat_name = $cat->name; 1718 if ( $cat_id != $category ) 1719 $cat_name = "<a href='link-manager.php?cat_id=$category'>$cat_name</a>"; 1720 $cat_names[] = $cat_name; 1721 } 1722 echo implode( ', ', $cat_names ); 1723 ?></td><?php 1724 break; 1725 case 'rel': 1726 ?><td <?php echo $attributes ?>><?php echo empty( $link->link_rel ) ? '<br />' : $link->link_rel; ?></td><?php 1727 break; 1728 case 'visible': 1729 ?><td <?php echo $attributes ?>><?php echo $visible; ?></td><?php 1730 break; 1731 case 'rating': 1732 ?><td <?php echo $attributes ?>><?php echo $rating; ?></td><?php 1733 break; 1734 default: 1735 ?> 1736 <td <?php echo $attributes ?>><?php do_action( 'manage_link_custom_column', $column_name, $link->link_id ); ?></td> 1737 <?php 1738 break; 1739 } 1740 } 1741 ?> 1742 </tr> 1743 <?php 1744 } 1745 } 1746 } 1747 1748 class WP_Sites_Table extends WP_List_Table { 1749 1750 function WP_Sites_Table() { 1751 parent::WP_List_Table( array( 1752 'screen' => 'sites-network', 1753 'plural' => 'sites', 1754 ) ); 1755 } 1756 1757 function check_permissions() { 1758 if ( ! current_user_can( 'manage_sites' ) ) 1759 wp_die( __( 'You do not have permission to access this page.' ) ); 1760 } 1761 1762 function prepare_items() { 1763 global $s, $mode, $wpdb; 1764 1765 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'list' : $_REQUEST['mode']; 1766 1767 $per_page = $this->get_items_per_page( 'sites_network_per_page' ); 1768 1769 $pagenum = $this->get_pagenum(); 1770 1771 $s = isset( $_REQUEST['s'] ) ? stripslashes( trim( $_REQUEST[ 's' ] ) ) : ''; 1772 $like_s = esc_sql( like_escape( $s ) ); 1773 1774 $query = "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' "; 1775 1776 if ( isset( $_REQUEST['searchaction'] ) ) { 1777 if ( 'name' == $_REQUEST['searchaction'] ) { 1778 $query .= " AND ( {$wpdb->blogs}.domain LIKE '%{$like_s}%' OR {$wpdb->blogs}.path LIKE '%{$like_s}%' ) "; 1779 } elseif ( 'id' == $_REQUEST['searchaction'] ) { 1780 $query .= " AND {$wpdb->blogs}.blog_id = '{$like_s}' "; 1781 } elseif ( 'ip' == $_REQUEST['searchaction'] ) { 1782 $query = "SELECT * 1783 FROM {$wpdb->blogs}, {$wpdb->registration_log} 1784 WHERE site_id = '{$wpdb->siteid}' 1785 AND {$wpdb->blogs}.blog_id = {$wpdb->registration_log}.blog_id 1786 AND {$wpdb->registration_log}.IP LIKE ( '%{$like_s}%' )"; 1787 } 1788 } 1789 1790 $order_by = isset( $_REQUEST['orderby'] ) ? $_REQUEST['orderby'] : 'id'; 1791 if ( $order_by == 'registered' ) { 1792 $query .= ' ORDER BY registered '; 1793 } elseif ( $order_by == 'lastupdated' ) { 1794 $query .= ' ORDER BY last_updated '; 1795 } elseif ( $order_by == 'blogname' ) { 1796 $query .= ' ORDER BY domain '; 1797 } else { 1798 $order_by = 'id'; 1799 $query .= " ORDER BY {$wpdb->blogs}.blog_id "; 1800 } 1801 1802 $order = ( isset( $_REQUEST['order'] ) && 'DESC' == strtoupper( $_REQUEST['order'] ) ) ? "DESC" : "ASC"; 1803 $query .= $order; 1804 1805 $total = $wpdb->get_var( str_replace( 'SELECT *', 'SELECT COUNT( blog_id )', $query ) ); 1806 1807 $query .= " LIMIT " . intval( ( $pagenum - 1 ) * $per_page ) . ", " . intval( $per_page ); 1808 $this->items = $wpdb->get_results( $query, ARRAY_A ); 1809 1810 $this->set_pagination_args( array( 1811 'total_items' => $total, 1812 'per_page' => $per_page, 1813 ) ); 1814 } 1815 1816 function no_items() { 1817 _e( 'No sites found.' ); 1818 } 1819 1820 function get_bulk_actions() { 1821 $actions = array(); 1822 $actions['delete'] = __( 'Delete' ); 1823 $actions['spam'] = _x( 'Mark as Spam', 'site' ); 1824 $actions['notspam'] = _x( 'Not Spam', 'site' ); 1825 1826 return $actions; 1827 } 1828 1829 function pagination( $which ) { 1830 global $mode; 1831 1832 parent::pagination( $which ); 1833 1834 if ( 'top' == $which ) 1835 $this->view_switcher( $mode ); 1836 } 1837 1838 function get_columns() { 1839 $blogname_columns = ( is_subdomain_install() ) ? __( 'Domain' ) : __( 'Path' ); 1840 $sites_columns = array( 1841 'cb' => '<input type="checkbox" />', 1842 'blogname' => $blogname_columns, 1843 'lastupdated' => __( 'Last Updated' ), 1844 'registered' => _x( 'Registered', 'site' ), 1845 'users' => __( 'Users' ) 1846 ); 1847 1848 if ( has_filter( 'wpmublogsaction' ) ) 1849 $sites_columns['plugins'] = __( 'Actions' ); 1850 1851 $sites_columns = apply_filters( 'wpmu_blogs_columns', $sites_columns ); 1852 1853 return $sites_columns; 1854 } 1855 1856 function get_sortable_columns() { 1857 return array( 1858 'id' => 'id', 1859 'blogname' => 'blogname', 1860 'lastupdated' => 'lastupdated', 1861 'registered' => 'registered', 1862 ); 1863 } 1864 1865 function display_rows() { 1866 global $current_site, $mode; 1867 1868 $status_list = array( 1869 'archived' => array( 'site-archived', __( 'Archived' ) ), 1870 'spam' => array( 'site-spammed', _x( 'Spam', 'site' ) ), 1871 'deleted' => array( 'site-deleted', __( 'Deleted' ) ), 1872 'mature' => array( 'site-mature', __( 'Mature' ) ) 1873 ); 1874 1875 $class = ''; 1876 foreach ( $this->items as $blog ) { 1877 $class = ( 'alternate' == $class ) ? '' : 'alternate'; 1878 reset( $status_list ); 1879 1880 $blog_states = array(); 1881 foreach ( $status_list as $status => $col ) { 1882 if ( get_blog_status( $blog['blog_id'], $status ) == 1 ) { 1883 $class = $col[0]; 1884 $blog_states[] = $col[1]; 1885 } 1886 } 1887 $blog_state = ''; 1888 if ( ! empty( $blog_states ) ) { 1889 $state_count = count( $blog_states ); 1890 $i = 0; 1891 $blog_state .= ' - '; 1892 foreach ( $blog_states as $state ) { 1893 ++$i; 1894 ( $i == $state_count ) ? $sep = '' : $sep = ', '; 1895 $blog_state .= "<span class='post-state'>$state$sep</span>"; 1896 } 1897 } 1898 echo "<tr class='$class'>"; 1899 1900 $blogname = ( is_subdomain_install() ) ? str_replace( '.'.$current_site->domain, '', $blog['domain'] ) : $blog['path']; 1901 1902 list( $columns, $hidden ) = $this->get_column_info(); 1903 1904 foreach ( $columns as $column_name => $column_display_name ) { 1905 switch ( $column_name ) { 1906 case 'cb': ?> 1907 <th scope="row" class="check-column"> 1908 <input type="checkbox" id="blog_<?php echo $blog['blog_id'] ?>" name="allblogs[]" value="<?php echo esc_attr( $blog['blog_id'] ) ?>" /> 1909 </th> 1910 <?php 1911 break; 1912 1913 case 'id': ?> 1914 <th valign="top" scope="row"> 1915 <?php echo $blog['blog_id'] ?> 1916 </th> 1917 <?php 1918 break; 1919 1920 case 'blogname': ?> 1921 <td class="column-title"> 1922 <a href="<?php echo esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ); ?>" class="edit"><?php echo $blogname . $blog_state; ?></a> 1923 <?php 1924 if ( 'list' != $mode ) 1925 echo '<p>' . sprintf( _x( '%1$s – <em>%2$s</em>', '%1$s: site name. %2$s: site tagline.' ), get_blog_option( $blog['blog_id'], 'blogname' ), get_blog_option( $blog['blog_id'], 'blogdescription ' ) ) . '</p>'; 1926 1927 // Preordered. 1928 $actions = array( 1929 'edit' => '', 'backend' => '', 1930 'activate' => '', 'deactivate' => '', 1931 'archive' => '', 'unarchive' => '', 1932 'spam' => '', 'unspam' => '', 1933 'delete' => '', 1934 'visit' => '', 1935 ); 1936 1937 $actions['edit'] = '<span class="edit"><a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ) . '">' . __( 'Edit' ) . '</a></span>'; 1938 $actions['backend'] = "<span class='backend'><a href='" . esc_url( get_admin_url( $blog['blog_id'] ) ) . "' class='edit'>" . __( 'Dashboard' ) . '</a></span>'; 1939 if ( $current_site->blog_id != $blog['blog_id'] ) { 1940 if ( get_blog_status( $blog['blog_id'], 'deleted' ) == '1' ) 1941 $actions['activate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=activateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to activate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Activate' ) . '</a></span>'; 1942 else 1943 $actions['deactivate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deactivateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to deactivate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Deactivate' ) . '</a></span>'; 1944 1945 if ( get_blog_status( $blog['blog_id'], 'archived' ) == '1' ) 1946 $actions['unarchive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unarchiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unarchive the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Unarchive' ) . '</a></span>'; 1947 else 1948 $actions['archive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=archiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to archive the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Archive', 'verb; site' ) . '</a></span>'; 1949 1950 if ( get_blog_status( $blog['blog_id'], 'spam' ) == '1' ) 1951 $actions['unspam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unspamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unspam the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Not Spam', 'site' ) . '</a></span>'; 1952 else 1953 $actions['spam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=spamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to mark the site %s as spam.' ), $blogname ) ) ) ) . '">' . _x( 'Spam', 'site' ) . '</a></span>'; 1954 1955 $actions['delete'] = '<span class="delete"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deleteblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to delete the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Delete' ) . '</a></span>'; 1956 } 1957 1958 $actions['visit'] = "<span class='view'><a href='" . esc_url( get_home_url( $blog['blog_id'] ) ) . "' rel='permalink'>" . __( 'Visit' ) . '</a></span>'; 1959 $actions = array_filter( $actions ); 1960 echo $this->row_actions( $actions ); 1961 ?> 1962 </td> 1963 <?php 1964 break; 1965 1966 case 'lastupdated': ?> 1967 <td valign="top"> 1968 <?php 1969 if ( 'list' == $mode ) 1970 $date = 'Y/m/d'; 1971 else 1972 $date = 'Y/m/d \<\b\r \/\> g:i:s a'; 1973 echo ( $blog['last_updated'] == '0000-00-00 00:00:00' ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] ); ?> 1974 </td> 1975 <?php 1976 break; 1977 case 'registered': ?> 1978 <td valign="top"> 1979 <?php 1980 if ( $blog['registered'] == '0000-00-00 00:00:00' ) 1981 echo '—'; 1982 else 1983 echo mysql2date( $date, $blog['registered'] ); 1984 ?> 1985 </td> 1986 <?php 1987 break; 1988 case 'users': ?> 1989 <td valign="top"> 1990 <?php 1991 $blogusers = get_users( array( 'blog_id' => $blog['blog_id'], 'number' => 6) ); 1992 if ( is_array( $blogusers ) ) { 1993 $blogusers_warning = ''; 1994 if ( count( $blogusers ) > 5 ) { 1995 $blogusers = array_slice( $blogusers, 0, 5 ); 1996 $blogusers_warning = __( 'Only showing first 5 users.' ) . ' <a href="' . esc_url( get_admin_url( $blog['blog_id'], 'users.php' ) ) . '">' . __( 'More' ) . '</a>'; 1997 } 1998 foreach ( $blogusers as $user_object ) { 1999 echo '<a href="' . esc_url( admin_url( 'user-edit.php?user_id=' . $user_object->ID ) ) . '">' . esc_html( $user_object->user_login ) . '</a> '; 2000 if ( 'list' != $mode ) 2001 echo '( ' . $user_object->user_email . ' )'; 2002 echo '<br />'; 2003 } 2004 if ( $blogusers_warning != '' ) 2005 echo '<strong>' . $blogusers_warning . '</strong><br />'; 2006 } 2007 ?> 2008 </td> 2009 <?php 2010 break; 2011 2012 case 'plugins': ?> 2013 <?php if ( has_filter( 'wpmublogsaction' ) ) { ?> 2014 <td valign="top"> 2015 <?php do_action( 'wpmublogsaction', $blog['blog_id'] ); ?> 2016 </td> 2017 <?php } ?> 2018 <?php break; 2019 2020 default: ?> 2021 <?php if ( has_filter( 'manage_blogs_custom_column' ) ) { ?> 2022 <td valign="top"> 2023 <?php do_action( 'manage_blogs_custom_column', $column_name, $blog['blog_id'] ); ?> 2024 </td> 2025 <?php } ?> 2026 <?php break; 2027 } 2028 } 2029 ?> 2030 </tr> 2031 <?php 2032 } 2033 } 2034 } 2035 2036 class WP_MS_Users_Table extends WP_List_Table { 2037 2038 function WP_MS_Users_Table() { 2039 parent::WP_List_Table( array( 2040 'screen' => 'users-network', 2041 ) ); 2042 } 2043 2044 function check_permissions() { 2045 if ( !is_multisite() ) 2046 wp_die( __( 'Multisite support is not enabled.' ) ); 2047 2048 if ( ! current_user_can( 'manage_network_users' ) ) 2049 wp_die( __( 'You do not have permission to access this page.' ) ); 2050 } 2051 2052 function prepare_items() { 2053 global $usersearch; 2054 2055 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : ''; 2056 2057 $users_per_page = $this->get_items_per_page( 'users_network_per_page' ); 2058 2059 $paged = $this->get_pagenum(); 2060 2061 $args = array( 2062 'number' => $users_per_page, 2063 'offset' => ( $paged-1 ) * $users_per_page, 2064 'search' => $usersearch, 2065 'blog_id' => 0 2066 ); 2067 2068 if ( isset( $_REQUEST['orderby'] ) ) 2069 $args['orderby'] = $_REQUEST['orderby']; 2070 2071 if ( isset( $_REQUEST['order'] ) ) 2072 $args['order'] = $_REQUEST['order']; 2073 2074 // Query the user IDs for this page 2075 $wp_user_search = new WP_User_Query( $args ); 2076 2077 $this->items = $wp_user_search->get_results(); 2078 2079 $this->set_pagination_args( array( 2080 'total_items' => $wp_user_search->get_total(), 2081 'per_page' => $users_per_page, 2082 ) ); 2083 } 2084 2085 function get_bulk_actions() { 2086 $actions = array(); 2087 $actions['delete'] = __( 'Delete' ); 2088 $actions['spam'] = _x( 'Mark as Spam', 'user' ); 2089 $actions['notspam'] = _x( 'Not Spam', 'user' ); 2090 2091 return $actions; 2092 } 2093 2094 function no_items() { 2095 _e( 'No users found.' ); 2096 } 2097 2098 function pagination( $which ) { 2099 global $mode; 2100 2101 parent::pagination ( $which ); 2102 2103 if ( 'top' == $which ) 2104 $this->view_switcher( $mode ); 2105 } 2106 2107 function get_columns() { 2108 $users_columns = array( 2109 'cb' => '<input type="checkbox" />', 2110 'login' => __( 'Login' ), 2111 'name' => __( 'Name' ), 2112 'email' => __( 'E-mail' ), 2113 'registered' => _x( 'Registered', 'user' ), 2114 'blogs' => __( 'Sites' ) 2115 ); 2116 $users_columns = apply_filters( 'wpmu_users_columns', $users_columns ); 2117 2118 return $users_columns; 2119 } 2120 2121 function get_sortable_columns() { 2122 return array( 2123 'id' => 'id', 2124 'login' => 'login', 2125 'name' => 'name', 2126 'email' => 'email', 2127 'registered' => 'registered', 2128 ); 2129 } 2130 2131 function display_rows() { 2132 global $current_site, $mode; 2133 2134 $class = ''; 2135 $super_admins = get_super_admins(); 2136 foreach ( $this->items as $user ) { 2137 $class = ( 'alternate' == $class ) ? '' : 'alternate'; 2138 2139 $status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' ); 2140 2141 foreach ( $status_list as $status => $col ) { 2142 if ( $user->$status ) 2143 $class = $col; 2144 } 2145 2146 ?> 2147 <tr class="<?php echo $class; ?>"> 2148 <?php 2149 2150 list( $columns, $hidden ) = $this->get_column_info(); 2151 2152 foreach ( $columns as $column_name => $column_display_name ) : 2153 switch ( $column_name ) { 2154 case 'cb': ?> 2155 <th scope="row" class="check-column"> 2156 <input type="checkbox" id="blog_<?php echo $user->ID ?>" name="allusers[]" value="<?php echo esc_attr( $user->ID ) ?>" /> 2157 </th> 2158 <?php 2159 break; 2160 2161 case 'id': ?> 2162 <th valign="top" scope="row"> 2163 <?php echo $user->ID ?> 2164 </th> 2165 <?php 2166 break; 2167 2168 case 'login': 2169 $avatar = get_avatar( $user->user_email, 32 ); 2170 $edit_link = ( get_current_user_id() == $user->ID ) ? 'profile.php' : 'user-edit.php?user_id=' . $user->ID; 2171 ?> 2172 <td class="username column-username"> 2173 <?php echo $avatar; ?><strong><a href="<?php echo esc_url( self_admin_url( $edit_link ) ); ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a><?php 2174 if ( in_array( $user->user_login, $super_admins ) ) 2175 echo ' - ' . __( 'Super admin' ); 2176 ?></strong> 2177 <br/> 2178 <?php 2179 $actions = array(); 2180 $actions['edit'] = '<a href="' . esc_url( self_admin_url( $edit_link ) ) . '">' . __( 'Edit' ) . '</a>'; 2181 2182 if ( ! in_array( $user->user_login, $super_admins ) ) { 2183 $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deleteuser' ) . '&action=deleteuser&id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>'; 2184 } 2185 2186 echo $this->row_actions( $actions ); 2187 ?> 2188 </div> 2189 </td> 2190 <?php 2191 break; 2192 2193 case 'name': ?> 2194 <td class="name column-name"><?php echo $user->display_name ?></td> 2195 <?php 2196 break; 2197 2198 case 'email': ?> 2199 <td class="email column-email"><a href="mailto:<?php echo $user->user_email ?>"><?php echo $user->user_email ?></a></td> 2200 <?php 2201 break; 2202 2203 case 'registered': 2204 if ( 'list' == $mode ) 2205 $date = 'Y/m/d'; 2206 else 2207 $date = 'Y/m/d \<\b\r \/\> g:i:s a'; 2208 ?> 2209 <td><?php echo mysql2date( $date, $user->user_registered ); ?></td> 2210 <?php 2211 break; 2212 2213 case 'blogs': 2214 $blogs = get_blogs_of_user( $user->ID, true ); 2215 ?> 2216 <td> 2217 <?php 2218 if ( is_array( $blogs ) ) { 2219 foreach ( (array) $blogs as $key => $val ) { 2220 $path = ( $val->path == '/' ) ? '' : $val->path; 2221 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . str_replace( '.' . $current_site->domain, '', $val->domain . $path ) . '</a>'; 2222 echo ' <small class="row-actions">'; 2223 2224 // Edit 2225 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . __( 'Edit' ) . '</a> | '; 2226 2227 // View 2228 echo '<a '; 2229 if ( get_blog_status( $val->userblog_id, 'spam' ) == 1 ) 2230 echo 'style="background-color: #faa" '; 2231 echo 'href="' . esc_url( get_home_url( $val->userblog_id ) ) . '">' . __( 'View' ) . '</a>'; 2232 2233 echo '</small><br />'; 2234 } 2235 } 2236 ?> 2237 </td> 2238 <?php 2239 break; 2240 2241 default: ?> 2242 <td><?php do_action( 'manage_users_custom_column', $column_name, $user->ID ); ?></td> 2243 <?php 2244 break; 2245 } 2246 endforeach 2247 ?> 2248 </tr> 2249 <?php 2250 } 2251 } 2252 } 2253 2254 class WP_Plugins_Table extends WP_List_Table { 2255 2256 function WP_Plugins_Table() { 2257 global $status, $page; 2258 2259 $default_status = get_user_option( 'plugins_last_view' ); 2260 if ( empty( $default_status ) ) 2261 $default_status = 'all'; 2262 $status = isset( $_REQUEST['plugin_status'] ) ? $_REQUEST['plugin_status'] : $default_status; 2263 if ( !in_array( $status, array( 'all', 'active', 'inactive', 'recently_activated', 'upgrade', 'network', 'mustuse', 'dropins', 'search' ) ) ) 2264 $status = 'all'; 2265 if ( $status != $default_status && 'search' != $status ) 2266 update_user_meta( get_current_user_id(), 'plugins_last_view', $status ); 2267 2268 $page = $this->get_pagenum(); 2269 2270 parent::WP_List_Table( array( 2271 'screen' => 'plugins', 2272 'plural' => 'plugins', 2273 ) ); 2274 } 2275 2276 function check_permissions() { 2277 if ( is_multisite() ) { 2278 $menu_perms = get_site_option( 'menu_items', array() ); 2279 2280 if ( empty( $menu_perms['plugins'] ) ) { 2281 if ( !is_super_admin() ) 2282 wp_die( __( 'Cheatin’ uh?' ) ); 2283 } 2284 } 2285 2286 if ( !current_user_can('activate_plugins') ) 2287 wp_die( __( 'You do not have sufficient permissions to manage plugins for this site.' ) ); 2288 } 2289 2290 function prepare_items() { 2291 global $status, $plugins, $totals, $page, $orderby, $order, $s; 2292 2293 wp_reset_vars( array( 'orderby', 'order', 's' ) ); 2294 2295 $plugins = array( 2296 'all' => apply_filters( 'all_plugins', get_plugins() ), 2297 'search' => array(), 2298 'active' => array(), 2299 'inactive' => array(), 2300 'recently_activated' => array(), 2301 'upgrade' => array(), 2302 'mustuse' => array(), 2303 'dropins' => array() 2304 ); 2305 2306 if ( ! is_multisite() || ( is_network_admin() && current_user_can('manage_network_plugins') ) ) { 2307 if ( apply_filters( 'show_advanced_plugins', true, 'mustuse' ) ) 2308 $plugins['mustuse'] = get_mu_plugins(); 2309 if ( apply_filters( 'show_advanced_plugins', true, 'dropins' ) ) 2310 $plugins['dropins'] = get_dropins(); 2311 } 2312 2313 set_transient( 'plugin_slugs', array_keys( $plugins['all'] ), 86400 ); 2314 2315 $recently_activated = get_option( 'recently_activated', array() ); 2316 2317 $one_week = 7*24*60*60; 2318 foreach ( $recently_activated as $key => $time ) 2319 if ( $time + $one_week < time() ) 2320 unset( $recently_activated[$key] ); 2321 update_option( 'recently_activated', $recently_activated ); 2322 2323 $current = get_site_transient( 'update_plugins' ); 2324 2325 foreach ( array( 'all', 'mustuse', 'dropins' ) as $type ) { 2326 foreach ( (array) $plugins[$type] as $plugin_file => $plugin_data ) { 2327 // Translate, Apply Markup, Sanitize HTML 2328 $plugins[$type][$plugin_file] = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, false, true ); 2329 } 2330 } 2331 2332 foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) { 2333 // Filter into individual sections 2334 if ( is_plugin_active_for_network($plugin_file) && !is_network_admin() ) { 2335 unset( $plugins['all'][ $plugin_file ] ); 2336 continue; 2337 } elseif ( is_multisite() && is_network_only_plugin( $plugin_file ) && !current_user_can( 'manage_network_plugins' ) ) { 2338 $plugins['network'][ $plugin_file ] = $plugin_data; 2339 } elseif ( ( !is_network_admin() && is_plugin_active( $plugin_file ) ) 2340 || ( is_network_admin() && is_plugin_active_for_network( $plugin_file ) ) ) { 2341 $plugins['active'][ $plugin_file ] = $plugin_data; 2342 } else { 2343 if ( !is_network_admin() && isset( $recently_activated[ $plugin_file ] ) ) // Was the plugin recently activated? 2344 $plugins['recently_activated'][ $plugin_file ] = $plugin_data; 2345 $plugins['inactive'][ $plugin_file ] = $plugin_data; 2346 } 2347 2348 if ( isset( $current->response[ $plugin_file ] ) ) 2349 $plugins['upgrade'][ $plugin_file ] = $plugin_data; 2350 } 2351 2352 if ( !current_user_can( 'update_plugins' ) ) 2353 $plugins['upgrade'] = array(); 2354 2355 if ( $s ) { 2356 $status = 'search'; 2357 $plugins['search'] = array_filter( $plugins['all'], array( $this, '_search_callback' ) ); 2358 } 2359 2360 $totals = array(); 2361 foreach ( $plugins as $type => $list ) 2362 $totals[ $type ] = count( $list ); 2363 2364 if ( empty( $plugins[ $status ] ) && !in_array( $status, array( 'all', 'search' ) ) ) 2365 $status = 'all'; 2366 2367 $this->items = $plugins[ $status ]; 2368 $total_this_page = $totals[ $status ]; 2369 2370 if ( $orderby ) { 2371 $orderby = ucfirst( $orderby ); 2372 $order = strtoupper( $order ); 2373 2374 uasort( $this->items, array( $this, '_order_callback' ) ); 2375 } 2376 2377 $plugins_per_page = $this->get_items_per_page( 'plugins_per_page', 999 ); 2378 2379 $start = ( $page - 1 ) * $plugins_per_page; 2380 2381 if ( $total_this_page > $plugins_per_page ) 2382 $this->items = array_slice( $this->items, $start, $plugins_per_page ); 2383 2384 $this->set_pagination_args( array( 2385 'total_items' => $total_this_page, 2386 'per_page' => $plugins_per_page, 2387 ) ); 2388 } 2389 2390 function _search_callback( $plugin ) { 2391 static $term; 2392 if ( is_null( $term ) ) 2393 $term = stripslashes( $_REQUEST['s'] ); 2394 2395 foreach ( $plugin as $value ) 2396 if ( stripos( $value, $term ) !== false ) 2397 return true; 2398 2399 return false; 2400 } 2401 2402 function _order_callback( $plugin_a, $plugin_b ) { 2403 global $orderby, $order; 2404 2405 $a = $plugin_a[$orderby]; 2406 $b = $plugin_b[$orderby]; 2407 2408 if ( $a == $b ) 2409 return 0; 2410 2411 if ( 'DESC' == $order ) 2412 return ( $a < $b ) ? 1 : -1; 2413 else 2414 return ( $a < $b ) ? -1 : 1; 2415 } 2416 2417 function no_items() { 2418 global $plugins; 2419 2420 if ( !empty( $plugins['all'] ) ) 2421 _e( 'No plugins found.' ); 2422 else 2423 _e( 'You do not appear to have any plugins available at this time.' ); 2424 } 2425 2426 function get_columns() { 2427 global $status; 2428 2429 return array( 2430 'cb' => !in_array( $status, array( 'mustuse', 'dropins' ) ) ? '<input type="checkbox" />' : '', 2431 'name' => __( 'Plugin' ), 2432 'description' => __( 'Description' ), 2433 ); 2434 } 2435 2436 function get_sortable_columns() { 2437 return array( 2438 'name' => 'name', 2439 'description' => 'description', 2440 ); 2441 } 2442 2443 function display_tablenav( $which ) { 2444 global $status; 2445 2446 if ( !in_array( $status, array( 'mustuse', 'dropins' ) ) ) 2447 parent::display_tablenav( $which ); 2448 } 2449 2450 function get_views() { 2451 global $totals, $status; 2452 2453 $status_links = array(); 2454 foreach ( $totals as $type => $count ) { 2455 if ( !$count ) 2456 continue; 2457 2458 switch ( $type ) { 2459 case 'all': 2460 $text = _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $count, 'plugins' ); 2461 break; 2462 case 'active': 2463 $text = _n( 'Active <span class="count">(%s)</span>', 'Active <span class="count">(%s)</span>', $count ); 2464 break; 2465 case 'recently_activated': 2466 $text = _n( 'Recently Active <span class="count">(%s)</span>', 'Recently Active <span class="count">(%s)</span>', $count ); 2467 break; 2468 case 'inactive': 2469 $text = _n( 'Inactive <span class="count">(%s)</span>', 'Inactive <span class="count">(%s)</span>', $count ); 2470 break; 2471 case 'network': 2472 $text = _n( 'Network <span class="count">(%s)</span>', 'Network <span class="count">(%s)</span>', $count ); 2473 break; 2474 case 'mustuse': 2475 $text = _n( 'Must-Use <span class="count">(%s)</span>', 'Must-Use <span class="count">(%s)</span>', $count ); 2476 break; 2477 case 'dropins': 2478 $text = _n( 'Drop-ins <span class="count">(%s)</span>', 'Drop-ins <span class="count">(%s)</span>', $count ); 2479 break; 2480 case 'upgrade': 2481 $text = _n( 'Upgrade Available <span class="count">(%s)</span>', 'Upgrade Available <span class="count">(%s)</span>', $count ); 2482 break; 2483 case 'search': 2484 $text = _n( 'Search Results <span class="count">(%s)</span>', 'Search Results <span class="count">(%s)</span>', $count ); 2485 break; 2486 } 2487 2488 $status_links[$type] = sprintf( "<li><a href='%s' %s>%s</a>", 2489 add_query_arg('plugin_status', $type, 'plugins.php'), 2490 ( $type == $status ) ? ' class="current"' : '', 2491 sprintf( $text, number_format_i18n( $count ) ) 2492 ); 2493 } 2494 2495 return $status_links; 2496 } 2497 2498 function get_bulk_actions() { 2499 global $status; 2500 2501 $actions = array(); 2502 if ( 'active' != $status ) 2503 $actions['activate-selected'] = __( 'Activate' ); 2504 if ( is_multisite() && 'network' != $status ) 2505 $actions['network-activate-selected'] = __( 'Network Activate' ); 2506 if ( 'inactive' != $status && 'recent' != $status ) 2507 $actions['deactivate-selected'] = __( 'Deactivate' ); 2508 if ( current_user_can( 'update_plugins' ) ) 2509 $actions['update-selected'] = __( 'Update' ); 2510 if ( current_user_can( 'delete_plugins' ) && ( 'active' != $status ) ) 2511 $actions['delete-selected'] = __( 'Delete' ); 2512 2513 return $actions; 2514 } 2515 2516 function bulk_actions( $which ) { 2517 global $status; 2518 2519 if ( in_array( $status, array( 'mustuse', 'dropins' ) ) ) 2520 return; 2521 2522 parent::bulk_actions( $which ); 2523 } 2524 2525 function extra_tablenav( $which ) { 2526 global $status; 2527 2528 if ( 'recently_activated' == $status ) { ?> 2529 <div class="alignleft actions"> 2530 <input type="submit" name="clear-recent-list" value="<?php esc_attr_e( 'Clear List' ) ?>" class="button-secondary" /> 2531 </div> 2532 <?php } 2533 } 2534 2535 function current_action() { 2536 if ( isset($_POST['clear-recent-list']) ) 2537 return 'clear-recent-list'; 2538 2539 return parent::current_action(); 2540 } 2541 2542 function display_rows() { 2543 global $status, $page, $s; 2544 2545 $context = $status; 2546 2547 foreach ( $this->items as $plugin_file => $plugin_data ) { 2548 // preorder 2549 $actions = array( 2550 'network_deactivate' => '', 'deactivate' => '', 2551 'network_only' => '', 'activate' => '', 2552 'network_activate' => '', 2553 'edit' => '', 2554 'delete' => '', 2555 ); 2556 2557 if ( 'mustuse' == $context ) { 2558 if ( is_multisite() && !is_network_admin() ) 2559 continue; 2560 $is_active = true; 2561 } elseif ( 'dropins' == $context ) { 2562 if ( is_multisite() && !is_network_admin() ) 2563 continue; 2564 $dropins = _get_dropins(); 2565 $plugin_name = $plugin_file; 2566 if ( $plugin_file != $plugin_data['Name'] ) 2567 $plugin_name .= '<br/>' . $plugin_data['Name']; 2568 if ( true === ( $dropins[ $plugin_file ][1] ) ) { // Doesn't require a constant 2569 $is_active = true; 2570 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>'; 2571 } elseif ( constant( $dropins[ $plugin_file ][1] ) ) { // Constant is true 2572 $is_active = true; 2573 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>'; 2574 } else { 2575 $is_active = false; 2576 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . ' <span class="attention">' . __('Inactive:') . '</span></strong> ' . sprintf( __( 'Requires <code>%s</code> in <code>wp-config.php</code>.' ), "define('" . $dropins[ $plugin_file ][1] . "', true);" ) . '</p>'; 2577 } 2578 if ( $plugin_data['Description'] ) 2579 $description .= '<p>' . $plugin_data['Description'] . '</p>'; 2580 } else { 2581 $is_active_for_network = is_plugin_active_for_network($plugin_file); 2582 if ( is_network_admin() ) 2583 $is_active = $is_active_for_network; 2584 else 2585 $is_active = is_plugin_active( $plugin_file ); 2586 2587 if ( $is_active_for_network && !is_super_admin() && !is_network_admin() ) 2588 continue; 2589 2590 if ( is_network_admin() ) { 2591 if ( $is_active_for_network ) { 2592 if ( current_user_can( 'manage_network_plugins' ) ) 2593 $actions['network_deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Network Deactivate') . '</a>'; 2594 } else { 2595 if ( current_user_can( 'manage_network_plugins' ) ) 2596 $actions['network_activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin for all sites in this network') . '" class="edit">' . __('Network Activate') . '</a>'; 2597 if ( current_user_can('delete_plugins') ) 2598 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>'; 2599 } 2600 } else { 2601 if ( $is_active ) { 2602 $actions['deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Deactivate') . '</a>'; 2603 } else { 2604 if ( is_network_only_plugin( $plugin_file ) && !is_network_admin() ) 2605 continue; 2606 2607 $actions['activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin') . '" class="edit">' . __('Activate') . '</a>'; 2608 2609 if ( current_user_can('delete_plugins') ) 2610 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>'; 2611 } // end if $is_active 2612 } // end if is_network_admin() 2613 2614 if ( current_user_can('edit_plugins') && is_writable(WP_PLUGIN_DIR . '/' . $plugin_file) ) 2615 $actions['edit'] = '<a href="plugin-editor.php?file=' . $plugin_file . '" title="' . __('Open this file in the Plugin Editor') . '" class="edit">' . __('Edit') . '</a>'; 2616 } // end if $context 2617 2618 $actions = apply_filters( 'plugin_action_links', array_filter( $actions ), $plugin_file, $plugin_data, $context ); 2619 $actions = apply_filters( "plugin_action_links_$plugin_file", $actions, $plugin_file, $plugin_data, $context ); 2620 2621 $class = $is_active ? 'active' : 'inactive'; 2622 $checkbox = in_array( $status, array( 'mustuse', 'dropins' ) ) ? '' : "<input type='checkbox' name='checked[]' value='" . esc_attr( $plugin_file ) . "' />"; 2623 if ( 'dropins' != $status ) { 2624 $description = '<p>' . $plugin_data['Description'] . '</p>'; 2625 $plugin_name = $plugin_data['Name']; 2626 } 2627 2628 $id = sanitize_title( $plugin_name ); 2629 2630 echo " 2631 <tr id='$id' class='$class'> 2632 <th scope='row' class='check-column'>$checkbox</th> 2633 <td class='plugin-title'><strong>$plugin_name</strong></td> 2634 <td class='desc'>$description</td> 2635 </tr> 2636 <tr class='$class second'> 2637 <td></td> 2638 <td class='plugin-title'>"; 2639 2640 echo $this->row_actions( $actions, true ); 2641 2642 echo "</td> 2643 <td class='desc'>"; 2644 $plugin_meta = array(); 2645 if ( !empty( $plugin_data['Version'] ) ) 2646 $plugin_meta[] = sprintf( __( 'Version %s' ), $plugin_data['Version'] ); 2647 if ( !empty( $plugin_data['Author'] ) ) { 2648 $author = $plugin_data['Author']; 2649 if ( !empty( $plugin_data['AuthorURI'] ) ) 2650 $author = '<a href="' . $plugin_data['AuthorURI'] . '" title="' . __( 'Visit author homepage' ) . '">' . $plugin_data['Author'] . '</a>'; 2651 $plugin_meta[] = sprintf( __( 'By %s' ), $author ); 2652 } 2653 if ( ! empty( $plugin_data['PluginURI'] ) ) 2654 $plugin_meta[] = '<a href="' . $plugin_data['PluginURI'] . '" title="' . __( 'Visit plugin site' ) . '">' . __( 'Visit plugin site' ) . '</a>'; 2655 2656 $plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status ); 2657 echo implode( ' | ', $plugin_meta ); 2658 echo "</td> 2659 </tr>\n"; 2660 2661 do_action( 'after_plugin_row', $plugin_file, $plugin_data, $status ); 2662 do_action( "after_plugin_row_$plugin_file", $plugin_file, $plugin_data, $status ); 2663 } 2664 } 2665 } 2666 2667 class WP_Plugin_Install_Table extends WP_List_Table { 2668 2669 function WP_Plugin_Install_Table() { 2670 parent::WP_List_Table( array( 2671 'screen' => 'plugin-install', 2672 ) ); 2673 } 2674 2675 function check_permissions() { 2676 if ( ! current_user_can('install_plugins') ) 2677 wp_die(__('You do not have sufficient permissions to install plugins on this site.')); 2678 } 2679 2680 function prepare_items() { 2681 include( ABSPATH . 'wp-admin/includes/plugin-install.php' ); 2682 2683 global $tabs, $tab, $paged, $type, $term; 2684 2685 wp_reset_vars( array( 'tab' ) ); 2686 2687 $paged = $this->get_pagenum(); 2688 2689 $per_page = 30; 2690 2691 // These are the tabs which are shown on the page 2692 $tabs = array(); 2693 $tabs['dashboard'] = __( 'Search' ); 2694 if ( 'search' == $tab ) 2695 $tabs['search'] = __( 'Search Results' ); 2696 $tabs['upload'] = __( 'Upload' ); 2697 $tabs['featured'] = _x( 'Featured','Plugin Installer' ); 2698 $tabs['popular'] = _x( 'Popular','Plugin Installer' ); 2699 $tabs['new'] = _x( 'Newest','Plugin Installer' ); 2700 $tabs['updated'] = _x( 'Recently Updated','Plugin Installer' ); 2701 2702 $nonmenu_tabs = array( 'plugin-information' ); //Valid actions to perform which do not have a Menu item. 2703 2704 $tabs = apply_filters( 'install_plugins_tabs', $tabs ); 2705 $nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs ); 2706 2707 // If a non-valid menu tab has been selected, And its not a non-menu action. 2708 if ( empty( $tab ) || ( !isset( $tabs[ $tab ] ) && !in_array( $tab, (array) $nonmenu_tabs ) ) ) 2709 $tab = key( $tabs ); 2710 2711 $args = array( 'page' => $paged, 'per_page' => $per_page ); 2712 2713 switch ( $tab ) { 2714 case 'search': 2715 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : ''; 2716 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : ''; 2717 2718 switch ( $type ) { 2719 case 'tag': 2720 $args['tag'] = sanitize_title_with_dashes( $term ); 2721 break; 2722 case 'term': 2723 $args['search'] = $term; 2724 break; 2725 case 'author': 2726 $args['author'] = $term; 2727 break; 2728 } 2729 2730 add_action( 'install_plugins_table_header', 'install_search_form' ); 2731 break; 2732 2733 case 'featured': 2734 case 'popular': 2735 case 'new': 2736 case 'updated': 2737 $args['browse'] = $tab; 2738 break; 2739 2740 default: 2741 $args = false; 2742 } 2743 2744 if ( !$args ) 2745 return; 2746 2747 $api = plugins_api( 'query_plugins', $args ); 2748 2749 if ( is_wp_error( $api ) ) 2750 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' ); 2751 2752 $this->items = $api->plugins; 2753 2754 $this->set_pagination_args( array( 2755 'total_items' => $api->info['results'], 2756 'per_page' => $per_page, 2757 ) ); 2758 } 2759 2760 function no_items() { 2761 _e( 'No plugins match your request.' ); 2762 } 2763 2764 function get_views() { 2765 global $tabs, $tab; 2766 2767 $display_tabs = array(); 2768 foreach ( (array) $tabs as $action => $text ) { 2769 $class = ( $action == $tab ) ? ' class="current"' : ''; 2770 $href = admin_url('plugin-install.php?tab=' . $action); 2771 $display_tabs[$action] = "<a href='$href'$class>$text</a>"; 2772 } 2773 2774 return $display_tabs; 2775 } 2776 2777 function display_tablenav( $which ) { 2778 if ( 'top' == $which ) { ?> 2779 <div class="tablenav"> 2780 <div class="alignleft actions"> 2781 <?php do_action( 'install_plugins_table_header' ); ?> 2782 </div> 2783 <?php $this->pagination( $which ); ?> 2784 <br class="clear" /> 2785 </div> 2786 <?php } else { ?> 2787 <div class="tablenav"> 2788 <?php $this->pagination( $which ); ?> 2789 <br class="clear" /> 2790 </div> 2791 <?php 2792 } 2793 } 2794 2795 function get_table_classes() { 2796 extract( $this->_args ); 2797 2798 return array( 'widefat', $plural ); 2799 } 2800 2801 function get_columns() { 2802 return array( 2803 'name' => __( 'Name' ), 2804 'version' => __( 'Version' ), 2805 'rating' => __( 'Rating' ), 2806 'description' => __( 'Description' ), 2807 ); 2808 } 2809 2810 function display_rows() { 2811 $plugins_allowedtags = array( 2812 'a' => array( 'href' => array(),'title' => array(), 'target' => array() ), 2813 'abbr' => array( 'title' => array() ),'acronym' => array( 'title' => array() ), 2814 'code' => array(), 'pre' => array(), 'em' => array(),'strong' => array(), 2815 'ul' => array(), 'ol' => array(), 'li' => array(), 'p' => array(), 'br' => array() 2816 ); 2817 2818 foreach ( (array) $this->items as $plugin ) { 2819 if ( is_object( $plugin ) ) 2820 $plugin = (array) $plugin; 2821 2822 $title = wp_kses( $plugin['name'], $plugins_allowedtags ); 2823 //Limit description to 400char, and remove any HTML. 2824 $description = strip_tags( $plugin['description'] ); 2825 if ( strlen( $description ) > 400 ) 2826 $description = mb_substr( $description, 0, 400 ) . '…'; 2827 //remove any trailing entities 2828 $description = preg_replace( '/&[^;\s]{0,6}$/', '', $description ); 2829 //strip leading/trailing & multiple consecutive lines 2830 $description = trim( $description ); 2831 $description = preg_replace( "|(\r?\n)+|", "\n", $description ); 2832 //\n => <br> 2833 $description = nl2br( $description ); 2834 $version = wp_kses( $plugin['version'], $plugins_allowedtags ); 2835 2836 $name = strip_tags( $title . ' ' . $version ); 2837 2838 $author = $plugin['author']; 2839 if ( ! empty( $plugin['author'] ) ) 2840 $author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '.</cite>'; 2841 2842 $author = wp_kses( $author, $plugins_allowedtags ); 2843 2844 $action_links = array(); 2845 $action_links[] = '<a href="' . admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin['slug'] . 2846 '&TB_iframe=true&width=600&height=550' ) . '" class="thickbox" title="' . 2847 esc_attr( sprintf( __( 'More information about %s' ), $name ) ) . '">' . __( 'Details' ) . '</a>'; 2848 2849 if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) { 2850 $status = install_plugin_install_status( $plugin ); 2851 2852 switch ( $status['status'] ) { 2853 case 'install': 2854 if ( $status['url'] ) 2855 $action_links[] = '<a class="install-now" href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Install %s' ), $name ) ) . '">' . __( 'Install Now' ) . '</a>'; 2856 break; 2857 case 'update_available': 2858 if ( $status['url'] ) 2859 $action_links[] = '<a href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Update to version %s' ), $status['version'] ) ) . '">' . sprintf( __( 'Update Now' ), $status['version'] ) . '</a>'; 2860 break; 2861 case 'latest_installed': 2862 case 'newer_installed': 2863 $action_links[] = '<span title="' . esc_attr__( 'This plugin is already installed and is up to date' ) . ' ">' . __( 'Installed' ) . '</span>'; 2864 break; 2865 } 2866 } 2867 2868 $action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin ); 2869 ?> 2870 <tr> 2871 <td class="name"><strong><?php echo $title; ?></strong> 2872 <div class="action-links"><?php if ( !empty( $action_links ) ) echo implode( ' | ', $action_links ); ?></div> 2873 </td> 2874 <td class="vers"><?php echo $version; ?></td> 2875 <td class="vers"> 2876 <div class="star-holder" title="<?php printf( _n( '( based on %s rating )', '( based on %s ratings )', $plugin['num_ratings'] ), number_format_i18n( $plugin['num_ratings'] ) ) ?>"> 2877 <div class="star star-rating" style="width: <?php echo esc_attr( $plugin['rating'] ) ?>px"></div> 2878 <div class="star star5"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '5 stars' ) ?>" /></div> 2879 <div class="star star4"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '4 stars' ) ?>" /></div> 2880 <div class="star star3"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '3 stars' ) ?>" /></div> 2881 <div class="star star2"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '2 stars' ) ?>" /></div> 2882 <div class="star star1"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '1 star' ) ?>" /></div> 2883 </div> 2884 </td> 2885 <td class="desc"><?php echo $description, $author; ?></td> 2886 </tr> 2887 <?php 2888 } 2889 } 2890 } 2891 2892 class WP_Themes_Table extends WP_List_Table { 2893 2894 var $search = array(); 2895 var $features = array(); 2896 2897 function WP_Themes_Table() { 2898 parent::__construct( array( 2899 'screen' => 'themes', 2900 ) ); 2901 } 2902 2903 function check_permissions() { 2904 if ( !current_user_can('switch_themes') && !current_user_can('edit_theme_options') ) 2905 wp_die( __( 'Cheatin’ uh?' ) ); 2906 } 2907 2908 function prepare_items() { 2909 global $ct; 2910 2911 $ct = current_theme_info(); 2912 2913 $themes = get_allowed_themes(); 2914 2915 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : ''; 2916 2917 if ( '' !== $search ) { 2918 $this->search = array_merge( $this->search, array_filter( array_map( 'trim', explode( ',', $search ) ) ) ); 2919 $this->search = array_unique( $this->search ); 2920 } 2921 2922 if ( !empty( $_REQUEST['features'] ) ) { 2923 $this->features = $_REQUEST['features']; 2924 $this->features = array_map( 'trim', $this->features ); 2925 $this->features = array_map( 'sanitize_title_with_dashes', $this->features ); 2926 $this->features = array_unique( $this->features ); 2927 } 2928 2929 if ( $this->search || $this->features ) { 2930 foreach ( $themes as $key => $theme ) { 2931 if ( !$this->search_theme( $theme ) ) 2932 unset( $themes[ $key ] ); 2933 } 2934 } 2935 2936 unset( $themes[$ct->name] ); 2937 uksort( $themes, "strnatcasecmp" ); 2938 2939 $per_page = 15; 2940 $page = $this->get_pagenum(); 2941 2942 $start = ( $page - 1 ) * $per_page; 2943 2944 $this->items = array_slice( $themes, $start, $per_page ); 2945 2946 $this->set_pagination_args( array( 2947 'query_var' => 'pagenum', 2948 'total_items' => count( $themes ), 2949 'per_page' => $per_page, 2950 ) ); 2951 } 2952 2953 function no_items() { 2954 if ( current_user_can( 'install_themes' ) ) 2955 printf( __( 'You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress.org Theme Directory at any time: just click on the <em><a href="%s">Install Themes</a></em> tab above.' ), 'theme-install.php' ); 2956 else 2957 printf( __( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ), get_site_option( 'site_name' ) ); 2958 } 2959 2960 function display_table() { 2961 ?> 2962 <div class="tablenav"> 2963 <?php $this->pagination( 'top' ); ?> 2964 <br class="clear" /> 2965 </div> 2966 2967 <table id="availablethemes" cellspacing="0" cellpadding="0"> 2968 <tbody id="the-list" class="list:themes"> 2969 <?php $this->display_rows(); ?> 2970 </tbody> 2971 </table> 2972 2973 <div class="tablenav"> 2974 <?php $this->pagination( 'bottom' ); ?> 2975 <br class="clear" /> 2976 </div> 2977 <?php 2978 } 2979 2980 function get_columns() { 2981 return array(); 2982 } 2983 2984 function display_rows() { 2985 $themes = $this->items; 2986 $theme_names = array_keys( $themes ); 2987 natcasesort( $theme_names ); 2988 2989 $table = array(); 2990 $rows = ceil( count( $theme_names ) / 3 ); 2991 for ( $row = 1; $row <= $rows; $row++ ) 2992 for ( $col = 1; $col <= 3; $col++ ) 2993 $table[$row][$col] = array_shift( $theme_names ); 2994 2995 foreach ( $table as $row => $cols ) { 2996 ?> 2997 <tr> 2998 <?php 2999 foreach ( $cols as $col => $theme_name ) { 3000 $class = array( 'available-theme' ); 3001 if ( $row == 1 ) $class[] = 'top'; 3002 if ( $col == 1 ) $class[] = 'left'; 3003 if ( $row == $rows ) $class[] = 'bottom'; 3004 if ( $col == 3 ) $class[] = 'right'; 3005 ?> 3006 <td class="<?php echo join( ' ', $class ); ?>"> 3007 <?php if ( !empty( $theme_name ) ) : 3008 $template = $themes[$theme_name]['Template']; 3009 $stylesheet = $themes[$theme_name]['Stylesheet']; 3010 $title = $themes[$theme_name]['Title']; 3011 $version = $themes[$theme_name]['Version']; 3012 $description = $themes[$theme_name]['Description']; 3013 $author = $themes[$theme_name]['Author']; 3014 $screenshot = $themes[$theme_name]['Screenshot']; 3015 $stylesheet_dir = $themes[$theme_name]['Stylesheet Dir']; 3016 $template_dir = $themes[$theme_name]['Template Dir']; 3017 $parent_theme = $themes[$theme_name]['Parent Theme']; 3018 $theme_root = $themes[$theme_name]['Theme Root']; 3019 $theme_root_uri = $themes[$theme_name]['Theme Root URI']; 3020 $preview_link = esc_url( get_option( 'home' ) . '/' ); 3021 if ( is_ssl() ) 3022 $preview_link = str_replace( 'http://', 'https://', $preview_link ); 3023 $preview_link = htmlspecialchars( add_query_arg( array( 'preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'TB_iframe' => 'true' ), $preview_link ) ); 3024 $preview_text = esc_attr( sprintf( __( 'Preview of “%s”' ), $title ) ); 3025 $tags = $themes[$theme_name]['Tags']; 3026 $thickbox_class = 'thickbox thickbox-preview'; 3027 $activate_link = wp_nonce_url( "themes.php?action=activate&template=".urlencode( $template )."&stylesheet=".urlencode( $stylesheet ), 'switch-theme_' . $template ); 3028 $activate_text = esc_attr( sprintf( __( 'Activate “%s”' ), $title ) ); 3029 $actions = array(); 3030 $actions[] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __( 'Activate' ) . '</a>'; 3031 $actions[] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr( sprintf( __( 'Preview “%s”' ), $theme_name ) ) . '">' . __( 'Preview' ) . '</a>'; 3032 if ( current_user_can( 'delete_themes' ) ) 3033 $actions[] = '<a class="submitdelete deletion" href="' . wp_nonce_url( "themes.php?action=delete&template=$stylesheet", 'delete-theme_' . $stylesheet ) . '" onclick="' . "return confirm( '" . esc_js( sprintf( __( "You are about to delete this theme '%s'\n 'Cancel' to stop, 'OK' to delete." ), $theme_name ) ) . "' );" . '">' . __( 'Delete' ) . '</a>'; 3034 $actions = apply_filters( 'theme_action_links', $actions, $themes[$theme_name] ); 3035 3036 $actions = implode ( ' | ', $actions ); 3037 ?> 3038 <a href="<?php echo $preview_link; ?>" class="<?php echo $thickbox_class; ?> screenshot"> 3039 <?php if ( $screenshot ) : ?> 3040 <img src="<?php echo $theme_root_uri . '/' . $stylesheet . '/' . $screenshot; ?>" alt="" /> 3041 <?php endif; ?> 3042 </a> 3043 <h3><?php 3044 /* translators: 1: theme title, 2: theme version, 3: theme author */ 3045 printf( __( '%1$s %2$s by %3$s' ), $title, $version, $author ) ; ?></h3> 3046 <p class="description"><?php echo $description; ?></p> 3047 <span class='action-links'><?php echo $actions ?></span> 3048 <?php if ( current_user_can( 'edit_themes' ) && $parent_theme ) { 3049 /* translators: 1: theme title, 2: template dir, 3: stylesheet_dir, 4: theme title, 5: parent_theme */ ?> 3050 <p><?php printf( __( 'The template files are located in <code>%2$s</code>. The stylesheet files are located in <code>%3$s</code>. <strong>%4$s</strong> uses templates from <strong>%5$s</strong>. Changes made to the templates will affect both themes.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ), $title, $parent_theme ); ?></p> 3051 <?php } else { ?> 3052 <p><?php printf( __( 'All of this theme’s files are located in <code>%2$s</code>.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ) ); ?></p> 3053 <?php } ?> 3054 <?php if ( $tags ) : ?> 3055 <p><?php _e( 'Tags:' ); ?> <?php echo join( ', ', $tags ); ?></p> 3056 <?php endif; ?> 3057 <?php theme_update_available( $themes[$theme_name] ); ?> 3058 <?php endif; // end if not empty theme_name ?> 3059 </td> 3060 <?php } // end foreach $cols ?> 3061 </tr> 3062 <?php } // end foreach $table 3063 } 3064 3065 function search_theme( $theme ) { 3066 $matched = 0; 3067 3068 // Match all phrases 3069 if ( count( $this->search ) > 0 ) { 3070 foreach ( $this->search as $word ) { 3071 $matched = 0; 3072 3073 // In a tag? 3074 if ( in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) ) 3075 $matched = 1; 3076 3077 // In one of the fields? 3078 foreach ( array( 'Name', 'Title', 'Description', 'Author', 'Template', 'Stylesheet' ) AS $field ) { 3079 if ( stripos( $theme[$field], $word ) !== false ) 3080 $matched++; 3081 } 3082 3083 if ( $matched == 0 ) 3084 return false; 3085 } 3086 } 3087 3088 // Now search the features 3089 if ( count( $this->features ) > 0 ) { 3090 foreach ( $this->features as $word ) { 3091 // In a tag? 3092 if ( !in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) ) 3093 return false; 3094 } 3095 } 3096 3097 // Only get here if each word exists in the tags or one of the fields 3098 return true; 3099 } 3100 } 3101 3102 class WP_Theme_Install_Table extends WP_List_Table { 3103 3104 function WP_Theme_Install_Table() { 3105 parent::WP_List_Table( array( 3106 'screen' => 'theme-install', 3107 ) ); 3108 } 3109 3110 function check_permissions() { 3111 if ( ! current_user_can('install_themes') ) 3112 wp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) ); 3113 } 3114 3115 function prepare_items() { 3116 include( ABSPATH . 'wp-admin/includes/theme-install.php' ); 3117 3118 global $tabs, $tab, $paged, $type, $term, $theme_field_defaults; 3119 3120 wp_reset_vars( array( 'tab' ) ); 3121 3122 $paged = $this->get_pagenum(); 3123 3124 $per_page = 30; 3125 3126 // These are the tabs which are shown on the page, 3127 $tabs = array(); 3128 $tabs['dashboard'] = __( 'Search' ); 3129 if ( 'search' == $tab ) 3130 $tabs['search'] = __( 'Search Results' ); 3131 $tabs['upload'] = __( 'Upload' ); 3132 $tabs['featured'] = _x( 'Featured','Theme Installer' ); 3133 //$tabs['popular'] = _x( 'Popular','Theme Installer' ); 3134 $tabs['new'] = _x( 'Newest','Theme Installer' ); 3135 $tabs['updated'] = _x( 'Recently Updated','Theme Installer' ); 3136 3137 $nonmenu_tabs = array( 'theme-information' ); // Valid actions to perform which do not have a Menu item. 3138 3139 $tabs = apply_filters( 'install_themes_tabs', $tabs ); 3140 $nonmenu_tabs = apply_filters( 'install_themes_nonmenu_tabs', $nonmenu_tabs ); 3141 3142 // If a non-valid menu tab has been selected, And its not a non-menu action. 3143 if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs ) ) ) 3144 $tab = key( $tabs ); 3145 3146 $args = array( 'page' => $paged, 'per_page' => $per_page, 'fields' => $theme_field_defaults ); 3147 3148 switch ( $tab ) { 3149 case 'search': 3150 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : ''; 3151 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : ''; 3152 3153 switch ( $type ) { 3154 case 'tag': 3155 $terms = explode( ',', $term ); 3156 $terms = array_map( 'trim', $terms ); 3157 $terms = array_map( 'sanitize_title_with_dashes', $terms ); 3158 $args['tag'] = $terms; 3159 break; 3160 case 'term': 3161 $args['search'] = $term; 3162 break; 3163 case 'author': 3164 $args['author'] = $term; 3165 break; 3166 } 3167 3168 if ( !empty( $_POST['features'] ) ) { 3169 $terms = $_POST['features']; 3170 $terms = array_map( 'trim', $terms ); 3171 $terms = array_map( 'sanitize_title_with_dashes', $terms ); 3172 $args['tag'] = $terms; 3173 $_REQUEST['s'] = implode( ',', $terms ); 3174 $_REQUEST['type'] = 'tag'; 3175 } 3176 3177 add_action( 'install_themes_table_header', 'install_theme_search_form' ); 3178 break; 3179 3180 case 'featured': 3181 //case 'popular': 3182 case 'new': 3183 case 'updated': 3184 $args['browse'] = $tab; 3185 break; 3186 3187 default: 3188 $args = false; 3189 } 3190 3191 if ( !$args ) 3192 return; 3193 3194 $api = themes_api( 'query_themes', $args ); 3195 3196 if ( is_wp_error( $api ) ) 3197 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' ); 3198 3199 $this->items = $api->themes; 3200 3201 $this->set_pagination_args( array( 3202 'total_items' => $api->info['results'], 3203 'per_page' => $per_page, 3204 ) ); 3205 } 3206 3207 function no_items() { 3208 _e( 'No themes match your request.' ); 3209 } 3210 3211 function get_views() { 3212 global $tabs, $tab; 3213 3214 $display_tabs = array(); 3215 foreach ( (array) $tabs as $action => $text ) { 3216 $class = ( $action == $tab ) ? ' class="current"' : ''; 3217 $href = self_admin_url('theme-install.php?tab=' . $action); 3218 $display_tabs[$action] = "<a href='$href'$class>$text</a>"; 3219 } 3220 3221 return $display_tabs; 3222 } 3223 3224 function get_columns() { 3225 return array(); 3226 } 3227 3228 function display_table() { 3229 ?> 3230 <div class="tablenav"> 3231 <div class="alignleft actions"> 3232 <?php do_action( 'install_themes_table_header' ); ?> 3233 </div> 3234 <?php $this->pagination( 'top' ); ?> 3235 <br class="clear" /> 3236 </div> 3237 3238 <table id="availablethemes" cellspacing="0" cellpadding="0"> 3239 <tbody id="the-list" class="list:themes"> 3240 <?php $this->display_rows(); ?> 3241 </tbody> 3242 </table> 3243 3244 <div class="tablenav"> 3245 <?php $this->pagination( 'bottom' ); ?> 3246 <br class="clear" /> 3247 </div> 3248 <?php 3249 } 3250 3251 function display_rows() { 3252 $themes = $this->items; 3253 3254 $rows = ceil( count( $themes ) / 3 ); 3255 $table = array(); 3256 $theme_keys = array_keys( $themes ); 3257 for ( $row = 1; $row <= $rows; $row++ ) 3258 for ( $col = 1; $col <= 3; $col++ ) 3259 $table[$row][$col] = array_shift( $theme_keys ); 3260 3261 foreach ( $table as $row => $cols ) { 3262 echo "\t<tr>\n"; 3263 foreach ( $cols as $col => $theme_index ) { 3264 $class = array( 'available-theme' ); 3265 if ( $row == 1 ) $class[] = 'top'; 3266 if ( $col == 1 ) $class[] = 'left'; 3267 if ( $row == $rows ) $class[] = 'bottom'; 3268 if ( $col == 3 ) $class[] = 'right'; 3269 ?> 3270 <td class="<?php echo join( ' ', $class ); ?>"><?php 3271 if ( isset( $themes[$theme_index] ) ) 3272 display_theme( $themes[$theme_index] ); 3273 ?></td> 3274 <?php } // end foreach $cols 3275 echo "\t</tr>\n"; 3276 } // end foreach $table 3277 } 3278 } 3279 452 ?> -
trunk/wp-admin/includes/list-table-ms-users.php
r15954 r15955 9 9 * @subpackage Administration 10 10 */ 11 12 class WP_Media_Table extends WP_List_Table {13 14 function WP_Media_Table() {15 global $detached;16 17 $detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );18 19 parent::WP_List_Table( array(20 'screen' => $detached ? 'upload-detached' : 'upload',21 'plural' => 'media'22 ) );23 }24 25 function check_permissions() {26 if ( !current_user_can('upload_files') )27 wp_die( __( 'You do not have permission to upload files.' ) );28 }29 30 function prepare_items() {31 global $lost, $wpdb, $wp_query, $post_mime_types, $avail_post_mime_types;32 33 $q = $_REQUEST;34 35 if ( !empty( $lost ) )36 $q['post__in'] = implode( ',', $lost );37 38 list( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $q );39 40 $this->is_trash = isset( $_REQUEST['status'] ) && 'trash' == $_REQUEST['status'];41 42 $this->set_pagination_args( array(43 'total_items' => $wp_query->found_posts,44 'total_pages' => $wp_query->max_num_pages,45 'per_page' => $wp_query->query_vars['posts_per_page'],46 ) );47 }48 49 function get_views() {50 global $wpdb, $post_mime_types, $detached, $avail_post_mime_types;51 52 $type_links = array();53 $_num_posts = (array) wp_count_attachments();54 $_total_posts = array_sum($_num_posts) - $_num_posts['trash'];55 if ( !isset( $total_orphans ) )56 $total_orphans = $wpdb->get_var( "SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent < 1" );57 $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));58 foreach ( $matches as $type => $reals )59 foreach ( $reals as $real )60 $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];61 62 $class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : '';63 $type_links['all'] = "<li><a href='upload.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $_total_posts, 'uploaded files' ), number_format_i18n( $_total_posts ) ) . '</a>';64 foreach ( $post_mime_types as $mime_type => $label ) {65 $class = '';66 67 if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )68 continue;69 70 if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )71 $class = ' class="current"';72 if ( !empty( $num_posts[$mime_type] ) )73 $type_links[$mime_type] = "<li><a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( _n( $label[2][0], $label[2][1], $num_posts[$mime_type] ), number_format_i18n( $num_posts[$mime_type] )) . '</a>';74 }75 $type_links['detached'] = '<li><a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( _nx( 'Unattached <span class="count">(%s)</span>', 'Unattached <span class="count">(%s)</span>', $total_orphans, 'detached files' ), number_format_i18n( $total_orphans ) ) . '</a>';76 77 if ( !empty($_num_posts['trash']) )78 $type_links['trash'] = '<li><a href="upload.php?status=trash"' . ( (isset($_GET['status']) && $_GET['status'] == 'trash' ) ? ' class="current"' : '') . '>' . sprintf( _nx( 'Trash <span class="count">(%s)</span>', 'Trash <span class="count">(%s)</span>', $_num_posts['trash'], 'uploaded files' ), number_format_i18n( $_num_posts['trash'] ) ) . '</a>';79 80 return $type_links;81 }82 83 function get_bulk_actions() {84 global $detached;85 86 $actions = array();87 $actions['delete'] = __( 'Delete Permanently' );88 if ( $detached )89 $actions['attach'] = __( 'Attach to a post' );90 91 return $actions;92 }93 94 function extra_tablenav( $which ) {95 global $post_type, $detached;96 ?>97 <div class="alignleft actions">98 <?php99 if ( 'top' == $which && !is_singular() && !$detached && !$this->is_trash ) {100 $this->months_dropdown( $post_type );101 102 do_action( 'restrict_manage_posts' );103 ?>104 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />105 <?php106 }107 108 if ( $detached ) { ?>109 <input type="submit" id="find_detached" name="find_detached" value="<?php esc_attr_e( 'Scan for lost attachments' ); ?>" class="button-secondary" />110 <?php } elseif ( $this->is_trash && current_user_can( 'edit_others_posts' ) ) { ?>111 <input type="submit" id="delete_all" name="delete_all" value="<?php esc_attr_e( 'Empty Trash' ); ?>" class="button-secondary apply" />112 <?php } ?>113 </div>114 <?php115 }116 117 function current_action() {118 if ( isset( $_REQUEST['find_detached'] ) )119 return 'find_detached';120 121 if ( isset( $_REQUEST['found_post_id'] ) && isset( $_REQUEST['media'] ) )122 return 'attach';123 124 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )125 return 'delete_all';126 127 return parent::current_action();128 }129 130 function has_items() {131 return have_posts();132 }133 134 function no_items() {135 _e( 'No media attachments found.' );136 }137 138 function get_columns() {139 $posts_columns = array();140 $posts_columns['cb'] = '<input type="checkbox" />';141 $posts_columns['icon'] = '';142 /* translators: column name */143 $posts_columns['title'] = _x( 'File', 'column name' );144 $posts_columns['author'] = __( 'Author' );145 //$posts_columns['tags'] = _x( 'Tags', 'column name' );146 /* translators: column name */147 if ( 'upload' == $this->_screen->id ) {148 $posts_columns['parent'] = _x( 'Attached to', 'column name' );149 $posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="' . esc_url( admin_url( 'images/comment-grey-bubble.png' ) ) . '" /></div>';150 }151 /* translators: column name */152 $posts_columns['date'] = _x( 'Date', 'column name' );153 $posts_columns = apply_filters( 'manage_media_columns', $posts_columns, 'upload' != $this->_screen->id );154 155 return $posts_columns;156 }157 158 function get_sortable_columns() {159 return array(160 'title' => 'title',161 'author' => 'author',162 'parent' => 'parent',163 'comments' => 'comment_count',164 'date' => 'date',165 );166 }167 168 function display_rows() {169 global $detached, $post, $id;170 171 if ( $detached ) {172 $this->display_orphans();173 return;174 }175 176 add_filter( 'the_title','esc_html' );177 $alt = '';178 179 while ( have_posts() ) : the_post();180 181 if ( $this->is_trash && $post->post_status != 'trash'182 || !$this->is_trash && $post->post_status == 'trash' )183 continue;184 185 $alt = ( 'alternate' == $alt ) ? '' : 'alternate';186 $post_owner = ( get_current_user_id() == $post->post_author ) ? 'self' : 'other';187 $att_title = _draft_or_post_title();188 ?>189 <tr id='post-<?php echo $id; ?>' class='<?php echo trim( $alt . ' author-' . $post_owner . ' status-' . $post->post_status ); ?>' valign="top">190 <?php191 192 list( $columns, $hidden ) = $this->get_column_info();193 foreach ( $columns as $column_name => $column_display_name ) {194 $class = "class='$column_name column-$column_name'";195 196 $style = '';197 if ( in_array( $column_name, $hidden ) )198 $style = ' style="display:none;"';199 200 $attributes = $class . $style;201 202 switch ( $column_name ) {203 204 case 'cb':205 ?>206 <th scope="row" class="check-column"><?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?><input type="checkbox" name="media[]" value="<?php the_ID(); ?>" /><?php } ?></th>207 <?php208 break;209 210 case 'icon':211 $attributes = 'class="column-icon media-icon"' . $style;212 ?>213 <td <?php echo $attributes ?>><?php214 if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {215 if ( $this->is_trash ) {216 echo $thumb;217 } else {218 ?>219 <a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>">220 <?php echo $thumb; ?>221 </a>222 223 <?php }224 }225 ?>226 </td>227 <?php228 break;229 230 case 'title':231 ?>232 <td <?php echo $attributes ?>><strong><?php if ( $this->is_trash ) echo $att_title; else { ?><a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php echo $att_title; ?></a><?php } ?></strong>233 <p>234 <?php235 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )236 echo esc_html( strtoupper( $matches[1] ) );237 else238 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );239 ?>240 </p>241 <?php242 $actions = array();243 if ( current_user_can( 'edit_post', $post->ID ) && !$this->is_trash )244 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';245 if ( current_user_can( 'delete_post', $post->ID ) ) {246 if ( $this->is_trash )247 $actions['untrash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=untrash&post=$post->ID", 'untrash-attachment_' . $post->ID ) . "'>" . __( 'Restore' ) . "</a>";248 elseif ( EMPTY_TRASH_DAYS && MEDIA_TRASH )249 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";250 if ( $this->is_trash || !EMPTY_TRASH_DAYS || !MEDIA_TRASH ) {251 $delete_ays = ( !$this->is_trash && !MEDIA_TRASH ) ? " onclick='return showNotice.warn();'" : '';252 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";253 }254 }255 if ( !$this->is_trash ) {256 $title =_draft_or_post_title( $post->post_parent );257 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';258 }259 $actions = apply_filters( 'media_row_actions', $actions, $post );260 echo $this->row_actions( $actions );261 ?>262 </td>263 <?php264 break;265 266 case 'author':267 ?>268 <td <?php echo $attributes ?>><?php the_author() ?></td>269 <?php270 break;271 272 case 'tags':273 ?>274 <td <?php echo $attributes ?>><?php275 $tags = get_the_tags();276 if ( !empty( $tags ) ) {277 $out = array();278 foreach ( $tags as $c )279 $out[] = "<a href='edit.php?tag=$c->slug'> " . esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'post_tag', 'display' ) ) . "</a>";280 echo join( ', ', $out );281 } else {282 _e( 'No Tags' );283 }284 ?>285 </td>286 <?php287 break;288 289 case 'desc':290 ?>291 <td <?php echo $attributes ?>><?php echo has_excerpt() ? $post->post_excerpt : ''; ?></td>292 <?php293 break;294 295 case 'date':296 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {297 $t_time = $h_time = __( 'Unpublished' );298 } else {299 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );300 $m_time = $post->post_date;301 $time = get_post_time( 'G', true, $post, false );302 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {303 if ( $t_diff < 0 )304 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );305 else306 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );307 } else {308 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );309 }310 }311 ?>312 <td <?php echo $attributes ?>><?php echo $h_time ?></td>313 <?php314 break;315 316 case 'parent':317 if ( $post->post_parent > 0 ) {318 if ( get_post( $post->post_parent ) ) {319 $title =_draft_or_post_title( $post->post_parent );320 }321 ?>322 <td <?php echo $attributes ?>>323 <strong><a href="<?php echo get_edit_post_link( $post->post_parent ); ?>"><?php echo $title ?></a></strong>,324 <?php echo get_the_time( __( 'Y/m/d' ) ); ?>325 </td>326 <?php327 } else {328 ?>329 <td <?php echo $attributes ?>><?php _e( '(Unattached)' ); ?><br />330 <a class="hide-if-no-js" onclick="findPosts.open( 'media[]','<?php echo $post->ID ?>' );return false;" href="#the-list"><?php _e( 'Attach' ); ?></a></td>331 <?php332 }333 break;334 335 case 'comments':336 $attributes = 'class="comments column-comments num"' . $style;337 ?>338 <td <?php echo $attributes ?>>339 <div class="post-com-count-wrapper">340 <?php341 $pending_comments = get_pending_comments_num( $post->ID );342 343 $this->comments_bubble( $post->ID, $pending_comments );344 ?>345 </div>346 </td>347 <?php348 break;349 350 case 'actions':351 ?>352 <td <?php echo $attributes ?>>353 <a href="media.php?action=edit&attachment_id=<?php the_ID(); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php _e( 'Edit' ); ?></a> |354 <a href="<?php the_permalink(); ?>"><?php _e( 'Get permalink' ); ?></a>355 </td>356 <?php357 break;358 359 default:360 ?>361 <td <?php echo $attributes ?>>362 <?php do_action( 'manage_media_custom_column', $column_name, $id ); ?>363 </td>364 <?php365 break;366 }367 }368 ?>369 </tr>370 <?php endwhile;371 }372 373 function display_orphans() {374 global $post;375 376 $class = '';377 378 while ( have_posts() ) : the_post();379 380 $class = ( 'alternate' == $class ) ? '' : 'alternate';381 $att_title = esc_html( _draft_or_post_title( $post->ID ) );382 383 $edit_link = '<a href="' . get_edit_post_link( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ) . '">%s</a>';384 ?>385 <tr id='post-<?php echo $post->ID; ?>' class='<?php echo $class; ?>' valign="top">386 <th scope="row" class="check-column">387 <?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?>388 <input type="checkbox" name="media[]" value="<?php echo esc_attr( $post->ID ); ?>" />389 <?php } ?>390 </th>391 392 <td class="media-icon">393 <?php if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {394 printf( $edit_link, $thumb );395 } ?>396 </td>397 398 <td class="media column-media">399 <strong><?php printf( $edit_link, $att_title ); ?></strong><br />400 <?php401 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )402 echo esc_html( strtoupper( $matches[1] ) );403 else404 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );405 ?>406 <?php407 $actions = array();408 if ( current_user_can( 'edit_post', $post->ID ) )409 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';410 if ( current_user_can( 'delete_post', $post->ID ) )411 if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) {412 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";413 } else {414 $delete_ays = !MEDIA_TRASH ? " onclick='return showNotice.warn();'" : '';415 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";416 }417 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $att_title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';418 if ( current_user_can( 'edit_post', $post->ID ) )419 $actions['attach'] = '<a href="#the-list" onclick="findPosts.open( \'media[]\',\''.$post->ID.'\' );return false;" class="hide-if-no-js">'.__( 'Attach' ).'</a>';420 $actions = apply_filters( 'media_row_actions', $actions, $post );421 422 echo $this->row_actions( $actions );423 ?>424 </td>425 <td class="author column-author">426 <?php $author = get_userdata( $post->post_author ); echo $author->display_name; ?>427 </td>428 <?php429 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {430 $t_time = $h_time = __( 'Unpublished' );431 } else {432 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );433 $m_time = $post->post_date;434 $time = get_post_time( 'G', true );435 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {436 if ( $t_diff < 0 )437 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );438 else439 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );440 } else {441 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );442 }443 }444 ?>445 <td class="date column-date"><?php echo $h_time ?></td>446 </tr>447 <?php448 endwhile;449 }450 }451 452 class WP_Terms_Table extends WP_List_Table {453 454 var $callback_args;455 456 function WP_Terms_Table() {457 global $post_type, $taxonomy, $tax, $current_screen;458 459 wp_reset_vars( array( 'action', 'taxonomy', 'post_type' ) );460 461 if ( empty( $taxonomy ) )462 $taxonomy = 'post_tag';463 464 if ( !taxonomy_exists( $taxonomy ) )465 wp_die( __( 'Invalid taxonomy' ) );466 467 $tax = get_taxonomy( $taxonomy );468 469 if ( empty( $post_type ) || !in_array( $post_type, get_post_types( array( 'public' => true ) ) ) )470 $post_type = 'post';471 472 if ( !isset( $current_screen ) )473 set_current_screen( 'edit-' . $taxonomy );474 475 parent::WP_List_Table( array(476 'screen' => $current_screen,477 'plural' => 'tags',478 'singular' => 'tag',479 ) );480 }481 482 function check_permissions( $type = 'manage' ) {483 global $tax;484 485 $cap = 'manage' == $type ? $tax->cap->manage_terms : $tax->cap->edit_terms;486 487 if ( !current_user_can( $tax->cap->manage_terms ) )488 wp_die( __( 'Cheatin’ uh?' ) );489 }490 491 function prepare_items() {492 global $taxonomy;493 494 $tags_per_page = $this->get_items_per_page( 'edit_' . $taxonomy . '_per_page' );495 496 if ( 'post_tag' == $taxonomy ) {497 $tags_per_page = apply_filters( 'edit_tags_per_page', $tags_per_page );498 $tags_per_page = apply_filters( 'tagsperpage', $tags_per_page ); // Old filter499 } elseif ( 'category' == $taxonomy ) {500 $tags_per_page = apply_filters( 'edit_categories_per_page', $tags_per_page ); // Old filter501 }502 503 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';504 505 $args = array(506 'search' => $search,507 'page' => $this->get_pagenum(),508 'number' => $tags_per_page,509 );510 511 if ( !empty( $_REQUEST['orderby'] ) )512 $args['orderby'] = trim( stripslashes( $_REQUEST['orderby'] ) );513 514 if ( !empty( $_REQUEST['order'] ) )515 $args['order'] = trim( stripslashes( $_REQUEST['order'] ) );516 517 $this->callback_args = $args;518 519 $this->set_pagination_args( array(520 'total_items' => wp_count_terms( $taxonomy, compact( 'search' ) ),521 'per_page' => $tags_per_page,522 ) );523 }524 525 function get_bulk_actions() {526 $actions = array();527 $actions['delete'] = __( 'Delete' );528 529 return $actions;530 }531 532 function current_action() {533 if ( isset( $_REQUEST['action'] ) && isset( $_REQUEST['delete_tags'] ) && ( 'delete' == $_REQUEST['action'] || 'delete' == $_REQUEST['action2'] ) )534 return 'bulk-delete';535 536 return parent::current_action();537 }538 539 function get_columns() {540 global $taxonomy;541 542 $columns = array(543 'cb' => '<input type="checkbox" />',544 'name' => __( 'Name' ),545 'description' => __( 'Description' ),546 'slug' => __( 'Slug' ),547 );548 549 if ( 'link_category' == $taxonomy )550 $columns['links'] = __( 'Links' );551 else552 $columns['posts'] = __( 'Posts' );553 554 return $columns;555 }556 557 function get_sortable_columns() {558 return array(559 'name' => 'name',560 'description' => 'description',561 'slug' => 'slug',562 'posts' => 'count',563 'links' => 'count'564 );565 }566 567 function display_rows() {568 global $taxonomy;569 570 $args = wp_parse_args( $this->callback_args, array(571 'page' => 1,572 'number' => 20,573 'search' => '',574 'hide_empty' => 0575 ) );576 577 extract( $args, EXTR_SKIP );578 579 $args['offset'] = $offset = ( $page - 1 ) * $number;580 581 // convert it to table rows582 $out = '';583 $count = 0;584 if ( is_taxonomy_hierarchical( $taxonomy ) && !isset( $orderby ) ) {585 // We'll need the full set of terms then.586 $args['number'] = $args['offset'] = 0;587 588 $terms = get_terms( $taxonomy, $args );589 if ( !empty( $search ) ) // Ignore children on searches.590 $children = array();591 else592 $children = _get_term_hierarchy( $taxonomy );593 594 // Some funky recursion to get the job done( Paging & parents mainly ) is contained within, Skip it for non-hierarchical taxonomies for performance sake595 $out .= $this->_rows( $taxonomy, $terms, $children, $offset, $number, $count );596 } else {597 $terms = get_terms( $taxonomy, $args );598 foreach ( $terms as $term )599 $out .= $this->single_row( $term, 0, $taxonomy );600 $count = $number; // Only displaying a single page.601 }602 603 echo $out;604 }605 606 function _rows( $taxonomy, $terms, &$children, $start = 0, $per_page = 20, &$count, $parent = 0, $level = 0 ) {607 608 $end = $start + $per_page;609 610 $output = '';611 foreach ( $terms as $key => $term ) {612 613 if ( $count >= $end )614 break;615 616 if ( $term->parent != $parent && empty( $_REQUEST['s'] ) )617 continue;618 619 // If the page starts in a subtree, print the parents.620 if ( $count == $start && $term->parent > 0 && empty( $_REQUEST['s'] ) ) {621 $my_parents = $parent_ids = array();622 $p = $term->parent;623 while ( $p ) {624 $my_parent = get_term( $p, $taxonomy );625 $my_parents[] = $my_parent;626 $p = $my_parent->parent;627 if ( in_array( $p, $parent_ids ) ) // Prevent parent loops.628 break;629 $parent_ids[] = $p;630 }631 unset( $parent_ids );632 633 $num_parents = count( $my_parents );634 while ( $my_parent = array_pop( $my_parents ) ) {635 $output .= "\t" . $this->single_row( $my_parent, $level - $num_parents, $taxonomy );636 $num_parents--;637 }638 }639 640 if ( $count >= $start )641 $output .= "\t" . $this->single_row( $term, $level, $taxonomy );642 643 ++$count;644 645 unset( $terms[$key] );646 647 if ( isset( $children[$term->term_id] ) && empty( $_REQUEST['s'] ) )648 $output .= $this->_rows( $taxonomy, $terms, $children, $start, $per_page, $count, $term->term_id, $level + 1 );649 }650 651 return $output;652 }653 654 function single_row( $tag, $level = 0 ) {655 static $row_class = '';656 $row_class = ( $row_class == '' ? ' class="alternate"' : '' );657 658 $this->level = $level;659 660 echo '<tr id="tag-' . $tag->term_id . '"' . $row_class . '>';661 echo $this->single_row_columns( $tag );662 echo '</tr>';663 }664 665 function column_cb( $tag ) {666 global $taxonomy, $tax;667 668 $default_term = get_option( 'default_' . $taxonomy );669 670 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )671 return '<input type="checkbox" name="delete_tags[]" value="' . $tag->term_id . '" />';672 else673 return ' ';674 }675 676 function column_name( $tag ) {677 global $taxonomy, $tax, $post_type;678 679 $default_term = get_option( 'default_' . $taxonomy );680 681 $pad = str_repeat( '— ', max( 0, $this->level ) );682 $name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag );683 $qe_data = get_term( $tag->term_id, $taxonomy, OBJECT, 'edit' );684 $edit_link = get_edit_term_link( $tag->term_id, $taxonomy, $post_type );685 686 $out = '<strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $name ) ) . '">' . $name . '</a></strong><br />';687 688 $actions = array();689 if ( current_user_can( $tax->cap->edit_terms ) ) {690 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';691 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __( 'Quick Edit' ) . '</a>';692 }693 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )694 $actions['delete'] = "<a class='delete-tag' href='" . wp_nonce_url( "edit-tags.php?action=delete&taxonomy=$taxonomy&tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id ) . "'>" . __( 'Delete' ) . "</a>";695 696 $actions = apply_filters( 'tag_row_actions', $actions, $tag );697 $actions = apply_filters( "${taxonomy}_row_actions", $actions, $tag );698 699 $out .= $this->row_actions( $actions );700 $out .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';701 $out .= '<div class="name">' . $qe_data->name . '</div>';702 $out .= '<div class="slug">' . apply_filters( 'editable_slug', $qe_data->slug ) . '</div>';703 $out .= '<div class="parent">' . $qe_data->parent . '</div></div></td>';704 705 return $out;706 }707 708 function column_description( $tag ) {709 return $tag->description;710 }711 712 function column_slug( $tag ) {713 return apply_filters( 'editable_slug', $tag->slug );714 }715 716 function column_posts( $tag ) {717 global $taxonomy, $post_type;718 719 $count = number_format_i18n( $tag->count );720 721 if ( 'post_tag' == $taxonomy ) {722 $tagsel = 'tag';723 } elseif ( 'category' == $taxonomy ) {724 $tagsel = 'category_name';725 } elseif ( ! empty( $tax->query_var ) ) {726 $tagsel = $tax->query_var;727 } else {728 $tagsel = $taxonomy;729 }730 731 return "<a href='edit.php?$tagsel=$tag->slug&post_type=$post_type'>$count</a>";732 }733 734 function column_links( $tag ) {735 $count = number_format_i18n( $tag->count );736 return $count;737 }738 739 function column_default( $tag, $column_name ) {740 global $taxonomy;741 742 return apply_filters( "manage_${taxonomy}_custom_column", '', $column_name, $tag->term_id );743 $out .= "</td>";744 }745 746 /**747 * Outputs the hidden row displayed when inline editing748 *749 * @since 3.1.0750 */751 function inline_edit() {752 global $tax;753 754 if ( ! current_user_can( $tax->cap->edit_terms ) )755 return;756 757 list( $columns, $hidden ) = $this->get_column_info();758 759 $col_count = count( $columns ) - count( $hidden );760 ?>761 762 <form method="get" action=""><table style="display: none"><tbody id="inlineedit">763 <tr id="inline-edit" class="inline-edit-row" style="display: none"><td colspan="<?php echo $col_count; ?>">764 765 <fieldset><div class="inline-edit-col">766 <h4><?php _e( 'Quick Edit' ); ?></h4>767 768 <label>769 <span class="title"><?php _e( 'Name' ); ?></span>770 <span class="input-text-wrap"><input type="text" name="name" class="ptitle" value="" /></span>771 </label>772 <?php if ( !global_terms_enabled() ) { ?>773 <label>774 <span class="title"><?php _e( 'Slug' ); ?></span>775 <span class="input-text-wrap"><input type="text" name="slug" class="ptitle" value="" /></span>776 </label>777 <?php } ?>778 779 </div></fieldset>780 <?php781 782 $core_columns = array( 'cb' => true, 'description' => true, 'name' => true, 'slug' => true, 'posts' => true );783 784 foreach ( $columns as $column_name => $column_display_name ) {785 if ( isset( $core_columns[$column_name] ) )786 continue;787 do_action( 'quick_edit_custom_box', $column_name, $type, $tax->taxonomy );788 }789 790 ?>791 792 <p class="inline-edit-save submit">793 <a accesskey="c" href="#inline-edit" title="<?php _e( 'Cancel' ); ?>" class="cancel button-secondary alignleft"><?php _e( 'Cancel' ); ?></a>794 <?php $update_text = $tax->labels->update_item; ?>795 <a accesskey="s" href="#inline-edit" title="<?php echo esc_attr( $update_text ); ?>" class="save button-primary alignright"><?php echo $update_text; ?></a>796 <img class="waiting" style="display:none;" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" />797 <span class="error" style="display:none;"></span>798 <?php wp_nonce_field( 'taxinlineeditnonce', '_inline_edit', false ); ?>799 <input type="hidden" name="taxonomy" value="<?php echo esc_attr( $tax->name ); ?>" />800 <br class="clear" />801 </p>802 </td></tr>803 </tbody></table></form>804 <?php805 }806 }807 808 class WP_Users_Table extends WP_List_Table {809 810 function WP_Users_Table() {811 parent::WP_List_Table( array(812 'screen' => 'users',813 'plural' => 'users'814 ) );815 }816 817 function check_permissions() {818 if ( !current_user_can('list_users') )819 wp_die(__('Cheatin’ uh?'));820 }821 822 function prepare_items() {823 global $role, $usersearch;824 825 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';826 827 $role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : '';828 829 $users_per_page = $this->get_items_per_page( 'users_per_page' );830 831 $paged = $this->get_pagenum();832 833 $args = array(834 'number' => $users_per_page,835 'offset' => ( $paged-1 ) * $users_per_page,836 'role' => $role,837 'search' => $usersearch838 );839 840 if ( isset( $_REQUEST['orderby'] ) )841 $args['orderby'] = $_REQUEST['orderby'];842 843 if ( isset( $_REQUEST['order'] ) )844 $args['order'] = $_REQUEST['order'];845 846 // Query the user IDs for this page847 $wp_user_search = new WP_User_Query( $args );848 849 $this->items = $wp_user_search->get_results();850 851 $this->set_pagination_args( array(852 'total_items' => $wp_user_search->get_total(),853 'per_page' => $users_per_page,854 ) );855 }856 857 function no_items() {858 _e( 'No matching users were found.' );859 }860 861 function get_views() {862 global $wp_roles, $role;863 864 $users_of_blog = count_users();865 $total_users = $users_of_blog['total_users'];866 $avail_roles =& $users_of_blog['avail_roles'];867 unset($users_of_blog);868 869 $current_role = false;870 $class = empty($role) ? ' class="current"' : '';871 $role_links = array();872 $role_links['all'] = "<li><a href='users.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>';873 foreach ( $wp_roles->get_names() as $this_role => $name ) {874 if ( !isset($avail_roles[$this_role]) )875 continue;876 877 $class = '';878 879 if ( $this_role == $role ) {880 $current_role = $role;881 $class = ' class="current"';882 }883 884 $name = translate_user_role( $name );885 /* translators: User role name with count */886 $name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, $avail_roles[$this_role] );887 $role_links[$this_role] = "<li><a href='users.php?role=$this_role'$class>$name</a>";888 }889 890 return $role_links;891 }892 893 function get_bulk_actions() {894 $actions = array();895 896 if ( !is_multisite() && current_user_can( 'delete_users' ) )897 $actions['delete'] = __( 'Delete' );898 else899 $actions['remove'] = __( 'Remove' );900 901 return $actions;902 }903 904 function extra_tablenav( $which ) {905 if ( 'top' != $which )906 return;907 ?>908 <div class="alignleft actions">909 <label class="screen-reader-text" for="new_role"><?php _e( 'Change role to…' ) ?></label>910 <select name="new_role" id="new_role">911 <option value=''><?php _e( 'Change role to…' ) ?></option>912 <?php wp_dropdown_roles(); ?>913 </select>914 <input type="submit" value="<?php esc_attr_e( 'Change' ); ?>" name="changeit" class="button-secondary" />915 </div>916 <?php917 }918 919 function current_action() {920 if ( isset($_REQUEST['changeit']) && !empty($_REQUEST['new_role']) )921 return 'promote';922 923 return parent::current_action();924 }925 926 function get_columns() {927 return array(928 'cb' => '<input type="checkbox" />',929 'username' => __( 'Login' ),930 'name' => __( 'Name' ),931 'email' => __( 'E-mail' ),932 'role' => __( 'Role' ),933 'posts' => __( 'Posts' )934 );935 }936 937 function get_sortable_columns() {938 return array(939 'username' => 'login',940 'name' => 'name',941 'email' => 'email',942 'posts' => 'post_count',943 );944 }945 946 function display_rows() {947 // Query the post counts for this page948 $post_counts = count_many_users_posts( array_keys( $this->items ) );949 950 $style = '';951 foreach ( $this->items as $userid => $user_object ) {952 $role = reset( $user_object->roles );953 954 if ( is_multisite() && empty( $role ) )955 continue;956 957 $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"';958 echo "\n\t", $this->single_row( $user_object, $style, $role, $post_counts[ $userid ] );959 }960 }961 962 /**963 * Generate HTML for a single row on the users.php admin panel.964 *965 * @since 2.1.0966 *967 * @param object $user_object968 * @param string $style Optional. Attributes added to the TR element. Must be sanitized.969 * @param string $role Key for the $wp_roles array.970 * @param int $numposts Optional. Post count to display for this user. Defaults to zero, as in, a new user has made zero posts.971 * @return string972 */973 function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) {974 global $wp_roles;975 976 if ( !( is_object( $user_object ) && is_a( $user_object, 'WP_User' ) ) )977 $user_object = new WP_User( (int) $user_object );978 $user_object = sanitize_user_object( $user_object, 'display' );979 $email = $user_object->user_email;980 $url = $user_object->user_url;981 $short_url = str_replace( 'http://', '', $url );982 $short_url = str_replace( 'www.', '', $short_url );983 if ( '/' == substr( $short_url, -1 ) )984 $short_url = substr( $short_url, 0, -1 );985 if ( strlen( $short_url ) > 35 )986 $short_url = substr( $short_url, 0, 32 ).'...';987 $checkbox = '';988 // Check if the user for this row is editable989 if ( current_user_can( 'list_users' ) ) {990 // Set up the user editing link991 // TODO: make profile/user-edit determination a separate function992 if ( get_current_user_id() == $user_object->ID ) {993 $edit_link = 'profile.php';994 } else {995 $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( esc_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" ) );996 }997 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";998 999 // Set up the hover actions for this user1000 $actions = array();1001 1002 if ( current_user_can( 'edit_user', $user_object->ID ) ) {1003 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";1004 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';1005 } else {1006 $edit = "<strong>$user_object->user_login</strong><br />";1007 }1008 1009 if ( !is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) )1010 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=delete&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Delete' ) . "</a>";1011 if ( is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'remove_user', $user_object->ID ) )1012 $actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=remove&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . "</a>";1013 $actions = apply_filters( 'user_row_actions', $actions, $user_object );1014 $edit .= $this->row_actions( $actions );1015 1016 // Set up the checkbox ( because the user is editable, otherwise its empty )1017 $checkbox = "<input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='$role' value='{$user_object->ID}' />";1018 1019 } else {1020 $edit = '<strong>' . $user_object->user_login . '</strong>';1021 }1022 $role_name = isset( $wp_roles->role_names[$role] ) ? translate_user_role( $wp_roles->role_names[$role] ) : __( 'None' );1023 $r = "<tr id='user-$user_object->ID'$style>";1024 $avatar = get_avatar( $user_object->ID, 32 );1025 1026 list( $columns, $hidden ) = $this->get_column_info();1027 1028 foreach ( $columns as $column_name => $column_display_name ) {1029 $class = "class=\"$column_name column-$column_name\"";1030 1031 $style = '';1032 if ( in_array( $column_name, $hidden ) )1033 $style = ' style="display:none;"';1034 1035 $attributes = "$class$style";1036 1037 switch ( $column_name ) {1038 case 'cb':1039 $r .= "<th scope='row' class='check-column'>$checkbox</th>";1040 break;1041 case 'username':1042 $r .= "<td $attributes>$avatar $edit</td>";1043 break;1044 case 'name':1045 $r .= "<td $attributes>$user_object->first_name $user_object->last_name</td>";1046 break;1047 case 'email':1048 $r .= "<td $attributes><a href='mailto:$email' title='" . sprintf( __( 'E-mail: %s' ), $email ) . "'>$email</a></td>";1049 break;1050 case 'role':1051 $r .= "<td $attributes>$role_name</td>";1052 break;1053 case 'posts':1054 $attributes = 'class="posts column-posts num"' . $style;1055 $r .= "<td $attributes>";1056 if ( $numposts > 0 ) {1057 $r .= "<a href='edit.php?author=$user_object->ID' title='" . __( 'View posts by this author' ) . "' class='edit'>";1058 $r .= $numposts;1059 $r .= '</a>';1060 } else {1061 $r .= 0;1062 }1063 $r .= "</td>";1064 break;1065 default:1066 $r .= "<td $attributes>";1067 $r .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID );1068 $r .= "</td>";1069 }1070 }1071 $r .= '</tr>';1072 1073 return $r;1074 }1075 }1076 1077 class WP_Comments_Table extends WP_List_Table {1078 1079 var $checkbox = true;1080 var $from_ajax = false;1081 1082 var $pending_count = array();1083 1084 function WP_Comments_Table() {1085 global $mode;1086 1087 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'detail' : $_REQUEST['mode'];1088 1089 if ( get_option('show_avatars') && 'single' != $mode )1090 add_filter( 'comment_author', 'floated_admin_avatar' );1091 1092 parent::WP_List_Table( array(1093 'screen' => 'edit-comments',1094 'plural' => 'comments'1095 ) );1096 }1097 1098 function check_permissions() {1099 if ( !current_user_can('edit_posts') )1100 wp_die(__('Cheatin’ uh?'));1101 }1102 1103 function prepare_items() {1104 global $post_id, $comment_status, $search;1105 1106 if ( isset( $_REQUEST['p'] ) )1107 $post_id = absint( $_REQUEST['p'] );1108 elseif ( isset( $_REQUEST['post'] ) )1109 $post_id = absint( $_REQUEST['post'] );1110 elseif ( isset( $_REQUEST['post_ID'] ) )1111 $post_id = absint( $_REQUEST['post_ID'] );1112 else1113 $post_id = 0;1114 1115 $comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all';1116 if ( !in_array( $comment_status, array( 'all', 'moderated', 'approved', 'spam', 'trash' ) ) )1117 $comment_status = 'all';1118 1119 $comment_type = !empty( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : '';1120 1121 $search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : '';1122 1123 $user_id = ( isset( $_REQUEST['user_id'] ) ) ? $_REQUEST['user_id'] : '';1124 1125 $comments_per_page = $this->get_items_per_page( 'edit_comments_per_page' );1126 $comments_per_page = apply_filters( 'comments_per_page', $comments_per_page, $comment_status );1127 1128 if ( isset( $_POST['number'] ) )1129 $number = (int) $_POST['number'];1130 else1131 $number = $comments_per_page + min( 8, $comments_per_page ); // Grab a few extra1132 1133 $page = $this->get_pagenum();1134 1135 $start = $offset = ( $page - 1 ) * $comments_per_page;1136 1137 $status_map = array(1138 'moderated' => 'hold',1139 'approved' => 'approve'1140 );1141 1142 $args = array(1143 'status' => isset( $status_map[$comment_status] ) ? $status_map[$comment_status] : $comment_status,1144 'search' => $search,1145 'user_id' => $user_id,1146 'offset' => $start,1147 'number' => $number,1148 'post_id' => $post_id,1149 'type' => $comment_type,1150 'orderby' => @$_REQUEST['orderby'],1151 'order' => @$_REQUEST['order'],1152 );1153 1154 $_comments = get_comments( $args );1155 1156 update_comment_cache( $_comments );1157 1158 $this->items = array_slice( $_comments, 0, $comments_per_page );1159 $this->extra_items = array_slice( $_comments, $comments_per_page );1160 1161 $total_comments = get_comments( array_merge( $args, array('count' => true, 'offset' => 0, 'number' => 0) ) );1162 1163 $_comment_post_ids = array();1164 foreach ( $_comments as $_c ) {1165 $_comment_post_ids[] = $_c->comment_post_ID;1166 }1167 1168 $this->pending_count = get_pending_comments_num( $_comment_post_ids );1169 1170 $this->set_pagination_args( array(1171 'total_items' => $total_comments,1172 'per_page' => $comments_per_page,1173 ) );1174 }1175 1176 function get_views() {1177 global $post_id, $comment_status;1178 1179 $status_links = array();1180 $num_comments = ( $post_id ) ? wp_count_comments( $post_id ) : wp_count_comments();1181 //, number_format_i18n($num_comments->moderated) ), "<span class='comment-count'>" . number_format_i18n($num_comments->moderated) . "</span>"),1182 //, number_format_i18n($num_comments->spam) ), "<span class='spam-comment-count'>" . number_format_i18n($num_comments->spam) . "</span>")1183 $stati = array(1184 'all' => _nx_noop('All', 'All', 'comments'), // singular not used1185 'moderated' => _n_noop('Pending <span class="count">(<span class="pending-count">%s</span>)</span>', 'Pending <span class="count">(<span class="pending-count">%s</span>)</span>'),1186 'approved' => _n_noop('Approved', 'Approved'), // singular not used1187 'spam' => _n_noop('Spam <span class="count">(<span class="spam-count">%s</span>)</span>', 'Spam <span class="count">(<span class="spam-count">%s</span>)</span>'),1188 'trash' => _n_noop('Trash <span class="count">(<span class="trash-count">%s</span>)</span>', 'Trash <span class="count">(<span class="trash-count">%s</span>)</span>')1189 );1190 1191 if ( !EMPTY_TRASH_DAYS )1192 unset($stati['trash']);1193 1194 $link = 'edit-comments.php';1195 if ( !empty($comment_type) && 'all' != $comment_type )1196 $link = add_query_arg( 'comment_type', $comment_type, $link );1197 1198 foreach ( $stati as $status => $label ) {1199 $class = ( $status == $comment_status ) ? ' class="current"' : '';1200 1201 if ( !isset( $num_comments->$status ) )1202 $num_comments->$status = 10;1203 $link = add_query_arg( 'comment_status', $status, $link );1204 if ( $post_id )1205 $link = add_query_arg( 'p', absint( $post_id ), $link );1206 /*1207 // I toyed with this, but decided against it. Leaving it in here in case anyone thinks it is a good idea. ~ Mark1208 if ( !empty( $_REQUEST['s'] ) )1209 $link = add_query_arg( 's', esc_attr( stripslashes( $_REQUEST['s'] ) ), $link );1210 */1211 $status_links[$status] = "<li class='$status'><a href='$link'$class>" . sprintf(1212 _n( $label[0], $label[1], $num_comments->$status ),1213 number_format_i18n( $num_comments->$status )1214 ) . '</a>';1215 }1216 1217 $status_links = apply_filters( 'comment_status_links', $status_links );1218 return $status_links;1219 }1220 1221 function get_bulk_actions() {1222 global $comment_status;1223 1224 $actions = array();1225 if ( in_array( $comment_status, array( 'all', 'approved' ) ) )1226 $actions['unapprove'] = __( 'Unapprove' );1227 if ( in_array( $comment_status, array( 'all', 'moderated', 'spam' ) ) )1228 $actions['approve'] = __( 'Approve' );1229 if ( in_array( $comment_status, array( 'all', 'moderated', 'approved' ) ) )1230 $actions['spam'] = _x( 'Mark as Spam', 'comment' );1231 1232 if ( 'trash' == $comment_status )1233 $actions['untrash'] = __( 'Restore' );1234 elseif ( 'spam' == $comment_status )1235 $actions['unspam'] = _x( 'Not Spam', 'comment' );1236 1237 if ( in_array( $comment_status, array( 'trash', 'spam' ) ) || !EMPTY_TRASH_DAYS )1238 $actions['delete'] = __( 'Delete Permanently' );1239 else1240 $actions['trash'] = __( 'Move to Trash' );1241 1242 return $actions;1243 }1244 1245 function extra_tablenav( $which ) {1246 global $comment_status, $comment_type;1247 ?>1248 <div class="alignleft actions">1249 <?php1250 if ( 'top' == $which ) {1251 ?>1252 <select name="comment_type">1253 <option value=""><?php _e( 'Show all comment types' ); ?></option>1254 <?php1255 $comment_types = apply_filters( 'admin_comment_types_dropdown', array(1256 'comment' => __( 'Comments' ),1257 'pings' => __( 'Pings' ),1258 ) );1259 1260 foreach ( $comment_types as $type => $label )1261 echo "\t<option value='" . esc_attr( $type ) . "'" . selected( $comment_type, $type, false ) . ">$label</option>\n";1262 ?>1263 </select>1264 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />1265 <?php1266 }1267 1268 if ( ( 'spam' == $comment_status || 'trash' == $comment_status ) && current_user_can( 'moderate_comments' ) ) {1269 wp_nonce_field( 'bulk-destroy', '_destroy_nonce' );1270 $title = ( 'spam' == $comment_status ) ? esc_attr__( 'Empty Spam' ) : esc_attr__( 'Empty Trash' );1271 ?>1272 <input type="submit" name="delete_all" id="delete_all" value="<?php echo $title ?>" class="button-secondary apply" />1273 <?php1274 }1275 ?>1276 <?php1277 do_action( 'manage_comments_nav', $comment_status );1278 echo '</div>';1279 }1280 1281 function current_action() {1282 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )1283 return 'delete_all';1284 1285 return parent::current_action();1286 }1287 1288 function get_columns() {1289 global $mode;1290 1291 $columns = array();1292 1293 if ( $this->checkbox )1294 $columns['cb'] = '<input type="checkbox" />';1295 1296 $columns['author'] = __( 'Author' );1297 $columns['comment'] = _x( 'Comment', 'column name' );1298 1299 if ( 'single' !== $mode )1300 $columns['response'] = _x( 'Comment', 'column name' );1301 1302 return $columns;1303 }1304 1305 function get_sortable_columns() {1306 return array(1307 'author' => 'comment_author',1308 'comment' => 'comment_content',1309 'response' => 'comment_post_ID'1310 );1311 }1312 1313 function display_table() {1314 extract( $this->_args );1315 1316 $this->display_tablenav( 'top' );1317 1318 ?>1319 <table class="<?php echo implode( ' ', $this->get_table_classes() ); ?>" cellspacing="0">1320 <thead>1321 <tr>1322 <?php $this->print_column_headers(); ?>1323 </tr>1324 </thead>1325 1326 <tfoot>1327 <tr>1328 <?php $this->print_column_headers( false ); ?>1329 </tr>1330 </tfoot>1331 1332 <tbody id="the-comment-list" class="list:comment">1333 <?php $this->display_rows(); ?>1334 </tbody>1335 1336 <tbody id="the-extra-comment-list" class="list:comment" style="display: none;">1337 <?php $this->items = $this->extra_items; $this->display_rows(); ?>1338 </tbody>1339 </table>1340 <?php1341 1342 $this->display_tablenav( 'bottom' );1343 }1344 1345 function single_row( $a_comment ) {1346 global $post, $comment, $the_comment_status;1347 1348 $comment = $a_comment;1349 $the_comment_status = wp_get_comment_status( $comment->comment_ID );1350 1351 $post = get_post( $comment->comment_post_ID );1352 1353 $this->user_can = current_user_can( 'edit_comment', $comment->comment_ID );1354 1355 echo "<tr id='comment-$comment->comment_ID' class='$the_comment_status'>";1356 echo $this->single_row_columns( $comment );1357 echo "</tr>\n";1358 }1359 1360 function column_cb( $comment ) {1361 if ( $this->user_can )1362 echo "<input type='checkbox' name='delete_comments[]' value='$comment->comment_ID' />";1363 }1364 1365 function column_comment( $comment ) {1366 global $post, $comment_status, $the_comment_status;1367 1368 $user_can = $this->user_can;1369 1370 $comment_url = esc_url( get_comment_link( $comment->comment_ID ) );1371 1372 $ptime = date( 'G', strtotime( $comment->comment_date ) );1373 if ( ( abs( time() - $ptime ) ) < 86400 )1374 $ptime = sprintf( __( '%s ago' ), human_time_diff( $ptime ) );1375 else1376 $ptime = mysql2date( __( 'Y/m/d \a\t g:i A' ), $comment->comment_date );1377 1378 if ( $user_can ) {1379 $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) );1380 $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) );1381 1382 $url = "comment.php?c=$comment->comment_ID";1383 1384 $approve_url = esc_url( $url . "&action=approvecomment&$approve_nonce" );1385 $unapprove_url = esc_url( $url . "&action=unapprovecomment&$approve_nonce" );1386 $spam_url = esc_url( $url . "&action=spamcomment&$del_nonce" );1387 $unspam_url = esc_url( $url . "&action=unspamcomment&$del_nonce" );1388 $trash_url = esc_url( $url . "&action=trashcomment&$del_nonce" );1389 $untrash_url = esc_url( $url . "&action=untrashcomment&$del_nonce" );1390 $delete_url = esc_url( $url . "&action=deletecomment&$del_nonce" );1391 }1392 1393 echo '<div id="submitted-on">';1394 /* translators: 2: comment date, 3: comment time */1395 printf( __( '<a href="%1$s">%2$s at %3$s</a>' ), $comment_url,1396 /* translators: comment date format. See http://php.net/date */ get_comment_date( __( 'Y/m/d' ) ),1397 /* translators: comment time format. See http://php.net/date */ get_comment_date( get_option( 'time_format' ) ) );1398 1399 if ( $comment->comment_parent ) {1400 $parent = get_comment( $comment->comment_parent );1401 $parent_link = esc_url( get_comment_link( $comment->comment_parent ) );1402 $name = get_comment_author( $parent->comment_ID );1403 printf( ' | '.__( 'In reply to <a href="%1$s">%2$s</a>.' ), $parent_link, $name );1404 }1405 1406 echo '</div>';1407 comment_text();1408 if ( $user_can ) { ?>1409 <div id="inline-<?php echo $comment->comment_ID; ?>" class="hidden">1410 <textarea class="comment" rows="1" cols="1"><?php echo esc_html( apply_filters( 'comment_edit_pre', $comment->comment_content ) ); ?></textarea>1411 <div class="author-email"><?php echo esc_attr( $comment->comment_author_email ); ?></div>1412 <div class="author"><?php echo esc_attr( $comment->comment_author ); ?></div>1413 <div class="author-url"><?php echo esc_attr( $comment->comment_author_url ); ?></div>1414 <div class="comment_status"><?php echo $comment->comment_approved; ?></div>1415 </div>1416 <?php1417 }1418 1419 if ( $user_can ) {1420 // preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash1421 $actions = array(1422 'approve' => '', 'unapprove' => '',1423 'reply' => '',1424 'quickedit' => '',1425 'edit' => '',1426 'spam' => '', 'unspam' => '',1427 'trash' => '', 'untrash' => '', 'delete' => ''1428 );1429 1430 if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments1431 if ( 'approved' == $the_comment_status )1432 $actions['unapprove'] = "<a href='$unapprove_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=unapproved vim-u vim-destructive' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';1433 else if ( 'unapproved' == $the_comment_status )1434 $actions['approve'] = "<a href='$approve_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=approved vim-a vim-destructive' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';1435 } else {1436 $actions['approve'] = "<a href='$approve_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved vim-a' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';1437 $actions['unapprove'] = "<a href='$unapprove_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved vim-u' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';1438 }1439 1440 if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) {1441 $actions['spam'] = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1 vim-s vim-destructive' title='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>';1442 } elseif ( 'spam' == $the_comment_status ) {1443 $actions['unspam'] = "<a href='$unspam_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:unspam=1 vim-z vim-destructive'>" . _x( 'Not Spam', 'comment' ) . '</a>';1444 } elseif ( 'trash' == $the_comment_status ) {1445 $actions['untrash'] = "<a href='$untrash_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:untrash=1 vim-z vim-destructive'>" . __( 'Restore' ) . '</a>';1446 }1447 1448 if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) {1449 $actions['delete'] = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID::delete=1 delete vim-d vim-destructive'>" . __( 'Delete Permanently' ) . '</a>';1450 } else {1451 $actions['trash'] = "<a href='$trash_url' class='delete:the-comment-list:comment-$comment->comment_ID::trash=1 delete vim-d vim-destructive' title='" . esc_attr__( 'Move this comment to the trash' ) . "'>" . _x( 'Trash', 'verb' ) . '</a>';1452 }1453 1454 if ( 'trash' != $the_comment_status ) {1455 $actions['edit'] = "<a href='comment.php?action=editcomment&c={$comment->comment_ID}' title='" . esc_attr__( 'Edit comment' ) . "'>". __( 'Edit' ) . '</a>';1456 $actions['quickedit'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\',\'edit\' );return false;" class="vim-q" title="'.esc_attr__( 'Quick Edit' ).'" href="#">' . __( 'Quick Edit' ) . '</a>';1457 if ( 'spam' != $the_comment_status )1458 $actions['reply'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\' );return false;" class="vim-r" title="'.esc_attr__( 'Reply to this comment' ).'" href="#">' . __( 'Reply' ) . '</a>';1459 }1460 1461 $actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment );1462 1463 $i = 0;1464 echo '<div class="row-actions">';1465 foreach ( $actions as $action => $link ) {1466 ++$i;1467 ( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';1468 1469 // Reply and quickedit need a hide-if-no-js span when not added with ajax1470 if ( ( 'reply' == $action || 'quickedit' == $action ) && ! $this->from_ajax )1471 $action .= ' hide-if-no-js';1472 elseif ( ( $action == 'untrash' && $the_comment_status == 'trash' ) || ( $action == 'unspam' && $the_comment_status == 'spam' ) ) {1473 if ( '1' == get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) )1474 $action .= ' approve';1475 else1476 $action .= ' unapprove';1477 }1478 1479 echo "<span class='$action'>$sep$link</span>";1480 }1481 echo '</div>';1482 }1483 }1484 1485 function column_author( $comment ) {1486 global $comment_status;1487 1488 $author_url = get_comment_author_url();1489 if ( 'http://' == $author_url )1490 $author_url = '';1491 $author_url_display = preg_replace( '|http://(www\.)?|i', '', $author_url );1492 if ( strlen( $author_url_display ) > 50 )1493 $author_url_display = substr( $author_url_display, 0, 49 ) . '...';1494 1495 echo "<strong>"; comment_author(); echo '</strong><br />';1496 if ( !empty( $author_url ) )1497 echo "<a title='$author_url' href='$author_url'>$author_url_display</a><br />";1498 1499 if ( $this->user_can ) {1500 if ( !empty( $comment->comment_author_email ) ) {1501 comment_author_email_link();1502 echo '<br />';1503 }1504 echo '<a href="edit-comments.php?s=';1505 comment_author_IP();1506 echo '&mode=detail';1507 if ( 'spam' == $comment_status )1508 echo '&comment_status=spam';1509 echo '">';1510 comment_author_IP();1511 echo '</a>';1512 }1513 }1514 1515 function column_date( $comment ) {1516 return get_comment_date( __( 'Y/m/d \a\t g:ia' ) );1517 }1518 1519 function column_response( $comment ) {1520 global $post;1521 1522 if ( isset( $this->pending_count[$post->ID] ) ) {1523 $pending_comments = $this->pending_count[$post->ID];1524 } else {1525 $_pending_count_temp = get_pending_comments_num( array( $post->ID ) );1526 $pending_comments = $this->pending_count[$post->ID] = $_pending_count_temp[$post->ID];1527 }1528 1529 if ( current_user_can( 'edit_post', $post->ID ) ) {1530 $post_link = "<a href='" . get_edit_post_link( $post->ID ) . "'>";1531 $post_link .= get_the_title( $post->ID ) . '</a>';1532 } else {1533 $post_link = get_the_title( $post->ID );1534 }1535 1536 echo '<div class="response-links"><span class="post-com-count-wrapper">';1537 echo $post_link . '<br />';1538 $this->comments_bubble( $post->ID, $pending_comments );1539 echo '</span> ';1540 echo "<a href='" . get_permalink( $post->ID ) . "'>#</a>";1541 echo '</div>';1542 if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) )1543 echo $thumb;1544 }1545 1546 function column_default( $comment, $column_name ) {1547 do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID );1548 }1549 }1550 1551 class WP_Post_Comments_Table extends WP_Comments_Table {1552 1553 function get_columns() {1554 return array(1555 'author' => __( 'Author' ),1556 'comment' => _x( 'Comment', 'column name' ),1557 );1558 }1559 1560 function get_sortable_columns() {1561 return array();1562 }1563 }1564 1565 class WP_Links_Table extends WP_List_Table {1566 1567 function WP_Links_Table() {1568 parent::WP_List_Table( array(1569 'screen' => 'link-manager',1570 'plural' => 'bookmarks',1571 ) );1572 }1573 1574 function check_permissions() {1575 if ( ! current_user_can( 'manage_links' ) )1576 wp_die( __( 'You do not have sufficient permissions to edit the links for this site.' ) );1577 }1578 1579 function prepare_items() {1580 global $cat_id, $s, $orderby, $order;1581 1582 wp_reset_vars( array( 'action', 'cat_id', 'linkurl', 'name', 'image', 'description', 'visible', 'target', 'category', 'link_id', 'submit', 'orderby', 'order', 'links_show_cat_id', 'rating', 'rel', 'notes', 'linkcheck[]', 's' ) );1583 1584 $args = array( 'hide_invisible' => 0, 'hide_empty' => 0 );1585 1586 if ( 'all' != $cat_id )1587 $args['category'] = $cat_id;1588 if ( !empty( $s ) )1589 $args['search'] = $s;1590 if ( !empty( $orderby ) )1591 $args['orderby'] = $orderby;1592 if ( !empty( $order ) )1593 $args['order'] = $order;1594 1595 $this->items = get_bookmarks( $args );1596 }1597 1598 function no_items() {1599 _e( 'No links found.' );1600 }1601 1602 function get_bulk_actions() {1603 $actions = array();1604 $actions['delete'] = __( 'Delete' );1605 1606 return $actions;1607 }1608 1609 function extra_tablenav( $which ) {1610 global $cat_id;1611 1612 if ( 'top' != $which )1613 return;1614 ?>1615 <div class="alignleft actions">1616 <?php1617 $dropdown_options = array(1618 'selected' => $cat_id,1619 'name' => 'cat_id',1620 'taxonomy' => 'link_category',1621 'show_option_all' => __( 'View all categories' ),1622 'hide_empty' => true,1623 'hierarchical' => 1,1624 'show_count' => 0,1625 'orderby' => 'name',1626 );1627 wp_dropdown_categories( $dropdown_options );1628 ?>1629 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />1630 </div>1631 <?php1632 }1633 1634 function get_columns() {1635 return array(1636 'cb' => '<input type="checkbox" />',1637 'name' => __( 'Name' ),1638 'url' => __( 'URL' ),1639 'categories' => __( 'Categories' ),1640 'rel' => __( 'Relationship' ),1641 'visible' => __( 'Visible' ),1642 'rating' => __( 'Rating' )1643 );1644 }1645 1646 function get_sortable_columns() {1647 return array(1648 'name' => 'name',1649 'url' => 'url',1650 'visible' => 'visible',1651 'rating' => 'rating'1652 );1653 }1654 1655 function display_rows() {1656 global $cat_id;1657 1658 $alt = 0;1659 1660 foreach ( $this->items as $link ) {1661 $link = sanitize_bookmark( $link );1662 $link->link_name = esc_attr( $link->link_name );1663 $link->link_category = wp_get_link_cats( $link->link_id );1664 1665 $short_url = str_replace( 'http://', '', $link->link_url );1666 $short_url = preg_replace( '/^www\./i', '', $short_url );1667 if ( '/' == substr( $short_url, -1 ) )1668 $short_url = substr( $short_url, 0, -1 );1669 if ( strlen( $short_url ) > 35 )1670 $short_url = substr( $short_url, 0, 32 ).'...';1671 1672 $visible = ( $link->link_visible == 'Y' ) ? __( 'Yes' ) : __( 'No' );1673 $rating = $link->link_rating;1674 $style = ( $alt++ % 2 ) ? '' : ' class="alternate"';1675 1676 $edit_link = get_edit_bookmark_link( $link );1677 ?>1678 <tr id="link-<?php echo $link->link_id; ?>" valign="middle" <?php echo $style; ?>>1679 <?php1680 1681 list( $columns, $hidden ) = $this->get_column_info();1682 1683 foreach ( $columns as $column_name => $column_display_name ) {1684 $class = "class='column-$column_name'";1685 1686 $style = '';1687 if ( in_array( $column_name, $hidden ) )1688 $style = ' style="display:none;"';1689 1690 $attributes = $class . $style;1691 1692 switch ( $column_name ) {1693 case 'cb':1694 echo '<th scope="row" class="check-column"><input type="checkbox" name="linkcheck[]" value="'. esc_attr( $link->link_id ) .'" /></th>';1695 break;1696 1697 case 'name':1698 echo "<td $attributes><strong><a class='row-title' href='$edit_link' title='" . esc_attr( sprintf( __( 'Edit “%s”' ), $link->link_name ) ) . "'>$link->link_name</a></strong><br />";1699 1700 $actions = array();1701 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';1702 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "link.php?action=delete&link_id=$link->link_id", 'delete-bookmark_' . $link->link_id ) . "' onclick=\"if ( confirm( '" . esc_js( sprintf( __( "You are about to delete this link '%s'\n 'Cancel' to stop, 'OK' to delete." ), $link->link_name ) ) . "' ) ) { return true;}return false;\">" . __( 'Delete' ) . "</a>";1703 echo $this->row_actions( $actions );1704 1705 echo '</td>';1706 break;1707 case 'url':1708 echo "<td $attributes><a href='$link->link_url' title='".sprintf( __( 'Visit %s' ), $link->link_name )."'>$short_url</a></td>";1709 break;1710 case 'categories':1711 ?><td <?php echo $attributes ?>><?php1712 $cat_names = array();1713 foreach ( $link->link_category as $category ) {1714 $cat = get_term( $category, 'link_category', OBJECT, 'display' );1715 if ( is_wp_error( $cat ) )1716 echo $cat->get_error_message();1717 $cat_name = $cat->name;1718 if ( $cat_id != $category )1719 $cat_name = "<a href='link-manager.php?cat_id=$category'>$cat_name</a>";1720 $cat_names[] = $cat_name;1721 }1722 echo implode( ', ', $cat_names );1723 ?></td><?php1724 break;1725 case 'rel':1726 ?><td <?php echo $attributes ?>><?php echo empty( $link->link_rel ) ? '<br />' : $link->link_rel; ?></td><?php1727 break;1728 case 'visible':1729 ?><td <?php echo $attributes ?>><?php echo $visible; ?></td><?php1730 break;1731 case 'rating':1732 ?><td <?php echo $attributes ?>><?php echo $rating; ?></td><?php1733 break;1734 default:1735 ?>1736 <td <?php echo $attributes ?>><?php do_action( 'manage_link_custom_column', $column_name, $link->link_id ); ?></td>1737 <?php1738 break;1739 }1740 }1741 ?>1742 </tr>1743 <?php1744 }1745 }1746 }1747 1748 class WP_Sites_Table extends WP_List_Table {1749 1750 function WP_Sites_Table() {1751 parent::WP_List_Table( array(1752 'screen' => 'sites-network',1753 'plural' => 'sites',1754 ) );1755 }1756 1757 function check_permissions() {1758 if ( ! current_user_can( 'manage_sites' ) )1759 wp_die( __( 'You do not have permission to access this page.' ) );1760 }1761 1762 function prepare_items() {1763 global $s, $mode, $wpdb;1764 1765 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'list' : $_REQUEST['mode'];1766 1767 $per_page = $this->get_items_per_page( 'sites_network_per_page' );1768 1769 $pagenum = $this->get_pagenum();1770 1771 $s = isset( $_REQUEST['s'] ) ? stripslashes( trim( $_REQUEST[ 's' ] ) ) : '';1772 $like_s = esc_sql( like_escape( $s ) );1773 1774 $query = "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' ";1775 1776 if ( isset( $_REQUEST['searchaction'] ) ) {1777 if ( 'name' == $_REQUEST['searchaction'] ) {1778 $query .= " AND ( {$wpdb->blogs}.domain LIKE '%{$like_s}%' OR {$wpdb->blogs}.path LIKE '%{$like_s}%' ) ";1779 } elseif ( 'id' == $_REQUEST['searchaction'] ) {1780 $query .= " AND {$wpdb->blogs}.blog_id = '{$like_s}' ";1781 } elseif ( 'ip' == $_REQUEST['searchaction'] ) {1782 $query = "SELECT *1783 FROM {$wpdb->blogs}, {$wpdb->registration_log}1784 WHERE site_id = '{$wpdb->siteid}'1785 AND {$wpdb->blogs}.blog_id = {$wpdb->registration_log}.blog_id1786 AND {$wpdb->registration_log}.IP LIKE ( '%{$like_s}%' )";1787 }1788 }1789 1790 $order_by = isset( $_REQUEST['orderby'] ) ? $_REQUEST['orderby'] : 'id';1791 if ( $order_by == 'registered' ) {1792 $query .= ' ORDER BY registered ';1793 } elseif ( $order_by == 'lastupdated' ) {1794 $query .= ' ORDER BY last_updated ';1795 } elseif ( $order_by == 'blogname' ) {1796 $query .= ' ORDER BY domain ';1797 } else {1798 $order_by = 'id';1799 $query .= " ORDER BY {$wpdb->blogs}.blog_id ";1800 }1801 1802 $order = ( isset( $_REQUEST['order'] ) && 'DESC' == strtoupper( $_REQUEST['order'] ) ) ? "DESC" : "ASC";1803 $query .= $order;1804 1805 $total = $wpdb->get_var( str_replace( 'SELECT *', 'SELECT COUNT( blog_id )', $query ) );1806 1807 $query .= " LIMIT " . intval( ( $pagenum - 1 ) * $per_page ) . ", " . intval( $per_page );1808 $this->items = $wpdb->get_results( $query, ARRAY_A );1809 1810 $this->set_pagination_args( array(1811 'total_items' => $total,1812 'per_page' => $per_page,1813 ) );1814 }1815 1816 function no_items() {1817 _e( 'No sites found.' );1818 }1819 1820 function get_bulk_actions() {1821 $actions = array();1822 $actions['delete'] = __( 'Delete' );1823 $actions['spam'] = _x( 'Mark as Spam', 'site' );1824 $actions['notspam'] = _x( 'Not Spam', 'site' );1825 1826 return $actions;1827 }1828 1829 function pagination( $which ) {1830 global $mode;1831 1832 parent::pagination( $which );1833 1834 if ( 'top' == $which )1835 $this->view_switcher( $mode );1836 }1837 1838 function get_columns() {1839 $blogname_columns = ( is_subdomain_install() ) ? __( 'Domain' ) : __( 'Path' );1840 $sites_columns = array(1841 'cb' => '<input type="checkbox" />',1842 'blogname' => $blogname_columns,1843 'lastupdated' => __( 'Last Updated' ),1844 'registered' => _x( 'Registered', 'site' ),1845 'users' => __( 'Users' )1846 );1847 1848 if ( has_filter( 'wpmublogsaction' ) )1849 $sites_columns['plugins'] = __( 'Actions' );1850 1851 $sites_columns = apply_filters( 'wpmu_blogs_columns', $sites_columns );1852 1853 return $sites_columns;1854 }1855 1856 function get_sortable_columns() {1857 return array(1858 'id' => 'id',1859 'blogname' => 'blogname',1860 'lastupdated' => 'lastupdated',1861 'registered' => 'registered',1862 );1863 }1864 1865 function display_rows() {1866 global $current_site, $mode;1867 1868 $status_list = array(1869 'archived' => array( 'site-archived', __( 'Archived' ) ),1870 'spam' => array( 'site-spammed', _x( 'Spam', 'site' ) ),1871 'deleted' => array( 'site-deleted', __( 'Deleted' ) ),1872 'mature' => array( 'site-mature', __( 'Mature' ) )1873 );1874 1875 $class = '';1876 foreach ( $this->items as $blog ) {1877 $class = ( 'alternate' == $class ) ? '' : 'alternate';1878 reset( $status_list );1879 1880 $blog_states = array();1881 foreach ( $status_list as $status => $col ) {1882 if ( get_blog_status( $blog['blog_id'], $status ) == 1 ) {1883 $class = $col[0];1884 $blog_states[] = $col[1];1885 }1886 }1887 $blog_state = '';1888 if ( ! empty( $blog_states ) ) {1889 $state_count = count( $blog_states );1890 $i = 0;1891 $blog_state .= ' - ';1892 foreach ( $blog_states as $state ) {1893 ++$i;1894 ( $i == $state_count ) ? $sep = '' : $sep = ', ';1895 $blog_state .= "<span class='post-state'>$state$sep</span>";1896 }1897 }1898 echo "<tr class='$class'>";1899 1900 $blogname = ( is_subdomain_install() ) ? str_replace( '.'.$current_site->domain, '', $blog['domain'] ) : $blog['path'];1901 1902 list( $columns, $hidden ) = $this->get_column_info();1903 1904 foreach ( $columns as $column_name => $column_display_name ) {1905 switch ( $column_name ) {1906 case 'cb': ?>1907 <th scope="row" class="check-column">1908 <input type="checkbox" id="blog_<?php echo $blog['blog_id'] ?>" name="allblogs[]" value="<?php echo esc_attr( $blog['blog_id'] ) ?>" />1909 </th>1910 <?php1911 break;1912 1913 case 'id': ?>1914 <th valign="top" scope="row">1915 <?php echo $blog['blog_id'] ?>1916 </th>1917 <?php1918 break;1919 1920 case 'blogname': ?>1921 <td class="column-title">1922 <a href="<?php echo esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ); ?>" class="edit"><?php echo $blogname . $blog_state; ?></a>1923 <?php1924 if ( 'list' != $mode )1925 echo '<p>' . sprintf( _x( '%1$s – <em>%2$s</em>', '%1$s: site name. %2$s: site tagline.' ), get_blog_option( $blog['blog_id'], 'blogname' ), get_blog_option( $blog['blog_id'], 'blogdescription ' ) ) . '</p>';1926 1927 // Preordered.1928 $actions = array(1929 'edit' => '', 'backend' => '',1930 'activate' => '', 'deactivate' => '',1931 'archive' => '', 'unarchive' => '',1932 'spam' => '', 'unspam' => '',1933 'delete' => '',1934 'visit' => '',1935 );1936 1937 $actions['edit'] = '<span class="edit"><a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ) . '">' . __( 'Edit' ) . '</a></span>';1938 $actions['backend'] = "<span class='backend'><a href='" . esc_url( get_admin_url( $blog['blog_id'] ) ) . "' class='edit'>" . __( 'Dashboard' ) . '</a></span>';1939 if ( $current_site->blog_id != $blog['blog_id'] ) {1940 if ( get_blog_status( $blog['blog_id'], 'deleted' ) == '1' )1941 $actions['activate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=activateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to activate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Activate' ) . '</a></span>';1942 else1943 $actions['deactivate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deactivateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to deactivate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Deactivate' ) . '</a></span>';1944 1945 if ( get_blog_status( $blog['blog_id'], 'archived' ) == '1' )1946 $actions['unarchive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unarchiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unarchive the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Unarchive' ) . '</a></span>';1947 else1948 $actions['archive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=archiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to archive the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Archive', 'verb; site' ) . '</a></span>';1949 1950 if ( get_blog_status( $blog['blog_id'], 'spam' ) == '1' )1951 $actions['unspam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unspamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unspam the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Not Spam', 'site' ) . '</a></span>';1952 else1953 $actions['spam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=spamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to mark the site %s as spam.' ), $blogname ) ) ) ) . '">' . _x( 'Spam', 'site' ) . '</a></span>';1954 1955 $actions['delete'] = '<span class="delete"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deleteblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to delete the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Delete' ) . '</a></span>';1956 }1957 1958 $actions['visit'] = "<span class='view'><a href='" . esc_url( get_home_url( $blog['blog_id'] ) ) . "' rel='permalink'>" . __( 'Visit' ) . '</a></span>';1959 $actions = array_filter( $actions );1960 echo $this->row_actions( $actions );1961 ?>1962 </td>1963 <?php1964 break;1965 1966 case 'lastupdated': ?>1967 <td valign="top">1968 <?php1969 if ( 'list' == $mode )1970 $date = 'Y/m/d';1971 else1972 $date = 'Y/m/d \<\b\r \/\> g:i:s a';1973 echo ( $blog['last_updated'] == '0000-00-00 00:00:00' ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] ); ?>1974 </td>1975 <?php1976 break;1977 case 'registered': ?>1978 <td valign="top">1979 <?php1980 if ( $blog['registered'] == '0000-00-00 00:00:00' )1981 echo '—';1982 else1983 echo mysql2date( $date, $blog['registered'] );1984 ?>1985 </td>1986 <?php1987 break;1988 case 'users': ?>1989 <td valign="top">1990 <?php1991 $blogusers = get_users( array( 'blog_id' => $blog['blog_id'], 'number' => 6) );1992 if ( is_array( $blogusers ) ) {1993 $blogusers_warning = '';1994 if ( count( $blogusers ) > 5 ) {1995 $blogusers = array_slice( $blogusers, 0, 5 );1996 $blogusers_warning = __( 'Only showing first 5 users.' ) . ' <a href="' . esc_url( get_admin_url( $blog['blog_id'], 'users.php' ) ) . '">' . __( 'More' ) . '</a>';1997 }1998 foreach ( $blogusers as $user_object ) {1999 echo '<a href="' . esc_url( admin_url( 'user-edit.php?user_id=' . $user_object->ID ) ) . '">' . esc_html( $user_object->user_login ) . '</a> ';2000 if ( 'list' != $mode )2001 echo '( ' . $user_object->user_email . ' )';2002 echo '<br />';2003 }2004 if ( $blogusers_warning != '' )2005 echo '<strong>' . $blogusers_warning . '</strong><br />';2006 }2007 ?>2008 </td>2009 <?php2010 break;2011 2012 case 'plugins': ?>2013 <?php if ( has_filter( 'wpmublogsaction' ) ) { ?>2014 <td valign="top">2015 <?php do_action( 'wpmublogsaction', $blog['blog_id'] ); ?>2016 </td>2017 <?php } ?>2018 <?php break;2019 2020 default: ?>2021 <?php if ( has_filter( 'manage_blogs_custom_column' ) ) { ?>2022 <td valign="top">2023 <?php do_action( 'manage_blogs_custom_column', $column_name, $blog['blog_id'] ); ?>2024 </td>2025 <?php } ?>2026 <?php break;2027 }2028 }2029 ?>2030 </tr>2031 <?php2032 }2033 }2034 }2035 11 2036 12 class WP_MS_Users_Table extends WP_List_Table { … … 2252 228 } 2253 229 2254 class WP_Plugins_Table extends WP_List_Table {2255 2256 function WP_Plugins_Table() {2257 global $status, $page;2258 2259 $default_status = get_user_option( 'plugins_last_view' );2260 if ( empty( $default_status ) )2261 $default_status = 'all';2262 $status = isset( $_REQUEST['plugin_status'] ) ? $_REQUEST['plugin_status'] : $default_status;2263 if ( !in_array( $status, array( 'all', 'active', 'inactive', 'recently_activated', 'upgrade', 'network', 'mustuse', 'dropins', 'search' ) ) )2264 $status = 'all';2265 if ( $status != $default_status && 'search' != $status )2266 update_user_meta( get_current_user_id(), 'plugins_last_view', $status );2267 2268 $page = $this->get_pagenum();2269 2270 parent::WP_List_Table( array(2271 'screen' => 'plugins',2272 'plural' => 'plugins',2273 ) );2274 }2275 2276 function check_permissions() {2277 if ( is_multisite() ) {2278 $menu_perms = get_site_option( 'menu_items', array() );2279 2280 if ( empty( $menu_perms['plugins'] ) ) {2281 if ( !is_super_admin() )2282 wp_die( __( 'Cheatin’ uh?' ) );2283 }2284 }2285 2286 if ( !current_user_can('activate_plugins') )2287 wp_die( __( 'You do not have sufficient permissions to manage plugins for this site.' ) );2288 }2289 2290 function prepare_items() {2291 global $status, $plugins, $totals, $page, $orderby, $order, $s;2292 2293 wp_reset_vars( array( 'orderby', 'order', 's' ) );2294 2295 $plugins = array(2296 'all' => apply_filters( 'all_plugins', get_plugins() ),2297 'search' => array(),2298 'active' => array(),2299 'inactive' => array(),2300 'recently_activated' => array(),2301 'upgrade' => array(),2302 'mustuse' => array(),2303 'dropins' => array()2304 );2305 2306 if ( ! is_multisite() || ( is_network_admin() && current_user_can('manage_network_plugins') ) ) {2307 if ( apply_filters( 'show_advanced_plugins', true, 'mustuse' ) )2308 $plugins['mustuse'] = get_mu_plugins();2309 if ( apply_filters( 'show_advanced_plugins', true, 'dropins' ) )2310 $plugins['dropins'] = get_dropins();2311 }2312 2313 set_transient( 'plugin_slugs', array_keys( $plugins['all'] ), 86400 );2314 2315 $recently_activated = get_option( 'recently_activated', array() );2316 2317 $one_week = 7*24*60*60;2318 foreach ( $recently_activated as $key => $time )2319 if ( $time + $one_week < time() )2320 unset( $recently_activated[$key] );2321 update_option( 'recently_activated', $recently_activated );2322 2323 $current = get_site_transient( 'update_plugins' );2324 2325 foreach ( array( 'all', 'mustuse', 'dropins' ) as $type ) {2326 foreach ( (array) $plugins[$type] as $plugin_file => $plugin_data ) {2327 // Translate, Apply Markup, Sanitize HTML2328 $plugins[$type][$plugin_file] = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, false, true );2329 }2330 }2331 2332 foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) {2333 // Filter into individual sections2334 if ( is_plugin_active_for_network($plugin_file) && !is_network_admin() ) {2335 unset( $plugins['all'][ $plugin_file ] );2336 continue;2337 } elseif ( is_multisite() && is_network_only_plugin( $plugin_file ) && !current_user_can( 'manage_network_plugins' ) ) {2338 $plugins['network'][ $plugin_file ] = $plugin_data;2339 } elseif ( ( !is_network_admin() && is_plugin_active( $plugin_file ) )2340 || ( is_network_admin() && is_plugin_active_for_network( $plugin_file ) ) ) {2341 $plugins['active'][ $plugin_file ] = $plugin_data;2342 } else {2343 if ( !is_network_admin() && isset( $recently_activated[ $plugin_file ] ) ) // Was the plugin recently activated?2344 $plugins['recently_activated'][ $plugin_file ] = $plugin_data;2345 $plugins['inactive'][ $plugin_file ] = $plugin_data;2346 }2347 2348 if ( isset( $current->response[ $plugin_file ] ) )2349 $plugins['upgrade'][ $plugin_file ] = $plugin_data;2350 }2351 2352 if ( !current_user_can( 'update_plugins' ) )2353 $plugins['upgrade'] = array();2354 2355 if ( $s ) {2356 $status = 'search';2357 $plugins['search'] = array_filter( $plugins['all'], array( $this, '_search_callback' ) );2358 }2359 2360 $totals = array();2361 foreach ( $plugins as $type => $list )2362 $totals[ $type ] = count( $list );2363 2364 if ( empty( $plugins[ $status ] ) && !in_array( $status, array( 'all', 'search' ) ) )2365 $status = 'all';2366 2367 $this->items = $plugins[ $status ];2368 $total_this_page = $totals[ $status ];2369 2370 if ( $orderby ) {2371 $orderby = ucfirst( $orderby );2372 $order = strtoupper( $order );2373 2374 uasort( $this->items, array( $this, '_order_callback' ) );2375 }2376 2377 $plugins_per_page = $this->get_items_per_page( 'plugins_per_page', 999 );2378 2379 $start = ( $page - 1 ) * $plugins_per_page;2380 2381 if ( $total_this_page > $plugins_per_page )2382 $this->items = array_slice( $this->items, $start, $plugins_per_page );2383 2384 $this->set_pagination_args( array(2385 'total_items' => $total_this_page,2386 'per_page' => $plugins_per_page,2387 ) );2388 }2389 2390 function _search_callback( $plugin ) {2391 static $term;2392 if ( is_null( $term ) )2393 $term = stripslashes( $_REQUEST['s'] );2394 2395 foreach ( $plugin as $value )2396 if ( stripos( $value, $term ) !== false )2397 return true;2398 2399 return false;2400 }2401 2402 function _order_callback( $plugin_a, $plugin_b ) {2403 global $orderby, $order;2404 2405 $a = $plugin_a[$orderby];2406 $b = $plugin_b[$orderby];2407 2408 if ( $a == $b )2409 return 0;2410 2411 if ( 'DESC' == $order )2412 return ( $a < $b ) ? 1 : -1;2413 else2414 return ( $a < $b ) ? -1 : 1;2415 }2416 2417 function no_items() {2418 global $plugins;2419 2420 if ( !empty( $plugins['all'] ) )2421 _e( 'No plugins found.' );2422 else2423 _e( 'You do not appear to have any plugins available at this time.' );2424 }2425 2426 function get_columns() {2427 global $status;2428 2429 return array(2430 'cb' => !in_array( $status, array( 'mustuse', 'dropins' ) ) ? '<input type="checkbox" />' : '',2431 'name' => __( 'Plugin' ),2432 'description' => __( 'Description' ),2433 );2434 }2435 2436 function get_sortable_columns() {2437 return array(2438 'name' => 'name',2439 'description' => 'description',2440 );2441 }2442 2443 function display_tablenav( $which ) {2444 global $status;2445 2446 if ( !in_array( $status, array( 'mustuse', 'dropins' ) ) )2447 parent::display_tablenav( $which );2448 }2449 2450 function get_views() {2451 global $totals, $status;2452 2453 $status_links = array();2454 foreach ( $totals as $type => $count ) {2455 if ( !$count )2456 continue;2457 2458 switch ( $type ) {2459 case 'all':2460 $text = _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $count, 'plugins' );2461 break;2462 case 'active':2463 $text = _n( 'Active <span class="count">(%s)</span>', 'Active <span class="count">(%s)</span>', $count );2464 break;2465 case 'recently_activated':2466 $text = _n( 'Recently Active <span class="count">(%s)</span>', 'Recently Active <span class="count">(%s)</span>', $count );2467 break;2468 case 'inactive':2469 $text = _n( 'Inactive <span class="count">(%s)</span>', 'Inactive <span class="count">(%s)</span>', $count );2470 break;2471 case 'network':2472 $text = _n( 'Network <span class="count">(%s)</span>', 'Network <span class="count">(%s)</span>', $count );2473 break;2474 case 'mustuse':2475 $text = _n( 'Must-Use <span class="count">(%s)</span>', 'Must-Use <span class="count">(%s)</span>', $count );2476 break;2477 case 'dropins':2478 $text = _n( 'Drop-ins <span class="count">(%s)</span>', 'Drop-ins <span class="count">(%s)</span>', $count );2479 break;2480 case 'upgrade':2481 $text = _n( 'Upgrade Available <span class="count">(%s)</span>', 'Upgrade Available <span class="count">(%s)</span>', $count );2482 break;2483 case 'search':2484 $text = _n( 'Search Results <span class="count">(%s)</span>', 'Search Results <span class="count">(%s)</span>', $count );2485 break;2486 }2487 2488 $status_links[$type] = sprintf( "<li><a href='%s' %s>%s</a>",2489 add_query_arg('plugin_status', $type, 'plugins.php'),2490 ( $type == $status ) ? ' class="current"' : '',2491 sprintf( $text, number_format_i18n( $count ) )2492 );2493 }2494 2495 return $status_links;2496 }2497 2498 function get_bulk_actions() {2499 global $status;2500 2501 $actions = array();2502 if ( 'active' != $status )2503 $actions['activate-selected'] = __( 'Activate' );2504 if ( is_multisite() && 'network' != $status )2505 $actions['network-activate-selected'] = __( 'Network Activate' );2506 if ( 'inactive' != $status && 'recent' != $status )2507 $actions['deactivate-selected'] = __( 'Deactivate' );2508 if ( current_user_can( 'update_plugins' ) )2509 $actions['update-selected'] = __( 'Update' );2510 if ( current_user_can( 'delete_plugins' ) && ( 'active' != $status ) )2511 $actions['delete-selected'] = __( 'Delete' );2512 2513 return $actions;2514 }2515 2516 function bulk_actions( $which ) {2517 global $status;2518 2519 if ( in_array( $status, array( 'mustuse', 'dropins' ) ) )2520 return;2521 2522 parent::bulk_actions( $which );2523 }2524 2525 function extra_tablenav( $which ) {2526 global $status;2527 2528 if ( 'recently_activated' == $status ) { ?>2529 <div class="alignleft actions">2530 <input type="submit" name="clear-recent-list" value="<?php esc_attr_e( 'Clear List' ) ?>" class="button-secondary" />2531 </div>2532 <?php }2533 }2534 2535 function current_action() {2536 if ( isset($_POST['clear-recent-list']) )2537 return 'clear-recent-list';2538 2539 return parent::current_action();2540 }2541 2542 function display_rows() {2543 global $status, $page, $s;2544 2545 $context = $status;2546 2547 foreach ( $this->items as $plugin_file => $plugin_data ) {2548 // preorder2549 $actions = array(2550 'network_deactivate' => '', 'deactivate' => '',2551 'network_only' => '', 'activate' => '',2552 'network_activate' => '',2553 'edit' => '',2554 'delete' => '',2555 );2556 2557 if ( 'mustuse' == $context ) {2558 if ( is_multisite() && !is_network_admin() )2559 continue;2560 $is_active = true;2561 } elseif ( 'dropins' == $context ) {2562 if ( is_multisite() && !is_network_admin() )2563 continue;2564 $dropins = _get_dropins();2565 $plugin_name = $plugin_file;2566 if ( $plugin_file != $plugin_data['Name'] )2567 $plugin_name .= '<br/>' . $plugin_data['Name'];2568 if ( true === ( $dropins[ $plugin_file ][1] ) ) { // Doesn't require a constant2569 $is_active = true;2570 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';2571 } elseif ( constant( $dropins[ $plugin_file ][1] ) ) { // Constant is true2572 $is_active = true;2573 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';2574 } else {2575 $is_active = false;2576 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . ' <span class="attention">' . __('Inactive:') . '</span></strong> ' . sprintf( __( 'Requires <code>%s</code> in <code>wp-config.php</code>.' ), "define('" . $dropins[ $plugin_file ][1] . "', true);" ) . '</p>';2577 }2578 if ( $plugin_data['Description'] )2579 $description .= '<p>' . $plugin_data['Description'] . '</p>';2580 } else {2581 $is_active_for_network = is_plugin_active_for_network($plugin_file);2582 if ( is_network_admin() )2583 $is_active = $is_active_for_network;2584 else2585 $is_active = is_plugin_active( $plugin_file );2586 2587 if ( $is_active_for_network && !is_super_admin() && !is_network_admin() )2588 continue;2589 2590 if ( is_network_admin() ) {2591 if ( $is_active_for_network ) {2592 if ( current_user_can( 'manage_network_plugins' ) )2593 $actions['network_deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Network Deactivate') . '</a>';2594 } else {2595 if ( current_user_can( 'manage_network_plugins' ) )2596 $actions['network_activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin for all sites in this network') . '" class="edit">' . __('Network Activate') . '</a>';2597 if ( current_user_can('delete_plugins') )2598 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';2599 }2600 } else {2601 if ( $is_active ) {2602 $actions['deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Deactivate') . '</a>';2603 } else {2604 if ( is_network_only_plugin( $plugin_file ) && !is_network_admin() )2605 continue;2606 2607 $actions['activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin') . '" class="edit">' . __('Activate') . '</a>';2608 2609 if ( current_user_can('delete_plugins') )2610 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';2611 } // end if $is_active2612 } // end if is_network_admin()2613 2614 if ( current_user_can('edit_plugins') && is_writable(WP_PLUGIN_DIR . '/' . $plugin_file) )2615 $actions['edit'] = '<a href="plugin-editor.php?file=' . $plugin_file . '" title="' . __('Open this file in the Plugin Editor') . '" class="edit">' . __('Edit') . '</a>';2616 } // end if $context2617 2618 $actions = apply_filters( 'plugin_action_links', array_filter( $actions ), $plugin_file, $plugin_data, $context );2619 $actions = apply_filters( "plugin_action_links_$plugin_file", $actions, $plugin_file, $plugin_data, $context );2620 2621 $class = $is_active ? 'active' : 'inactive';2622 $checkbox = in_array( $status, array( 'mustuse', 'dropins' ) ) ? '' : "<input type='checkbox' name='checked[]' value='" . esc_attr( $plugin_file ) . "' />";2623 if ( 'dropins' != $status ) {2624 $description = '<p>' . $plugin_data['Description'] . '</p>';2625 $plugin_name = $plugin_data['Name'];2626 }2627 2628 $id = sanitize_title( $plugin_name );2629 2630 echo "2631 <tr id='$id' class='$class'>2632 <th scope='row' class='check-column'>$checkbox</th>2633 <td class='plugin-title'><strong>$plugin_name</strong></td>2634 <td class='desc'>$description</td>2635 </tr>2636 <tr class='$class second'>2637 <td></td>2638 <td class='plugin-title'>";2639 2640 echo $this->row_actions( $actions, true );2641 2642 echo "</td>2643 <td class='desc'>";2644 $plugin_meta = array();2645 if ( !empty( $plugin_data['Version'] ) )2646 $plugin_meta[] = sprintf( __( 'Version %s' ), $plugin_data['Version'] );2647 if ( !empty( $plugin_data['Author'] ) ) {2648 $author = $plugin_data['Author'];2649 if ( !empty( $plugin_data['AuthorURI'] ) )2650 $author = '<a href="' . $plugin_data['AuthorURI'] . '" title="' . __( 'Visit author homepage' ) . '">' . $plugin_data['Author'] . '</a>';2651 $plugin_meta[] = sprintf( __( 'By %s' ), $author );2652 }2653 if ( ! empty( $plugin_data['PluginURI'] ) )2654 $plugin_meta[] = '<a href="' . $plugin_data['PluginURI'] . '" title="' . __( 'Visit plugin site' ) . '">' . __( 'Visit plugin site' ) . '</a>';2655 2656 $plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status );2657 echo implode( ' | ', $plugin_meta );2658 echo "</td>2659 </tr>\n";2660 2661 do_action( 'after_plugin_row', $plugin_file, $plugin_data, $status );2662 do_action( "after_plugin_row_$plugin_file", $plugin_file, $plugin_data, $status );2663 }2664 }2665 }2666 2667 class WP_Plugin_Install_Table extends WP_List_Table {2668 2669 function WP_Plugin_Install_Table() {2670 parent::WP_List_Table( array(2671 'screen' => 'plugin-install',2672 ) );2673 }2674 2675 function check_permissions() {2676 if ( ! current_user_can('install_plugins') )2677 wp_die(__('You do not have sufficient permissions to install plugins on this site.'));2678 }2679 2680 function prepare_items() {2681 include( ABSPATH . 'wp-admin/includes/plugin-install.php' );2682 2683 global $tabs, $tab, $paged, $type, $term;2684 2685 wp_reset_vars( array( 'tab' ) );2686 2687 $paged = $this->get_pagenum();2688 2689 $per_page = 30;2690 2691 // These are the tabs which are shown on the page2692 $tabs = array();2693 $tabs['dashboard'] = __( 'Search' );2694 if ( 'search' == $tab )2695 $tabs['search'] = __( 'Search Results' );2696 $tabs['upload'] = __( 'Upload' );2697 $tabs['featured'] = _x( 'Featured','Plugin Installer' );2698 $tabs['popular'] = _x( 'Popular','Plugin Installer' );2699 $tabs['new'] = _x( 'Newest','Plugin Installer' );2700 $tabs['updated'] = _x( 'Recently Updated','Plugin Installer' );2701 2702 $nonmenu_tabs = array( 'plugin-information' ); //Valid actions to perform which do not have a Menu item.2703 2704 $tabs = apply_filters( 'install_plugins_tabs', $tabs );2705 $nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs );2706 2707 // If a non-valid menu tab has been selected, And its not a non-menu action.2708 if ( empty( $tab ) || ( !isset( $tabs[ $tab ] ) && !in_array( $tab, (array) $nonmenu_tabs ) ) )2709 $tab = key( $tabs );2710 2711 $args = array( 'page' => $paged, 'per_page' => $per_page );2712 2713 switch ( $tab ) {2714 case 'search':2715 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : '';2716 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '';2717 2718 switch ( $type ) {2719 case 'tag':2720 $args['tag'] = sanitize_title_with_dashes( $term );2721 break;2722 case 'term':2723 $args['search'] = $term;2724 break;2725 case 'author':2726 $args['author'] = $term;2727 break;2728 }2729 2730 add_action( 'install_plugins_table_header', 'install_search_form' );2731 break;2732 2733 case 'featured':2734 case 'popular':2735 case 'new':2736 case 'updated':2737 $args['browse'] = $tab;2738 break;2739 2740 default:2741 $args = false;2742 }2743 2744 if ( !$args )2745 return;2746 2747 $api = plugins_api( 'query_plugins', $args );2748 2749 if ( is_wp_error( $api ) )2750 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' );2751 2752 $this->items = $api->plugins;2753 2754 $this->set_pagination_args( array(2755 'total_items' => $api->info['results'],2756 'per_page' => $per_page,2757 ) );2758 }2759 2760 function no_items() {2761 _e( 'No plugins match your request.' );2762 }2763 2764 function get_views() {2765 global $tabs, $tab;2766 2767 $display_tabs = array();2768 foreach ( (array) $tabs as $action => $text ) {2769 $class = ( $action == $tab ) ? ' class="current"' : '';2770 $href = admin_url('plugin-install.php?tab=' . $action);2771 $display_tabs[$action] = "<a href='$href'$class>$text</a>";2772 }2773 2774 return $display_tabs;2775 }2776 2777 function display_tablenav( $which ) {2778 if ( 'top' == $which ) { ?>2779 <div class="tablenav">2780 <div class="alignleft actions">2781 <?php do_action( 'install_plugins_table_header' ); ?>2782 </div>2783 <?php $this->pagination( $which ); ?>2784 <br class="clear" />2785 </div>2786 <?php } else { ?>2787 <div class="tablenav">2788 <?php $this->pagination( $which ); ?>2789 <br class="clear" />2790 </div>2791 <?php2792 }2793 }2794 2795 function get_table_classes() {2796 extract( $this->_args );2797 2798 return array( 'widefat', $plural );2799 }2800 2801 function get_columns() {2802 return array(2803 'name' => __( 'Name' ),2804 'version' => __( 'Version' ),2805 'rating' => __( 'Rating' ),2806 'description' => __( 'Description' ),2807 );2808 }2809 2810 function display_rows() {2811 $plugins_allowedtags = array(2812 'a' => array( 'href' => array(),'title' => array(), 'target' => array() ),2813 'abbr' => array( 'title' => array() ),'acronym' => array( 'title' => array() ),2814 'code' => array(), 'pre' => array(), 'em' => array(),'strong' => array(),2815 'ul' => array(), 'ol' => array(), 'li' => array(), 'p' => array(), 'br' => array()2816 );2817 2818 foreach ( (array) $this->items as $plugin ) {2819 if ( is_object( $plugin ) )2820 $plugin = (array) $plugin;2821 2822 $title = wp_kses( $plugin['name'], $plugins_allowedtags );2823 //Limit description to 400char, and remove any HTML.2824 $description = strip_tags( $plugin['description'] );2825 if ( strlen( $description ) > 400 )2826 $description = mb_substr( $description, 0, 400 ) . '…';2827 //remove any trailing entities2828 $description = preg_replace( '/&[^;\s]{0,6}$/', '', $description );2829 //strip leading/trailing & multiple consecutive lines2830 $description = trim( $description );2831 $description = preg_replace( "|(\r?\n)+|", "\n", $description );2832 //\n => <br>2833 $description = nl2br( $description );2834 $version = wp_kses( $plugin['version'], $plugins_allowedtags );2835 2836 $name = strip_tags( $title . ' ' . $version );2837 2838 $author = $plugin['author'];2839 if ( ! empty( $plugin['author'] ) )2840 $author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '.</cite>';2841 2842 $author = wp_kses( $author, $plugins_allowedtags );2843 2844 $action_links = array();2845 $action_links[] = '<a href="' . admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin['slug'] .2846 '&TB_iframe=true&width=600&height=550' ) . '" class="thickbox" title="' .2847 esc_attr( sprintf( __( 'More information about %s' ), $name ) ) . '">' . __( 'Details' ) . '</a>';2848 2849 if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) {2850 $status = install_plugin_install_status( $plugin );2851 2852 switch ( $status['status'] ) {2853 case 'install':2854 if ( $status['url'] )2855 $action_links[] = '<a class="install-now" href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Install %s' ), $name ) ) . '">' . __( 'Install Now' ) . '</a>';2856 break;2857 case 'update_available':2858 if ( $status['url'] )2859 $action_links[] = '<a href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Update to version %s' ), $status['version'] ) ) . '">' . sprintf( __( 'Update Now' ), $status['version'] ) . '</a>';2860 break;2861 case 'latest_installed':2862 case 'newer_installed':2863 $action_links[] = '<span title="' . esc_attr__( 'This plugin is already installed and is up to date' ) . ' ">' . __( 'Installed' ) . '</span>';2864 break;2865 }2866 }2867 2868 $action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin );2869 ?>2870 <tr>2871 <td class="name"><strong><?php echo $title; ?></strong>2872 <div class="action-links"><?php if ( !empty( $action_links ) ) echo implode( ' | ', $action_links ); ?></div>2873 </td>2874 <td class="vers"><?php echo $version; ?></td>2875 <td class="vers">2876 <div class="star-holder" title="<?php printf( _n( '( based on %s rating )', '( based on %s ratings )', $plugin['num_ratings'] ), number_format_i18n( $plugin['num_ratings'] ) ) ?>">2877 <div class="star star-rating" style="width: <?php echo esc_attr( $plugin['rating'] ) ?>px"></div>2878 <div class="star star5"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '5 stars' ) ?>" /></div>2879 <div class="star star4"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '4 stars' ) ?>" /></div>2880 <div class="star star3"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '3 stars' ) ?>" /></div>2881 <div class="star star2"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '2 stars' ) ?>" /></div>2882 <div class="star star1"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '1 star' ) ?>" /></div>2883 </div>2884 </td>2885 <td class="desc"><?php echo $description, $author; ?></td>2886 </tr>2887 <?php2888 }2889 }2890 }2891 2892 class WP_Themes_Table extends WP_List_Table {2893 2894 var $search = array();2895 var $features = array();2896 2897 function WP_Themes_Table() {2898 parent::__construct( array(2899 'screen' => 'themes',2900 ) );2901 }2902 2903 function check_permissions() {2904 if ( !current_user_can('switch_themes') && !current_user_can('edit_theme_options') )2905 wp_die( __( 'Cheatin’ uh?' ) );2906 }2907 2908 function prepare_items() {2909 global $ct;2910 2911 $ct = current_theme_info();2912 2913 $themes = get_allowed_themes();2914 2915 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';2916 2917 if ( '' !== $search ) {2918 $this->search = array_merge( $this->search, array_filter( array_map( 'trim', explode( ',', $search ) ) ) );2919 $this->search = array_unique( $this->search );2920 }2921 2922 if ( !empty( $_REQUEST['features'] ) ) {2923 $this->features = $_REQUEST['features'];2924 $this->features = array_map( 'trim', $this->features );2925 $this->features = array_map( 'sanitize_title_with_dashes', $this->features );2926 $this->features = array_unique( $this->features );2927 }2928 2929 if ( $this->search || $this->features ) {2930 foreach ( $themes as $key => $theme ) {2931 if ( !$this->search_theme( $theme ) )2932 unset( $themes[ $key ] );2933 }2934 }2935 2936 unset( $themes[$ct->name] );2937 uksort( $themes, "strnatcasecmp" );2938 2939 $per_page = 15;2940 $page = $this->get_pagenum();2941 2942 $start = ( $page - 1 ) * $per_page;2943 2944 $this->items = array_slice( $themes, $start, $per_page );2945 2946 $this->set_pagination_args( array(2947 'query_var' => 'pagenum',2948 'total_items' => count( $themes ),2949 'per_page' => $per_page,2950 ) );2951 }2952 2953 function no_items() {2954 if ( current_user_can( 'install_themes' ) )2955 printf( __( 'You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress.org Theme Directory at any time: just click on the <em><a href="%s">Install Themes</a></em> tab above.' ), 'theme-install.php' );2956 else2957 printf( __( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ), get_site_option( 'site_name' ) );2958 }2959 2960 function display_table() {2961 230 ?> 2962 <div class="tablenav"> 2963 <?php $this->pagination( 'top' ); ?> 2964 <br class="clear" /> 2965 </div> 2966 2967 <table id="availablethemes" cellspacing="0" cellpadding="0"> 2968 <tbody id="the-list" class="list:themes"> 2969 <?php $this->display_rows(); ?> 2970 </tbody> 2971 </table> 2972 2973 <div class="tablenav"> 2974 <?php $this->pagination( 'bottom' ); ?> 2975 <br class="clear" /> 2976 </div> 2977 <?php 2978 } 2979 2980 function get_columns() { 2981 return array(); 2982 } 2983 2984 function display_rows() { 2985 $themes = $this->items; 2986 $theme_names = array_keys( $themes ); 2987 natcasesort( $theme_names ); 2988 2989 $table = array(); 2990 $rows = ceil( count( $theme_names ) / 3 ); 2991 for ( $row = 1; $row <= $rows; $row++ ) 2992 for ( $col = 1; $col <= 3; $col++ ) 2993 $table[$row][$col] = array_shift( $theme_names ); 2994 2995 foreach ( $table as $row => $cols ) { 2996 ?> 2997 <tr> 2998 <?php 2999 foreach ( $cols as $col => $theme_name ) { 3000 $class = array( 'available-theme' ); 3001 if ( $row == 1 ) $class[] = 'top'; 3002 if ( $col == 1 ) $class[] = 'left'; 3003 if ( $row == $rows ) $class[] = 'bottom'; 3004 if ( $col == 3 ) $class[] = 'right'; 3005 ?> 3006 <td class="<?php echo join( ' ', $class ); ?>"> 3007 <?php if ( !empty( $theme_name ) ) : 3008 $template = $themes[$theme_name]['Template']; 3009 $stylesheet = $themes[$theme_name]['Stylesheet']; 3010 $title = $themes[$theme_name]['Title']; 3011 $version = $themes[$theme_name]['Version']; 3012 $description = $themes[$theme_name]['Description']; 3013 $author = $themes[$theme_name]['Author']; 3014 $screenshot = $themes[$theme_name]['Screenshot']; 3015 $stylesheet_dir = $themes[$theme_name]['Stylesheet Dir']; 3016 $template_dir = $themes[$theme_name]['Template Dir']; 3017 $parent_theme = $themes[$theme_name]['Parent Theme']; 3018 $theme_root = $themes[$theme_name]['Theme Root']; 3019 $theme_root_uri = $themes[$theme_name]['Theme Root URI']; 3020 $preview_link = esc_url( get_option( 'home' ) . '/' ); 3021 if ( is_ssl() ) 3022 $preview_link = str_replace( 'http://', 'https://', $preview_link ); 3023 $preview_link = htmlspecialchars( add_query_arg( array( 'preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'TB_iframe' => 'true' ), $preview_link ) ); 3024 $preview_text = esc_attr( sprintf( __( 'Preview of “%s”' ), $title ) ); 3025 $tags = $themes[$theme_name]['Tags']; 3026 $thickbox_class = 'thickbox thickbox-preview'; 3027 $activate_link = wp_nonce_url( "themes.php?action=activate&template=".urlencode( $template )."&stylesheet=".urlencode( $stylesheet ), 'switch-theme_' . $template ); 3028 $activate_text = esc_attr( sprintf( __( 'Activate “%s”' ), $title ) ); 3029 $actions = array(); 3030 $actions[] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __( 'Activate' ) . '</a>'; 3031 $actions[] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr( sprintf( __( 'Preview “%s”' ), $theme_name ) ) . '">' . __( 'Preview' ) . '</a>'; 3032 if ( current_user_can( 'delete_themes' ) ) 3033 $actions[] = '<a class="submitdelete deletion" href="' . wp_nonce_url( "themes.php?action=delete&template=$stylesheet", 'delete-theme_' . $stylesheet ) . '" onclick="' . "return confirm( '" . esc_js( sprintf( __( "You are about to delete this theme '%s'\n 'Cancel' to stop, 'OK' to delete." ), $theme_name ) ) . "' );" . '">' . __( 'Delete' ) . '</a>'; 3034 $actions = apply_filters( 'theme_action_links', $actions, $themes[$theme_name] ); 3035 3036 $actions = implode ( ' | ', $actions ); 3037 ?> 3038 <a href="<?php echo $preview_link; ?>" class="<?php echo $thickbox_class; ?> screenshot"> 3039 <?php if ( $screenshot ) : ?> 3040 <img src="<?php echo $theme_root_uri . '/' . $stylesheet . '/' . $screenshot; ?>" alt="" /> 3041 <?php endif; ?> 3042 </a> 3043 <h3><?php 3044 /* translators: 1: theme title, 2: theme version, 3: theme author */ 3045 printf( __( '%1$s %2$s by %3$s' ), $title, $version, $author ) ; ?></h3> 3046 <p class="description"><?php echo $description; ?></p> 3047 <span class='action-links'><?php echo $actions ?></span> 3048 <?php if ( current_user_can( 'edit_themes' ) && $parent_theme ) { 3049 /* translators: 1: theme title, 2: template dir, 3: stylesheet_dir, 4: theme title, 5: parent_theme */ ?> 3050 <p><?php printf( __( 'The template files are located in <code>%2$s</code>. The stylesheet files are located in <code>%3$s</code>. <strong>%4$s</strong> uses templates from <strong>%5$s</strong>. Changes made to the templates will affect both themes.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ), $title, $parent_theme ); ?></p> 3051 <?php } else { ?> 3052 <p><?php printf( __( 'All of this theme’s files are located in <code>%2$s</code>.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ) ); ?></p> 3053 <?php } ?> 3054 <?php if ( $tags ) : ?> 3055 <p><?php _e( 'Tags:' ); ?> <?php echo join( ', ', $tags ); ?></p> 3056 <?php endif; ?> 3057 <?php theme_update_available( $themes[$theme_name] ); ?> 3058 <?php endif; // end if not empty theme_name ?> 3059 </td> 3060 <?php } // end foreach $cols ?> 3061 </tr> 3062 <?php } // end foreach $table 3063 } 3064 3065 function search_theme( $theme ) { 3066 $matched = 0; 3067 3068 // Match all phrases 3069 if ( count( $this->search ) > 0 ) { 3070 foreach ( $this->search as $word ) { 3071 $matched = 0; 3072 3073 // In a tag? 3074 if ( in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) ) 3075 $matched = 1; 3076 3077 // In one of the fields? 3078 foreach ( array( 'Name', 'Title', 'Description', 'Author', 'Template', 'Stylesheet' ) AS $field ) { 3079 if ( stripos( $theme[$field], $word ) !== false ) 3080 $matched++; 3081 } 3082 3083 if ( $matched == 0 ) 3084 return false; 3085 } 3086 } 3087 3088 // Now search the features 3089 if ( count( $this->features ) > 0 ) { 3090 foreach ( $this->features as $word ) { 3091 // In a tag? 3092 if ( !in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) ) 3093 return false; 3094 } 3095 } 3096 3097 // Only get here if each word exists in the tags or one of the fields 3098 return true; 3099 } 3100 } 3101 3102 class WP_Theme_Install_Table extends WP_List_Table { 3103 3104 function WP_Theme_Install_Table() { 3105 parent::WP_List_Table( array( 3106 'screen' => 'theme-install', 3107 ) ); 3108 } 3109 3110 function check_permissions() { 3111 if ( ! current_user_can('install_themes') ) 3112 wp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) ); 3113 } 3114 3115 function prepare_items() { 3116 include( ABSPATH . 'wp-admin/includes/theme-install.php' ); 3117 3118 global $tabs, $tab, $paged, $type, $term, $theme_field_defaults; 3119 3120 wp_reset_vars( array( 'tab' ) ); 3121 3122 $paged = $this->get_pagenum(); 3123 3124 $per_page = 30; 3125 3126 // These are the tabs which are shown on the page, 3127 $tabs = array(); 3128 $tabs['dashboard'] = __( 'Search' ); 3129 if ( 'search' == $tab ) 3130 $tabs['search'] = __( 'Search Results' ); 3131 $tabs['upload'] = __( 'Upload' ); 3132 $tabs['featured'] = _x( 'Featured','Theme Installer' ); 3133 //$tabs['popular'] = _x( 'Popular','Theme Installer' ); 3134 $tabs['new'] = _x( 'Newest','Theme Installer' ); 3135 $tabs['updated'] = _x( 'Recently Updated','Theme Installer' ); 3136 3137 $nonmenu_tabs = array( 'theme-information' ); // Valid actions to perform which do not have a Menu item. 3138 3139 $tabs = apply_filters( 'install_themes_tabs', $tabs ); 3140 $nonmenu_tabs = apply_filters( 'install_themes_nonmenu_tabs', $nonmenu_tabs ); 3141 3142 // If a non-valid menu tab has been selected, And its not a non-menu action. 3143 if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs ) ) ) 3144 $tab = key( $tabs ); 3145 3146 $args = array( 'page' => $paged, 'per_page' => $per_page, 'fields' => $theme_field_defaults ); 3147 3148 switch ( $tab ) { 3149 case 'search': 3150 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : ''; 3151 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : ''; 3152 3153 switch ( $type ) { 3154 case 'tag': 3155 $terms = explode( ',', $term ); 3156 $terms = array_map( 'trim', $terms ); 3157 $terms = array_map( 'sanitize_title_with_dashes', $terms ); 3158 $args['tag'] = $terms; 3159 break; 3160 case 'term': 3161 $args['search'] = $term; 3162 break; 3163 case 'author': 3164 $args['author'] = $term; 3165 break; 3166 } 3167 3168 if ( !empty( $_POST['features'] ) ) { 3169 $terms = $_POST['features']; 3170 $terms = array_map( 'trim', $terms ); 3171 $terms = array_map( 'sanitize_title_with_dashes', $terms ); 3172 $args['tag'] = $terms; 3173 $_REQUEST['s'] = implode( ',', $terms ); 3174 $_REQUEST['type'] = 'tag'; 3175 } 3176 3177 add_action( 'install_themes_table_header', 'install_theme_search_form' ); 3178 break; 3179 3180 case 'featured': 3181 //case 'popular': 3182 case 'new': 3183 case 'updated': 3184 $args['browse'] = $tab; 3185 break; 3186 3187 default: 3188 $args = false; 3189 } 3190 3191 if ( !$args ) 3192 return; 3193 3194 $api = themes_api( 'query_themes', $args ); 3195 3196 if ( is_wp_error( $api ) ) 3197 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' ); 3198 3199 $this->items = $api->themes; 3200 3201 $this->set_pagination_args( array( 3202 'total_items' => $api->info['results'], 3203 'per_page' => $per_page, 3204 ) ); 3205 } 3206 3207 function no_items() { 3208 _e( 'No themes match your request.' ); 3209 } 3210 3211 function get_views() { 3212 global $tabs, $tab; 3213 3214 $display_tabs = array(); 3215 foreach ( (array) $tabs as $action => $text ) { 3216 $class = ( $action == $tab ) ? ' class="current"' : ''; 3217 $href = self_admin_url('theme-install.php?tab=' . $action); 3218 $display_tabs[$action] = "<a href='$href'$class>$text</a>"; 3219 } 3220 3221 return $display_tabs; 3222 } 3223 3224 function get_columns() { 3225 return array(); 3226 } 3227 3228 function display_table() { 3229 ?> 3230 <div class="tablenav"> 3231 <div class="alignleft actions"> 3232 <?php do_action( 'install_themes_table_header' ); ?> 3233 </div> 3234 <?php $this->pagination( 'top' ); ?> 3235 <br class="clear" /> 3236 </div> 3237 3238 <table id="availablethemes" cellspacing="0" cellpadding="0"> 3239 <tbody id="the-list" class="list:themes"> 3240 <?php $this->display_rows(); ?> 3241 </tbody> 3242 </table> 3243 3244 <div class="tablenav"> 3245 <?php $this->pagination( 'bottom' ); ?> 3246 <br class="clear" /> 3247 </div> 3248 <?php 3249 } 3250 3251 function display_rows() { 3252 $themes = $this->items; 3253 3254 $rows = ceil( count( $themes ) / 3 ); 3255 $table = array(); 3256 $theme_keys = array_keys( $themes ); 3257 for ( $row = 1; $row <= $rows; $row++ ) 3258 for ( $col = 1; $col <= 3; $col++ ) 3259 $table[$row][$col] = array_shift( $theme_keys ); 3260 3261 foreach ( $table as $row => $cols ) { 3262 echo "\t<tr>\n"; 3263 foreach ( $cols as $col => $theme_index ) { 3264 $class = array( 'available-theme' ); 3265 if ( $row == 1 ) $class[] = 'top'; 3266 if ( $col == 1 ) $class[] = 'left'; 3267 if ( $row == $rows ) $class[] = 'bottom'; 3268 if ( $col == 3 ) $class[] = 'right'; 3269 ?> 3270 <td class="<?php echo join( ' ', $class ); ?>"><?php 3271 if ( isset( $themes[$theme_index] ) ) 3272 display_theme( $themes[$theme_index] ); 3273 ?></td> 3274 <?php } // end foreach $cols 3275 echo "\t</tr>\n"; 3276 } // end foreach $table 3277 } 3278 } 3279 231 -
trunk/wp-admin/includes/list-table-plugin-install.php
r15954 r15955 9 9 * @subpackage Administration 10 10 */ 11 12 class WP_Media_Table extends WP_List_Table {13 14 function WP_Media_Table() {15 global $detached;16 17 $detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );18 19 parent::WP_List_Table( array(20 'screen' => $detached ? 'upload-detached' : 'upload',21 'plural' => 'media'22 ) );23 }24 25 function check_permissions() {26 if ( !current_user_can('upload_files') )27 wp_die( __( 'You do not have permission to upload files.' ) );28 }29 30 function prepare_items() {31 global $lost, $wpdb, $wp_query, $post_mime_types, $avail_post_mime_types;32 33 $q = $_REQUEST;34 35 if ( !empty( $lost ) )36 $q['post__in'] = implode( ',', $lost );37 38 list( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $q );39 40 $this->is_trash = isset( $_REQUEST['status'] ) && 'trash' == $_REQUEST['status'];41 42 $this->set_pagination_args( array(43 'total_items' => $wp_query->found_posts,44 'total_pages' => $wp_query->max_num_pages,45 'per_page' => $wp_query->query_vars['posts_per_page'],46 ) );47 }48 49 function get_views() {50 global $wpdb, $post_mime_types, $detached, $avail_post_mime_types;51 52 $type_links = array();53 $_num_posts = (array) wp_count_attachments();54 $_total_posts = array_sum($_num_posts) - $_num_posts['trash'];55 if ( !isset( $total_orphans ) )56 $total_orphans = $wpdb->get_var( "SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent < 1" );57 $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));58 foreach ( $matches as $type => $reals )59 foreach ( $reals as $real )60 $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];61 62 $class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : '';63 $type_links['all'] = "<li><a href='upload.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $_total_posts, 'uploaded files' ), number_format_i18n( $_total_posts ) ) . '</a>';64 foreach ( $post_mime_types as $mime_type => $label ) {65 $class = '';66 67 if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )68 continue;69 70 if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )71 $class = ' class="current"';72 if ( !empty( $num_posts[$mime_type] ) )73 $type_links[$mime_type] = "<li><a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( _n( $label[2][0], $label[2][1], $num_posts[$mime_type] ), number_format_i18n( $num_posts[$mime_type] )) . '</a>';74 }75 $type_links['detached'] = '<li><a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( _nx( 'Unattached <span class="count">(%s)</span>', 'Unattached <span class="count">(%s)</span>', $total_orphans, 'detached files' ), number_format_i18n( $total_orphans ) ) . '</a>';76 77 if ( !empty($_num_posts['trash']) )78 $type_links['trash'] = '<li><a href="upload.php?status=trash"' . ( (isset($_GET['status']) && $_GET['status'] == 'trash' ) ? ' class="current"' : '') . '>' . sprintf( _nx( 'Trash <span class="count">(%s)</span>', 'Trash <span class="count">(%s)</span>', $_num_posts['trash'], 'uploaded files' ), number_format_i18n( $_num_posts['trash'] ) ) . '</a>';79 80 return $type_links;81 }82 83 function get_bulk_actions() {84 global $detached;85 86 $actions = array();87 $actions['delete'] = __( 'Delete Permanently' );88 if ( $detached )89 $actions['attach'] = __( 'Attach to a post' );90 91 return $actions;92 }93 94 function extra_tablenav( $which ) {95 global $post_type, $detached;96 ?>97 <div class="alignleft actions">98 <?php99 if ( 'top' == $which && !is_singular() && !$detached && !$this->is_trash ) {100 $this->months_dropdown( $post_type );101 102 do_action( 'restrict_manage_posts' );103 ?>104 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />105 <?php106 }107 108 if ( $detached ) { ?>109 <input type="submit" id="find_detached" name="find_detached" value="<?php esc_attr_e( 'Scan for lost attachments' ); ?>" class="button-secondary" />110 <?php } elseif ( $this->is_trash && current_user_can( 'edit_others_posts' ) ) { ?>111 <input type="submit" id="delete_all" name="delete_all" value="<?php esc_attr_e( 'Empty Trash' ); ?>" class="button-secondary apply" />112 <?php } ?>113 </div>114 <?php115 }116 117 function current_action() {118 if ( isset( $_REQUEST['find_detached'] ) )119 return 'find_detached';120 121 if ( isset( $_REQUEST['found_post_id'] ) && isset( $_REQUEST['media'] ) )122 return 'attach';123 124 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )125 return 'delete_all';126 127 return parent::current_action();128 }129 130 function has_items() {131 return have_posts();132 }133 134 function no_items() {135 _e( 'No media attachments found.' );136 }137 138 function get_columns() {139 $posts_columns = array();140 $posts_columns['cb'] = '<input type="checkbox" />';141 $posts_columns['icon'] = '';142 /* translators: column name */143 $posts_columns['title'] = _x( 'File', 'column name' );144 $posts_columns['author'] = __( 'Author' );145 //$posts_columns['tags'] = _x( 'Tags', 'column name' );146 /* translators: column name */147 if ( 'upload' == $this->_screen->id ) {148 $posts_columns['parent'] = _x( 'Attached to', 'column name' );149 $posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="' . esc_url( admin_url( 'images/comment-grey-bubble.png' ) ) . '" /></div>';150 }151 /* translators: column name */152 $posts_columns['date'] = _x( 'Date', 'column name' );153 $posts_columns = apply_filters( 'manage_media_columns', $posts_columns, 'upload' != $this->_screen->id );154 155 return $posts_columns;156 }157 158 function get_sortable_columns() {159 return array(160 'title' => 'title',161 'author' => 'author',162 'parent' => 'parent',163 'comments' => 'comment_count',164 'date' => 'date',165 );166 }167 168 function display_rows() {169 global $detached, $post, $id;170 171 if ( $detached ) {172 $this->display_orphans();173 return;174 }175 176 add_filter( 'the_title','esc_html' );177 $alt = '';178 179 while ( have_posts() ) : the_post();180 181 if ( $this->is_trash && $post->post_status != 'trash'182 || !$this->is_trash && $post->post_status == 'trash' )183 continue;184 185 $alt = ( 'alternate' == $alt ) ? '' : 'alternate';186 $post_owner = ( get_current_user_id() == $post->post_author ) ? 'self' : 'other';187 $att_title = _draft_or_post_title();188 ?>189 <tr id='post-<?php echo $id; ?>' class='<?php echo trim( $alt . ' author-' . $post_owner . ' status-' . $post->post_status ); ?>' valign="top">190 <?php191 192 list( $columns, $hidden ) = $this->get_column_info();193 foreach ( $columns as $column_name => $column_display_name ) {194 $class = "class='$column_name column-$column_name'";195 196 $style = '';197 if ( in_array( $column_name, $hidden ) )198 $style = ' style="display:none;"';199 200 $attributes = $class . $style;201 202 switch ( $column_name ) {203 204 case 'cb':205 ?>206 <th scope="row" class="check-column"><?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?><input type="checkbox" name="media[]" value="<?php the_ID(); ?>" /><?php } ?></th>207 <?php208 break;209 210 case 'icon':211 $attributes = 'class="column-icon media-icon"' . $style;212 ?>213 <td <?php echo $attributes ?>><?php214 if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {215 if ( $this->is_trash ) {216 echo $thumb;217 } else {218 ?>219 <a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>">220 <?php echo $thumb; ?>221 </a>222 223 <?php }224 }225 ?>226 </td>227 <?php228 break;229 230 case 'title':231 ?>232 <td <?php echo $attributes ?>><strong><?php if ( $this->is_trash ) echo $att_title; else { ?><a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php echo $att_title; ?></a><?php } ?></strong>233 <p>234 <?php235 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )236 echo esc_html( strtoupper( $matches[1] ) );237 else238 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );239 ?>240 </p>241 <?php242 $actions = array();243 if ( current_user_can( 'edit_post', $post->ID ) && !$this->is_trash )244 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';245 if ( current_user_can( 'delete_post', $post->ID ) ) {246 if ( $this->is_trash )247 $actions['untrash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=untrash&post=$post->ID", 'untrash-attachment_' . $post->ID ) . "'>" . __( 'Restore' ) . "</a>";248 elseif ( EMPTY_TRASH_DAYS && MEDIA_TRASH )249 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";250 if ( $this->is_trash || !EMPTY_TRASH_DAYS || !MEDIA_TRASH ) {251 $delete_ays = ( !$this->is_trash && !MEDIA_TRASH ) ? " onclick='return showNotice.warn();'" : '';252 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";253 }254 }255 if ( !$this->is_trash ) {256 $title =_draft_or_post_title( $post->post_parent );257 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';258 }259 $actions = apply_filters( 'media_row_actions', $actions, $post );260 echo $this->row_actions( $actions );261 ?>262 </td>263 <?php264 break;265 266 case 'author':267 ?>268 <td <?php echo $attributes ?>><?php the_author() ?></td>269 <?php270 break;271 272 case 'tags':273 ?>274 <td <?php echo $attributes ?>><?php275 $tags = get_the_tags();276 if ( !empty( $tags ) ) {277 $out = array();278 foreach ( $tags as $c )279 $out[] = "<a href='edit.php?tag=$c->slug'> " . esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'post_tag', 'display' ) ) . "</a>";280 echo join( ', ', $out );281 } else {282 _e( 'No Tags' );283 }284 ?>285 </td>286 <?php287 break;288 289 case 'desc':290 ?>291 <td <?php echo $attributes ?>><?php echo has_excerpt() ? $post->post_excerpt : ''; ?></td>292 <?php293 break;294 295 case 'date':296 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {297 $t_time = $h_time = __( 'Unpublished' );298 } else {299 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );300 $m_time = $post->post_date;301 $time = get_post_time( 'G', true, $post, false );302 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {303 if ( $t_diff < 0 )304 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );305 else306 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );307 } else {308 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );309 }310 }311 ?>312 <td <?php echo $attributes ?>><?php echo $h_time ?></td>313 <?php314 break;315 316 case 'parent':317 if ( $post->post_parent > 0 ) {318 if ( get_post( $post->post_parent ) ) {319 $title =_draft_or_post_title( $post->post_parent );320 }321 ?>322 <td <?php echo $attributes ?>>323 <strong><a href="<?php echo get_edit_post_link( $post->post_parent ); ?>"><?php echo $title ?></a></strong>,324 <?php echo get_the_time( __( 'Y/m/d' ) ); ?>325 </td>326 <?php327 } else {328 ?>329 <td <?php echo $attributes ?>><?php _e( '(Unattached)' ); ?><br />330 <a class="hide-if-no-js" onclick="findPosts.open( 'media[]','<?php echo $post->ID ?>' );return false;" href="#the-list"><?php _e( 'Attach' ); ?></a></td>331 <?php332 }333 break;334 335 case 'comments':336 $attributes = 'class="comments column-comments num"' . $style;337 ?>338 <td <?php echo $attributes ?>>339 <div class="post-com-count-wrapper">340 <?php341 $pending_comments = get_pending_comments_num( $post->ID );342 343 $this->comments_bubble( $post->ID, $pending_comments );344 ?>345 </div>346 </td>347 <?php348 break;349 350 case 'actions':351 ?>352 <td <?php echo $attributes ?>>353 <a href="media.php?action=edit&attachment_id=<?php the_ID(); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php _e( 'Edit' ); ?></a> |354 <a href="<?php the_permalink(); ?>"><?php _e( 'Get permalink' ); ?></a>355 </td>356 <?php357 break;358 359 default:360 ?>361 <td <?php echo $attributes ?>>362 <?php do_action( 'manage_media_custom_column', $column_name, $id ); ?>363 </td>364 <?php365 break;366 }367 }368 ?>369 </tr>370 <?php endwhile;371 }372 373 function display_orphans() {374 global $post;375 376 $class = '';377 378 while ( have_posts() ) : the_post();379 380 $class = ( 'alternate' == $class ) ? '' : 'alternate';381 $att_title = esc_html( _draft_or_post_title( $post->ID ) );382 383 $edit_link = '<a href="' . get_edit_post_link( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ) . '">%s</a>';384 ?>385 <tr id='post-<?php echo $post->ID; ?>' class='<?php echo $class; ?>' valign="top">386 <th scope="row" class="check-column">387 <?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?>388 <input type="checkbox" name="media[]" value="<?php echo esc_attr( $post->ID ); ?>" />389 <?php } ?>390 </th>391 392 <td class="media-icon">393 <?php if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {394 printf( $edit_link, $thumb );395 } ?>396 </td>397 398 <td class="media column-media">399 <strong><?php printf( $edit_link, $att_title ); ?></strong><br />400 <?php401 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )402 echo esc_html( strtoupper( $matches[1] ) );403 else404 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );405 ?>406 <?php407 $actions = array();408 if ( current_user_can( 'edit_post', $post->ID ) )409 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';410 if ( current_user_can( 'delete_post', $post->ID ) )411 if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) {412 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";413 } else {414 $delete_ays = !MEDIA_TRASH ? " onclick='return showNotice.warn();'" : '';415 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";416 }417 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $att_title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';418 if ( current_user_can( 'edit_post', $post->ID ) )419 $actions['attach'] = '<a href="#the-list" onclick="findPosts.open( \'media[]\',\''.$post->ID.'\' );return false;" class="hide-if-no-js">'.__( 'Attach' ).'</a>';420 $actions = apply_filters( 'media_row_actions', $actions, $post );421 422 echo $this->row_actions( $actions );423 ?>424 </td>425 <td class="author column-author">426 <?php $author = get_userdata( $post->post_author ); echo $author->display_name; ?>427 </td>428 <?php429 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {430 $t_time = $h_time = __( 'Unpublished' );431 } else {432 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );433 $m_time = $post->post_date;434 $time = get_post_time( 'G', true );435 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {436 if ( $t_diff < 0 )437 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );438 else439 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );440 } else {441 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );442 }443 }444 ?>445 <td class="date column-date"><?php echo $h_time ?></td>446 </tr>447 <?php448 endwhile;449 }450 }451 452 class WP_Terms_Table extends WP_List_Table {453 454 var $callback_args;455 456 function WP_Terms_Table() {457 global $post_type, $taxonomy, $tax, $current_screen;458 459 wp_reset_vars( array( 'action', 'taxonomy', 'post_type' ) );460 461 if ( empty( $taxonomy ) )462 $taxonomy = 'post_tag';463 464 if ( !taxonomy_exists( $taxonomy ) )465 wp_die( __( 'Invalid taxonomy' ) );466 467 $tax = get_taxonomy( $taxonomy );468 469 if ( empty( $post_type ) || !in_array( $post_type, get_post_types( array( 'public' => true ) ) ) )470 $post_type = 'post';471 472 if ( !isset( $current_screen ) )473 set_current_screen( 'edit-' . $taxonomy );474 475 parent::WP_List_Table( array(476 'screen' => $current_screen,477 'plural' => 'tags',478 'singular' => 'tag',479 ) );480 }481 482 function check_permissions( $type = 'manage' ) {483 global $tax;484 485 $cap = 'manage' == $type ? $tax->cap->manage_terms : $tax->cap->edit_terms;486 487 if ( !current_user_can( $tax->cap->manage_terms ) )488 wp_die( __( 'Cheatin’ uh?' ) );489 }490 491 function prepare_items() {492 global $taxonomy;493 494 $tags_per_page = $this->get_items_per_page( 'edit_' . $taxonomy . '_per_page' );495 496 if ( 'post_tag' == $taxonomy ) {497 $tags_per_page = apply_filters( 'edit_tags_per_page', $tags_per_page );498 $tags_per_page = apply_filters( 'tagsperpage', $tags_per_page ); // Old filter499 } elseif ( 'category' == $taxonomy ) {500 $tags_per_page = apply_filters( 'edit_categories_per_page', $tags_per_page ); // Old filter501 }502 503 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';504 505 $args = array(506 'search' => $search,507 'page' => $this->get_pagenum(),508 'number' => $tags_per_page,509 );510 511 if ( !empty( $_REQUEST['orderby'] ) )512 $args['orderby'] = trim( stripslashes( $_REQUEST['orderby'] ) );513 514 if ( !empty( $_REQUEST['order'] ) )515 $args['order'] = trim( stripslashes( $_REQUEST['order'] ) );516 517 $this->callback_args = $args;518 519 $this->set_pagination_args( array(520 'total_items' => wp_count_terms( $taxonomy, compact( 'search' ) ),521 'per_page' => $tags_per_page,522 ) );523 }524 525 function get_bulk_actions() {526 $actions = array();527 $actions['delete'] = __( 'Delete' );528 529 return $actions;530 }531 532 function current_action() {533 if ( isset( $_REQUEST['action'] ) && isset( $_REQUEST['delete_tags'] ) && ( 'delete' == $_REQUEST['action'] || 'delete' == $_REQUEST['action2'] ) )534 return 'bulk-delete';535 536 return parent::current_action();537 }538 539 function get_columns() {540 global $taxonomy;541 542 $columns = array(543 'cb' => '<input type="checkbox" />',544 'name' => __( 'Name' ),545 'description' => __( 'Description' ),546 'slug' => __( 'Slug' ),547 );548 549 if ( 'link_category' == $taxonomy )550 $columns['links'] = __( 'Links' );551 else552 $columns['posts'] = __( 'Posts' );553 554 return $columns;555 }556 557 function get_sortable_columns() {558 return array(559 'name' => 'name',560 'description' => 'description',561 'slug' => 'slug',562 'posts' => 'count',563 'links' => 'count'564 );565 }566 567 function display_rows() {568 global $taxonomy;569 570 $args = wp_parse_args( $this->callback_args, array(571 'page' => 1,572 'number' => 20,573 'search' => '',574 'hide_empty' => 0575 ) );576 577 extract( $args, EXTR_SKIP );578 579 $args['offset'] = $offset = ( $page - 1 ) * $number;580 581 // convert it to table rows582 $out = '';583 $count = 0;584 if ( is_taxonomy_hierarchical( $taxonomy ) && !isset( $orderby ) ) {585 // We'll need the full set of terms then.586 $args['number'] = $args['offset'] = 0;587 588 $terms = get_terms( $taxonomy, $args );589 if ( !empty( $search ) ) // Ignore children on searches.590 $children = array();591 else592 $children = _get_term_hierarchy( $taxonomy );593 594 // Some funky recursion to get the job done( Paging & parents mainly ) is contained within, Skip it for non-hierarchical taxonomies for performance sake595 $out .= $this->_rows( $taxonomy, $terms, $children, $offset, $number, $count );596 } else {597 $terms = get_terms( $taxonomy, $args );598 foreach ( $terms as $term )599 $out .= $this->single_row( $term, 0, $taxonomy );600 $count = $number; // Only displaying a single page.601 }602 603 echo $out;604 }605 606 function _rows( $taxonomy, $terms, &$children, $start = 0, $per_page = 20, &$count, $parent = 0, $level = 0 ) {607 608 $end = $start + $per_page;609 610 $output = '';611 foreach ( $terms as $key => $term ) {612 613 if ( $count >= $end )614 break;615 616 if ( $term->parent != $parent && empty( $_REQUEST['s'] ) )617 continue;618 619 // If the page starts in a subtree, print the parents.620 if ( $count == $start && $term->parent > 0 && empty( $_REQUEST['s'] ) ) {621 $my_parents = $parent_ids = array();622 $p = $term->parent;623 while ( $p ) {624 $my_parent = get_term( $p, $taxonomy );625 $my_parents[] = $my_parent;626 $p = $my_parent->parent;627 if ( in_array( $p, $parent_ids ) ) // Prevent parent loops.628 break;629 $parent_ids[] = $p;630 }631 unset( $parent_ids );632 633 $num_parents = count( $my_parents );634 while ( $my_parent = array_pop( $my_parents ) ) {635 $output .= "\t" . $this->single_row( $my_parent, $level - $num_parents, $taxonomy );636 $num_parents--;637 }638 }639 640 if ( $count >= $start )641 $output .= "\t" . $this->single_row( $term, $level, $taxonomy );642 643 ++$count;644 645 unset( $terms[$key] );646 647 if ( isset( $children[$term->term_id] ) && empty( $_REQUEST['s'] ) )648 $output .= $this->_rows( $taxonomy, $terms, $children, $start, $per_page, $count, $term->term_id, $level + 1 );649 }650 651 return $output;652 }653 654 function single_row( $tag, $level = 0 ) {655 static $row_class = '';656 $row_class = ( $row_class == '' ? ' class="alternate"' : '' );657 658 $this->level = $level;659 660 echo '<tr id="tag-' . $tag->term_id . '"' . $row_class . '>';661 echo $this->single_row_columns( $tag );662 echo '</tr>';663 }664 665 function column_cb( $tag ) {666 global $taxonomy, $tax;667 668 $default_term = get_option( 'default_' . $taxonomy );669 670 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )671 return '<input type="checkbox" name="delete_tags[]" value="' . $tag->term_id . '" />';672 else673 return ' ';674 }675 676 function column_name( $tag ) {677 global $taxonomy, $tax, $post_type;678 679 $default_term = get_option( 'default_' . $taxonomy );680 681 $pad = str_repeat( '— ', max( 0, $this->level ) );682 $name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag );683 $qe_data = get_term( $tag->term_id, $taxonomy, OBJECT, 'edit' );684 $edit_link = get_edit_term_link( $tag->term_id, $taxonomy, $post_type );685 686 $out = '<strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $name ) ) . '">' . $name . '</a></strong><br />';687 688 $actions = array();689 if ( current_user_can( $tax->cap->edit_terms ) ) {690 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';691 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __( 'Quick Edit' ) . '</a>';692 }693 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )694 $actions['delete'] = "<a class='delete-tag' href='" . wp_nonce_url( "edit-tags.php?action=delete&taxonomy=$taxonomy&tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id ) . "'>" . __( 'Delete' ) . "</a>";695 696 $actions = apply_filters( 'tag_row_actions', $actions, $tag );697 $actions = apply_filters( "${taxonomy}_row_actions", $actions, $tag );698 699 $out .= $this->row_actions( $actions );700 $out .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';701 $out .= '<div class="name">' . $qe_data->name . '</div>';702 $out .= '<div class="slug">' . apply_filters( 'editable_slug', $qe_data->slug ) . '</div>';703 $out .= '<div class="parent">' . $qe_data->parent . '</div></div></td>';704 705 return $out;706 }707 708 function column_description( $tag ) {709 return $tag->description;710 }711 712 function column_slug( $tag ) {713 return apply_filters( 'editable_slug', $tag->slug );714 }715 716 function column_posts( $tag ) {717 global $taxonomy, $post_type;718 719 $count = number_format_i18n( $tag->count );720 721 if ( 'post_tag' == $taxonomy ) {722 $tagsel = 'tag';723 } elseif ( 'category' == $taxonomy ) {724 $tagsel = 'category_name';725 } elseif ( ! empty( $tax->query_var ) ) {726 $tagsel = $tax->query_var;727 } else {728 $tagsel = $taxonomy;729 }730 731 return "<a href='edit.php?$tagsel=$tag->slug&post_type=$post_type'>$count</a>";732 }733 734 function column_links( $tag ) {735 $count = number_format_i18n( $tag->count );736 return $count;737 }738 739 function column_default( $tag, $column_name ) {740 global $taxonomy;741 742 return apply_filters( "manage_${taxonomy}_custom_column", '', $column_name, $tag->term_id );743 $out .= "</td>";744 }745 746 /**747 * Outputs the hidden row displayed when inline editing748 *749 * @since 3.1.0750 */751 function inline_edit() {752 global $tax;753 754 if ( ! current_user_can( $tax->cap->edit_terms ) )755 return;756 757 list( $columns, $hidden ) = $this->get_column_info();758 759 $col_count = count( $columns ) - count( $hidden );760 ?>761 762 <form method="get" action=""><table style="display: none"><tbody id="inlineedit">763 <tr id="inline-edit" class="inline-edit-row" style="display: none"><td colspan="<?php echo $col_count; ?>">764 765 <fieldset><div class="inline-edit-col">766 <h4><?php _e( 'Quick Edit' ); ?></h4>767 768 <label>769 <span class="title"><?php _e( 'Name' ); ?></span>770 <span class="input-text-wrap"><input type="text" name="name" class="ptitle" value="" /></span>771 </label>772 <?php if ( !global_terms_enabled() ) { ?>773 <label>774 <span class="title"><?php _e( 'Slug' ); ?></span>775 <span class="input-text-wrap"><input type="text" name="slug" class="ptitle" value="" /></span>776 </label>777 <?php } ?>778 779 </div></fieldset>780 <?php781 782 $core_columns = array( 'cb' => true, 'description' => true, 'name' => true, 'slug' => true, 'posts' => true );783 784 foreach ( $columns as $column_name => $column_display_name ) {785 if ( isset( $core_columns[$column_name] ) )786 continue;787 do_action( 'quick_edit_custom_box', $column_name, $type, $tax->taxonomy );788 }789 790 ?>791 792 <p class="inline-edit-save submit">793 <a accesskey="c" href="#inline-edit" title="<?php _e( 'Cancel' ); ?>" class="cancel button-secondary alignleft"><?php _e( 'Cancel' ); ?></a>794 <?php $update_text = $tax->labels->update_item; ?>795 <a accesskey="s" href="#inline-edit" title="<?php echo esc_attr( $update_text ); ?>" class="save button-primary alignright"><?php echo $update_text; ?></a>796 <img class="waiting" style="display:none;" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" />797 <span class="error" style="display:none;"></span>798 <?php wp_nonce_field( 'taxinlineeditnonce', '_inline_edit', false ); ?>799 <input type="hidden" name="taxonomy" value="<?php echo esc_attr( $tax->name ); ?>" />800 <br class="clear" />801 </p>802 </td></tr>803 </tbody></table></form>804 <?php805 }806 }807 808 class WP_Users_Table extends WP_List_Table {809 810 function WP_Users_Table() {811 parent::WP_List_Table( array(812 'screen' => 'users',813 'plural' => 'users'814 ) );815 }816 817 function check_permissions() {818 if ( !current_user_can('list_users') )819 wp_die(__('Cheatin’ uh?'));820 }821 822 function prepare_items() {823 global $role, $usersearch;824 825 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';826 827 $role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : '';828 829 $users_per_page = $this->get_items_per_page( 'users_per_page' );830 831 $paged = $this->get_pagenum();832 833 $args = array(834 'number' => $users_per_page,835 'offset' => ( $paged-1 ) * $users_per_page,836 'role' => $role,837 'search' => $usersearch838 );839 840 if ( isset( $_REQUEST['orderby'] ) )841 $args['orderby'] = $_REQUEST['orderby'];842 843 if ( isset( $_REQUEST['order'] ) )844 $args['order'] = $_REQUEST['order'];845 846 // Query the user IDs for this page847 $wp_user_search = new WP_User_Query( $args );848 849 $this->items = $wp_user_search->get_results();850 851 $this->set_pagination_args( array(852 'total_items' => $wp_user_search->get_total(),853 'per_page' => $users_per_page,854 ) );855 }856 857 function no_items() {858 _e( 'No matching users were found.' );859 }860 861 function get_views() {862 global $wp_roles, $role;863 864 $users_of_blog = count_users();865 $total_users = $users_of_blog['total_users'];866 $avail_roles =& $users_of_blog['avail_roles'];867 unset($users_of_blog);868 869 $current_role = false;870 $class = empty($role) ? ' class="current"' : '';871 $role_links = array();872 $role_links['all'] = "<li><a href='users.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>';873 foreach ( $wp_roles->get_names() as $this_role => $name ) {874 if ( !isset($avail_roles[$this_role]) )875 continue;876 877 $class = '';878 879 if ( $this_role == $role ) {880 $current_role = $role;881 $class = ' class="current"';882 }883 884 $name = translate_user_role( $name );885 /* translators: User role name with count */886 $name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, $avail_roles[$this_role] );887 $role_links[$this_role] = "<li><a href='users.php?role=$this_role'$class>$name</a>";888 }889 890 return $role_links;891 }892 893 function get_bulk_actions() {894 $actions = array();895 896 if ( !is_multisite() && current_user_can( 'delete_users' ) )897 $actions['delete'] = __( 'Delete' );898 else899 $actions['remove'] = __( 'Remove' );900 901 return $actions;902 }903 904 function extra_tablenav( $which ) {905 if ( 'top' != $which )906 return;907 ?>908 <div class="alignleft actions">909 <label class="screen-reader-text" for="new_role"><?php _e( 'Change role to…' ) ?></label>910 <select name="new_role" id="new_role">911 <option value=''><?php _e( 'Change role to…' ) ?></option>912 <?php wp_dropdown_roles(); ?>913 </select>914 <input type="submit" value="<?php esc_attr_e( 'Change' ); ?>" name="changeit" class="button-secondary" />915 </div>916 <?php917 }918 919 function current_action() {920 if ( isset($_REQUEST['changeit']) && !empty($_REQUEST['new_role']) )921 return 'promote';922 923 return parent::current_action();924 }925 926 function get_columns() {927 return array(928 'cb' => '<input type="checkbox" />',929 'username' => __( 'Login' ),930 'name' => __( 'Name' ),931 'email' => __( 'E-mail' ),932 'role' => __( 'Role' ),933 'posts' => __( 'Posts' )934 );935 }936 937 function get_sortable_columns() {938 return array(939 'username' => 'login',940 'name' => 'name',941 'email' => 'email',942 'posts' => 'post_count',943 );944 }945 946 function display_rows() {947 // Query the post counts for this page948 $post_counts = count_many_users_posts( array_keys( $this->items ) );949 950 $style = '';951 foreach ( $this->items as $userid => $user_object ) {952 $role = reset( $user_object->roles );953 954 if ( is_multisite() && empty( $role ) )955 continue;956 957 $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"';958 echo "\n\t", $this->single_row( $user_object, $style, $role, $post_counts[ $userid ] );959 }960 }961 962 /**963 * Generate HTML for a single row on the users.php admin panel.964 *965 * @since 2.1.0966 *967 * @param object $user_object968 * @param string $style Optional. Attributes added to the TR element. Must be sanitized.969 * @param string $role Key for the $wp_roles array.970 * @param int $numposts Optional. Post count to display for this user. Defaults to zero, as in, a new user has made zero posts.971 * @return string972 */973 function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) {974 global $wp_roles;975 976 if ( !( is_object( $user_object ) && is_a( $user_object, 'WP_User' ) ) )977 $user_object = new WP_User( (int) $user_object );978 $user_object = sanitize_user_object( $user_object, 'display' );979 $email = $user_object->user_email;980 $url = $user_object->user_url;981 $short_url = str_replace( 'http://', '', $url );982 $short_url = str_replace( 'www.', '', $short_url );983 if ( '/' == substr( $short_url, -1 ) )984 $short_url = substr( $short_url, 0, -1 );985 if ( strlen( $short_url ) > 35 )986 $short_url = substr( $short_url, 0, 32 ).'...';987 $checkbox = '';988 // Check if the user for this row is editable989 if ( current_user_can( 'list_users' ) ) {990 // Set up the user editing link991 // TODO: make profile/user-edit determination a separate function992 if ( get_current_user_id() == $user_object->ID ) {993 $edit_link = 'profile.php';994 } else {995 $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( esc_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" ) );996 }997 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";998 999 // Set up the hover actions for this user1000 $actions = array();1001 1002 if ( current_user_can( 'edit_user', $user_object->ID ) ) {1003 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";1004 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';1005 } else {1006 $edit = "<strong>$user_object->user_login</strong><br />";1007 }1008 1009 if ( !is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) )1010 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=delete&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Delete' ) . "</a>";1011 if ( is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'remove_user', $user_object->ID ) )1012 $actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=remove&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . "</a>";1013 $actions = apply_filters( 'user_row_actions', $actions, $user_object );1014 $edit .= $this->row_actions( $actions );1015 1016 // Set up the checkbox ( because the user is editable, otherwise its empty )1017 $checkbox = "<input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='$role' value='{$user_object->ID}' />";1018 1019 } else {1020 $edit = '<strong>' . $user_object->user_login . '</strong>';1021 }1022 $role_name = isset( $wp_roles->role_names[$role] ) ? translate_user_role( $wp_roles->role_names[$role] ) : __( 'None' );1023 $r = "<tr id='user-$user_object->ID'$style>";1024 $avatar = get_avatar( $user_object->ID, 32 );1025 1026 list( $columns, $hidden ) = $this->get_column_info();1027 1028 foreach ( $columns as $column_name => $column_display_name ) {1029 $class = "class=\"$column_name column-$column_name\"";1030 1031 $style = '';1032 if ( in_array( $column_name, $hidden ) )1033 $style = ' style="display:none;"';1034 1035 $attributes = "$class$style";1036 1037 switch ( $column_name ) {1038 case 'cb':1039 $r .= "<th scope='row' class='check-column'>$checkbox</th>";1040 break;1041 case 'username':1042 $r .= "<td $attributes>$avatar $edit</td>";1043 break;1044 case 'name':1045 $r .= "<td $attributes>$user_object->first_name $user_object->last_name</td>";1046 break;1047 case 'email':1048 $r .= "<td $attributes><a href='mailto:$email' title='" . sprintf( __( 'E-mail: %s' ), $email ) . "'>$email</a></td>";1049 break;1050 case 'role':1051 $r .= "<td $attributes>$role_name</td>";1052 break;1053 case 'posts':1054 $attributes = 'class="posts column-posts num"' . $style;1055 $r .= "<td $attributes>";1056 if ( $numposts > 0 ) {1057 $r .= "<a href='edit.php?author=$user_object->ID' title='" . __( 'View posts by this author' ) . "' class='edit'>";1058 $r .= $numposts;1059 $r .= '</a>';1060 } else {1061 $r .= 0;1062 }1063 $r .= "</td>";1064 break;1065 default:1066 $r .= "<td $attributes>";1067 $r .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID );1068 $r .= "</td>";1069 }1070 }1071 $r .= '</tr>';1072 1073 return $r;1074 }1075 }1076 1077 class WP_Comments_Table extends WP_List_Table {1078 1079 var $checkbox = true;1080 var $from_ajax = false;1081 1082 var $pending_count = array();1083 1084 function WP_Comments_Table() {1085 global $mode;1086 1087 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'detail' : $_REQUEST['mode'];1088 1089 if ( get_option('show_avatars') && 'single' != $mode )1090 add_filter( 'comment_author', 'floated_admin_avatar' );1091 1092 parent::WP_List_Table( array(1093 'screen' => 'edit-comments',1094 'plural' => 'comments'1095 ) );1096 }1097 1098 function check_permissions() {1099 if ( !current_user_can('edit_posts') )1100 wp_die(__('Cheatin’ uh?'));1101 }1102 1103 function prepare_items() {1104 global $post_id, $comment_status, $search;1105 1106 if ( isset( $_REQUEST['p'] ) )1107 $post_id = absint( $_REQUEST['p'] );1108 elseif ( isset( $_REQUEST['post'] ) )1109 $post_id = absint( $_REQUEST['post'] );1110 elseif ( isset( $_REQUEST['post_ID'] ) )1111 $post_id = absint( $_REQUEST['post_ID'] );1112 else1113 $post_id = 0;1114 1115 $comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all';1116 if ( !in_array( $comment_status, array( 'all', 'moderated', 'approved', 'spam', 'trash' ) ) )1117 $comment_status = 'all';1118 1119 $comment_type = !empty( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : '';1120 1121 $search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : '';1122 1123 $user_id = ( isset( $_REQUEST['user_id'] ) ) ? $_REQUEST['user_id'] : '';1124 1125 $comments_per_page = $this->get_items_per_page( 'edit_comments_per_page' );1126 $comments_per_page = apply_filters( 'comments_per_page', $comments_per_page, $comment_status );1127 1128 if ( isset( $_POST['number'] ) )1129 $number = (int) $_POST['number'];1130 else1131 $number = $comments_per_page + min( 8, $comments_per_page ); // Grab a few extra1132 1133 $page = $this->get_pagenum();1134 1135 $start = $offset = ( $page - 1 ) * $comments_per_page;1136 1137 $status_map = array(1138 'moderated' => 'hold',1139 'approved' => 'approve'1140 );1141 1142 $args = array(1143 'status' => isset( $status_map[$comment_status] ) ? $status_map[$comment_status] : $comment_status,1144 'search' => $search,1145 'user_id' => $user_id,1146 'offset' => $start,1147 'number' => $number,1148 'post_id' => $post_id,1149 'type' => $comment_type,1150 'orderby' => @$_REQUEST['orderby'],1151 'order' => @$_REQUEST['order'],1152 );1153 1154 $_comments = get_comments( $args );1155 1156 update_comment_cache( $_comments );1157 1158 $this->items = array_slice( $_comments, 0, $comments_per_page );1159 $this->extra_items = array_slice( $_comments, $comments_per_page );1160 1161 $total_comments = get_comments( array_merge( $args, array('count' => true, 'offset' => 0, 'number' => 0) ) );1162 1163 $_comment_post_ids = array();1164 foreach ( $_comments as $_c ) {1165 $_comment_post_ids[] = $_c->comment_post_ID;1166 }1167 1168 $this->pending_count = get_pending_comments_num( $_comment_post_ids );1169 1170 $this->set_pagination_args( array(1171 'total_items' => $total_comments,1172 'per_page' => $comments_per_page,1173 ) );1174 }1175 1176 function get_views() {1177 global $post_id, $comment_status;1178 1179 $status_links = array();1180 $num_comments = ( $post_id ) ? wp_count_comments( $post_id ) : wp_count_comments();1181 //, number_format_i18n($num_comments->moderated) ), "<span class='comment-count'>" . number_format_i18n($num_comments->moderated) . "</span>"),1182 //, number_format_i18n($num_comments->spam) ), "<span class='spam-comment-count'>" . number_format_i18n($num_comments->spam) . "</span>")1183 $stati = array(1184 'all' => _nx_noop('All', 'All', 'comments'), // singular not used1185 'moderated' => _n_noop('Pending <span class="count">(<span class="pending-count">%s</span>)</span>', 'Pending <span class="count">(<span class="pending-count">%s</span>)</span>'),1186 'approved' => _n_noop('Approved', 'Approved'), // singular not used1187 'spam' => _n_noop('Spam <span class="count">(<span class="spam-count">%s</span>)</span>', 'Spam <span class="count">(<span class="spam-count">%s</span>)</span>'),1188 'trash' => _n_noop('Trash <span class="count">(<span class="trash-count">%s</span>)</span>', 'Trash <span class="count">(<span class="trash-count">%s</span>)</span>')1189 );1190 1191 if ( !EMPTY_TRASH_DAYS )1192 unset($stati['trash']);1193 1194 $link = 'edit-comments.php';1195 if ( !empty($comment_type) && 'all' != $comment_type )1196 $link = add_query_arg( 'comment_type', $comment_type, $link );1197 1198 foreach ( $stati as $status => $label ) {1199 $class = ( $status == $comment_status ) ? ' class="current"' : '';1200 1201 if ( !isset( $num_comments->$status ) )1202 $num_comments->$status = 10;1203 $link = add_query_arg( 'comment_status', $status, $link );1204 if ( $post_id )1205 $link = add_query_arg( 'p', absint( $post_id ), $link );1206 /*1207 // I toyed with this, but decided against it. Leaving it in here in case anyone thinks it is a good idea. ~ Mark1208 if ( !empty( $_REQUEST['s'] ) )1209 $link = add_query_arg( 's', esc_attr( stripslashes( $_REQUEST['s'] ) ), $link );1210 */1211 $status_links[$status] = "<li class='$status'><a href='$link'$class>" . sprintf(1212 _n( $label[0], $label[1], $num_comments->$status ),1213 number_format_i18n( $num_comments->$status )1214 ) . '</a>';1215 }1216 1217 $status_links = apply_filters( 'comment_status_links', $status_links );1218 return $status_links;1219 }1220 1221 function get_bulk_actions() {1222 global $comment_status;1223 1224 $actions = array();1225 if ( in_array( $comment_status, array( 'all', 'approved' ) ) )1226 $actions['unapprove'] = __( 'Unapprove' );1227 if ( in_array( $comment_status, array( 'all', 'moderated', 'spam' ) ) )1228 $actions['approve'] = __( 'Approve' );1229 if ( in_array( $comment_status, array( 'all', 'moderated', 'approved' ) ) )1230 $actions['spam'] = _x( 'Mark as Spam', 'comment' );1231 1232 if ( 'trash' == $comment_status )1233 $actions['untrash'] = __( 'Restore' );1234 elseif ( 'spam' == $comment_status )1235 $actions['unspam'] = _x( 'Not Spam', 'comment' );1236 1237 if ( in_array( $comment_status, array( 'trash', 'spam' ) ) || !EMPTY_TRASH_DAYS )1238 $actions['delete'] = __( 'Delete Permanently' );1239 else1240 $actions['trash'] = __( 'Move to Trash' );1241 1242 return $actions;1243 }1244 1245 function extra_tablenav( $which ) {1246 global $comment_status, $comment_type;1247 ?>1248 <div class="alignleft actions">1249 <?php1250 if ( 'top' == $which ) {1251 ?>1252 <select name="comment_type">1253 <option value=""><?php _e( 'Show all comment types' ); ?></option>1254 <?php1255 $comment_types = apply_filters( 'admin_comment_types_dropdown', array(1256 'comment' => __( 'Comments' ),1257 'pings' => __( 'Pings' ),1258 ) );1259 1260 foreach ( $comment_types as $type => $label )1261 echo "\t<option value='" . esc_attr( $type ) . "'" . selected( $comment_type, $type, false ) . ">$label</option>\n";1262 ?>1263 </select>1264 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />1265 <?php1266 }1267 1268 if ( ( 'spam' == $comment_status || 'trash' == $comment_status ) && current_user_can( 'moderate_comments' ) ) {1269 wp_nonce_field( 'bulk-destroy', '_destroy_nonce' );1270 $title = ( 'spam' == $comment_status ) ? esc_attr__( 'Empty Spam' ) : esc_attr__( 'Empty Trash' );1271 ?>1272 <input type="submit" name="delete_all" id="delete_all" value="<?php echo $title ?>" class="button-secondary apply" />1273 <?php1274 }1275 ?>1276 <?php1277 do_action( 'manage_comments_nav', $comment_status );1278 echo '</div>';1279 }1280 1281 function current_action() {1282 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )1283 return 'delete_all';1284 1285 return parent::current_action();1286 }1287 1288 function get_columns() {1289 global $mode;1290 1291 $columns = array();1292 1293 if ( $this->checkbox )1294 $columns['cb'] = '<input type="checkbox" />';1295 1296 $columns['author'] = __( 'Author' );1297 $columns['comment'] = _x( 'Comment', 'column name' );1298 1299 if ( 'single' !== $mode )1300 $columns['response'] = _x( 'Comment', 'column name' );1301 1302 return $columns;1303 }1304 1305 function get_sortable_columns() {1306 return array(1307 'author' => 'comment_author',1308 'comment' => 'comment_content',1309 'response' => 'comment_post_ID'1310 );1311 }1312 1313 function display_table() {1314 extract( $this->_args );1315 1316 $this->display_tablenav( 'top' );1317 1318 ?>1319 <table class="<?php echo implode( ' ', $this->get_table_classes() ); ?>" cellspacing="0">1320 <thead>1321 <tr>1322 <?php $this->print_column_headers(); ?>1323 </tr>1324 </thead>1325 1326 <tfoot>1327 <tr>1328 <?php $this->print_column_headers( false ); ?>1329 </tr>1330 </tfoot>1331 1332 <tbody id="the-comment-list" class="list:comment">1333 <?php $this->display_rows(); ?>1334 </tbody>1335 1336 <tbody id="the-extra-comment-list" class="list:comment" style="display: none;">1337 <?php $this->items = $this->extra_items; $this->display_rows(); ?>1338 </tbody>1339 </table>1340 <?php1341 1342 $this->display_tablenav( 'bottom' );1343 }1344 1345 function single_row( $a_comment ) {1346 global $post, $comment, $the_comment_status;1347 1348 $comment = $a_comment;1349 $the_comment_status = wp_get_comment_status( $comment->comment_ID );1350 1351 $post = get_post( $comment->comment_post_ID );1352 1353 $this->user_can = current_user_can( 'edit_comment', $comment->comment_ID );1354 1355 echo "<tr id='comment-$comment->comment_ID' class='$the_comment_status'>";1356 echo $this->single_row_columns( $comment );1357 echo "</tr>\n";1358 }1359 1360 function column_cb( $comment ) {1361 if ( $this->user_can )1362 echo "<input type='checkbox' name='delete_comments[]' value='$comment->comment_ID' />";1363 }1364 1365 function column_comment( $comment ) {1366 global $post, $comment_status, $the_comment_status;1367 1368 $user_can = $this->user_can;1369 1370 $comment_url = esc_url( get_comment_link( $comment->comment_ID ) );1371 1372 $ptime = date( 'G', strtotime( $comment->comment_date ) );1373 if ( ( abs( time() - $ptime ) ) < 86400 )1374 $ptime = sprintf( __( '%s ago' ), human_time_diff( $ptime ) );1375 else1376 $ptime = mysql2date( __( 'Y/m/d \a\t g:i A' ), $comment->comment_date );1377 1378 if ( $user_can ) {1379 $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) );1380 $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) );1381 1382 $url = "comment.php?c=$comment->comment_ID";1383 1384 $approve_url = esc_url( $url . "&action=approvecomment&$approve_nonce" );1385 $unapprove_url = esc_url( $url . "&action=unapprovecomment&$approve_nonce" );1386 $spam_url = esc_url( $url . "&action=spamcomment&$del_nonce" );1387 $unspam_url = esc_url( $url . "&action=unspamcomment&$del_nonce" );1388 $trash_url = esc_url( $url . "&action=trashcomment&$del_nonce" );1389 $untrash_url = esc_url( $url . "&action=untrashcomment&$del_nonce" );1390 $delete_url = esc_url( $url . "&action=deletecomment&$del_nonce" );1391 }1392 1393 echo '<div id="submitted-on">';1394 /* translators: 2: comment date, 3: comment time */1395 printf( __( '<a href="%1$s">%2$s at %3$s</a>' ), $comment_url,1396 /* translators: comment date format. See http://php.net/date */ get_comment_date( __( 'Y/m/d' ) ),1397 /* translators: comment time format. See http://php.net/date */ get_comment_date( get_option( 'time_format' ) ) );1398 1399 if ( $comment->comment_parent ) {1400 $parent = get_comment( $comment->comment_parent );1401 $parent_link = esc_url( get_comment_link( $comment->comment_parent ) );1402 $name = get_comment_author( $parent->comment_ID );1403 printf( ' | '.__( 'In reply to <a href="%1$s">%2$s</a>.' ), $parent_link, $name );1404 }1405 1406 echo '</div>';1407 comment_text();1408 if ( $user_can ) { ?>1409 <div id="inline-<?php echo $comment->comment_ID; ?>" class="hidden">1410 <textarea class="comment" rows="1" cols="1"><?php echo esc_html( apply_filters( 'comment_edit_pre', $comment->comment_content ) ); ?></textarea>1411 <div class="author-email"><?php echo esc_attr( $comment->comment_author_email ); ?></div>1412 <div class="author"><?php echo esc_attr( $comment->comment_author ); ?></div>1413 <div class="author-url"><?php echo esc_attr( $comment->comment_author_url ); ?></div>1414 <div class="comment_status"><?php echo $comment->comment_approved; ?></div>1415 </div>1416 <?php1417 }1418 1419 if ( $user_can ) {1420 // preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash1421 $actions = array(1422 'approve' => '', 'unapprove' => '',1423 'reply' => '',1424 'quickedit' => '',1425 'edit' => '',1426 'spam' => '', 'unspam' => '',1427 'trash' => '', 'untrash' => '', 'delete' => ''1428 );1429 1430 if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments1431 if ( 'approved' == $the_comment_status )1432 $actions['unapprove'] = "<a href='$unapprove_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=unapproved vim-u vim-destructive' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';1433 else if ( 'unapproved' == $the_comment_status )1434 $actions['approve'] = "<a href='$approve_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=approved vim-a vim-destructive' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';1435 } else {1436 $actions['approve'] = "<a href='$approve_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved vim-a' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';1437 $actions['unapprove'] = "<a href='$unapprove_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved vim-u' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';1438 }1439 1440 if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) {1441 $actions['spam'] = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1 vim-s vim-destructive' title='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>';1442 } elseif ( 'spam' == $the_comment_status ) {1443 $actions['unspam'] = "<a href='$unspam_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:unspam=1 vim-z vim-destructive'>" . _x( 'Not Spam', 'comment' ) . '</a>';1444 } elseif ( 'trash' == $the_comment_status ) {1445 $actions['untrash'] = "<a href='$untrash_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:untrash=1 vim-z vim-destructive'>" . __( 'Restore' ) . '</a>';1446 }1447 1448 if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) {1449 $actions['delete'] = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID::delete=1 delete vim-d vim-destructive'>" . __( 'Delete Permanently' ) . '</a>';1450 } else {1451 $actions['trash'] = "<a href='$trash_url' class='delete:the-comment-list:comment-$comment->comment_ID::trash=1 delete vim-d vim-destructive' title='" . esc_attr__( 'Move this comment to the trash' ) . "'>" . _x( 'Trash', 'verb' ) . '</a>';1452 }1453 1454 if ( 'trash' != $the_comment_status ) {1455 $actions['edit'] = "<a href='comment.php?action=editcomment&c={$comment->comment_ID}' title='" . esc_attr__( 'Edit comment' ) . "'>". __( 'Edit' ) . '</a>';1456 $actions['quickedit'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\',\'edit\' );return false;" class="vim-q" title="'.esc_attr__( 'Quick Edit' ).'" href="#">' . __( 'Quick Edit' ) . '</a>';1457 if ( 'spam' != $the_comment_status )1458 $actions['reply'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\' );return false;" class="vim-r" title="'.esc_attr__( 'Reply to this comment' ).'" href="#">' . __( 'Reply' ) . '</a>';1459 }1460 1461 $actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment );1462 1463 $i = 0;1464 echo '<div class="row-actions">';1465 foreach ( $actions as $action => $link ) {1466 ++$i;1467 ( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';1468 1469 // Reply and quickedit need a hide-if-no-js span when not added with ajax1470 if ( ( 'reply' == $action || 'quickedit' == $action ) && ! $this->from_ajax )1471 $action .= ' hide-if-no-js';1472 elseif ( ( $action == 'untrash' && $the_comment_status == 'trash' ) || ( $action == 'unspam' && $the_comment_status == 'spam' ) ) {1473 if ( '1' == get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) )1474 $action .= ' approve';1475 else1476 $action .= ' unapprove';1477 }1478 1479 echo "<span class='$action'>$sep$link</span>";1480 }1481 echo '</div>';1482 }1483 }1484 1485 function column_author( $comment ) {1486 global $comment_status;1487 1488 $author_url = get_comment_author_url();1489 if ( 'http://' == $author_url )1490 $author_url = '';1491 $author_url_display = preg_replace( '|http://(www\.)?|i', '', $author_url );1492 if ( strlen( $author_url_display ) > 50 )1493 $author_url_display = substr( $author_url_display, 0, 49 ) . '...';1494 1495 echo "<strong>"; comment_author(); echo '</strong><br />';1496 if ( !empty( $author_url ) )1497 echo "<a title='$author_url' href='$author_url'>$author_url_display</a><br />";1498 1499 if ( $this->user_can ) {1500 if ( !empty( $comment->comment_author_email ) ) {1501 comment_author_email_link();1502 echo '<br />';1503 }1504 echo '<a href="edit-comments.php?s=';1505 comment_author_IP();1506 echo '&mode=detail';1507 if ( 'spam' == $comment_status )1508 echo '&comment_status=spam';1509 echo '">';1510 comment_author_IP();1511 echo '</a>';1512 }1513 }1514 1515 function column_date( $comment ) {1516 return get_comment_date( __( 'Y/m/d \a\t g:ia' ) );1517 }1518 1519 function column_response( $comment ) {1520 global $post;1521 1522 if ( isset( $this->pending_count[$post->ID] ) ) {1523 $pending_comments = $this->pending_count[$post->ID];1524 } else {1525 $_pending_count_temp = get_pending_comments_num( array( $post->ID ) );1526 $pending_comments = $this->pending_count[$post->ID] = $_pending_count_temp[$post->ID];1527 }1528 1529 if ( current_user_can( 'edit_post', $post->ID ) ) {1530 $post_link = "<a href='" . get_edit_post_link( $post->ID ) . "'>";1531 $post_link .= get_the_title( $post->ID ) . '</a>';1532 } else {1533 $post_link = get_the_title( $post->ID );1534 }1535 1536 echo '<div class="response-links"><span class="post-com-count-wrapper">';1537 echo $post_link . '<br />';1538 $this->comments_bubble( $post->ID, $pending_comments );1539 echo '</span> ';1540 echo "<a href='" . get_permalink( $post->ID ) . "'>#</a>";1541 echo '</div>';1542 if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) )1543 echo $thumb;1544 }1545 1546 function column_default( $comment, $column_name ) {1547 do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID );1548 }1549 }1550 1551 class WP_Post_Comments_Table extends WP_Comments_Table {1552 1553 function get_columns() {1554 return array(1555 'author' => __( 'Author' ),1556 'comment' => _x( 'Comment', 'column name' ),1557 );1558 }1559 1560 function get_sortable_columns() {1561 return array();1562 }1563 }1564 1565 class WP_Links_Table extends WP_List_Table {1566 1567 function WP_Links_Table() {1568 parent::WP_List_Table( array(1569 'screen' => 'link-manager',1570 'plural' => 'bookmarks',1571 ) );1572 }1573 1574 function check_permissions() {1575 if ( ! current_user_can( 'manage_links' ) )1576 wp_die( __( 'You do not have sufficient permissions to edit the links for this site.' ) );1577 }1578 1579 function prepare_items() {1580 global $cat_id, $s, $orderby, $order;1581 1582 wp_reset_vars( array( 'action', 'cat_id', 'linkurl', 'name', 'image', 'description', 'visible', 'target', 'category', 'link_id', 'submit', 'orderby', 'order', 'links_show_cat_id', 'rating', 'rel', 'notes', 'linkcheck[]', 's' ) );1583 1584 $args = array( 'hide_invisible' => 0, 'hide_empty' => 0 );1585 1586 if ( 'all' != $cat_id )1587 $args['category'] = $cat_id;1588 if ( !empty( $s ) )1589 $args['search'] = $s;1590 if ( !empty( $orderby ) )1591 $args['orderby'] = $orderby;1592 if ( !empty( $order ) )1593 $args['order'] = $order;1594 1595 $this->items = get_bookmarks( $args );1596 }1597 1598 function no_items() {1599 _e( 'No links found.' );1600 }1601 1602 function get_bulk_actions() {1603 $actions = array();1604 $actions['delete'] = __( 'Delete' );1605 1606 return $actions;1607 }1608 1609 function extra_tablenav( $which ) {1610 global $cat_id;1611 1612 if ( 'top' != $which )1613 return;1614 ?>1615 <div class="alignleft actions">1616 <?php1617 $dropdown_options = array(1618 'selected' => $cat_id,1619 'name' => 'cat_id',1620 'taxonomy' => 'link_category',1621 'show_option_all' => __( 'View all categories' ),1622 'hide_empty' => true,1623 'hierarchical' => 1,1624 'show_count' => 0,1625 'orderby' => 'name',1626 );1627 wp_dropdown_categories( $dropdown_options );1628 ?>1629 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />1630 </div>1631 <?php1632 }1633 1634 function get_columns() {1635 return array(1636 'cb' => '<input type="checkbox" />',1637 'name' => __( 'Name' ),1638 'url' => __( 'URL' ),1639 'categories' => __( 'Categories' ),1640 'rel' => __( 'Relationship' ),1641 'visible' => __( 'Visible' ),1642 'rating' => __( 'Rating' )1643 );1644 }1645 1646 function get_sortable_columns() {1647 return array(1648 'name' => 'name',1649 'url' => 'url',1650 'visible' => 'visible',1651 'rating' => 'rating'1652 );1653 }1654 1655 function display_rows() {1656 global $cat_id;1657 1658 $alt = 0;1659 1660 foreach ( $this->items as $link ) {1661 $link = sanitize_bookmark( $link );1662 $link->link_name = esc_attr( $link->link_name );1663 $link->link_category = wp_get_link_cats( $link->link_id );1664 1665 $short_url = str_replace( 'http://', '', $link->link_url );1666 $short_url = preg_replace( '/^www\./i', '', $short_url );1667 if ( '/' == substr( $short_url, -1 ) )1668 $short_url = substr( $short_url, 0, -1 );1669 if ( strlen( $short_url ) > 35 )1670 $short_url = substr( $short_url, 0, 32 ).'...';1671 1672 $visible = ( $link->link_visible == 'Y' ) ? __( 'Yes' ) : __( 'No' );1673 $rating = $link->link_rating;1674 $style = ( $alt++ % 2 ) ? '' : ' class="alternate"';1675 1676 $edit_link = get_edit_bookmark_link( $link );1677 ?>1678 <tr id="link-<?php echo $link->link_id; ?>" valign="middle" <?php echo $style; ?>>1679 <?php1680 1681 list( $columns, $hidden ) = $this->get_column_info();1682 1683 foreach ( $columns as $column_name => $column_display_name ) {1684 $class = "class='column-$column_name'";1685 1686 $style = '';1687 if ( in_array( $column_name, $hidden ) )1688 $style = ' style="display:none;"';1689 1690 $attributes = $class . $style;1691 1692 switch ( $column_name ) {1693 case 'cb':1694 echo '<th scope="row" class="check-column"><input type="checkbox" name="linkcheck[]" value="'. esc_attr( $link->link_id ) .'" /></th>';1695 break;1696 1697 case 'name':1698 echo "<td $attributes><strong><a class='row-title' href='$edit_link' title='" . esc_attr( sprintf( __( 'Edit “%s”' ), $link->link_name ) ) . "'>$link->link_name</a></strong><br />";1699 1700 $actions = array();1701 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';1702 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "link.php?action=delete&link_id=$link->link_id", 'delete-bookmark_' . $link->link_id ) . "' onclick=\"if ( confirm( '" . esc_js( sprintf( __( "You are about to delete this link '%s'\n 'Cancel' to stop, 'OK' to delete." ), $link->link_name ) ) . "' ) ) { return true;}return false;\">" . __( 'Delete' ) . "</a>";1703 echo $this->row_actions( $actions );1704 1705 echo '</td>';1706 break;1707 case 'url':1708 echo "<td $attributes><a href='$link->link_url' title='".sprintf( __( 'Visit %s' ), $link->link_name )."'>$short_url</a></td>";1709 break;1710 case 'categories':1711 ?><td <?php echo $attributes ?>><?php1712 $cat_names = array();1713 foreach ( $link->link_category as $category ) {1714 $cat = get_term( $category, 'link_category', OBJECT, 'display' );1715 if ( is_wp_error( $cat ) )1716 echo $cat->get_error_message();1717 $cat_name = $cat->name;1718 if ( $cat_id != $category )1719 $cat_name = "<a href='link-manager.php?cat_id=$category'>$cat_name</a>";1720 $cat_names[] = $cat_name;1721 }1722 echo implode( ', ', $cat_names );1723 ?></td><?php1724 break;1725 case 'rel':1726 ?><td <?php echo $attributes ?>><?php echo empty( $link->link_rel ) ? '<br />' : $link->link_rel; ?></td><?php1727 break;1728 case 'visible':1729 ?><td <?php echo $attributes ?>><?php echo $visible; ?></td><?php1730 break;1731 case 'rating':1732 ?><td <?php echo $attributes ?>><?php echo $rating; ?></td><?php1733 break;1734 default:1735 ?>1736 <td <?php echo $attributes ?>><?php do_action( 'manage_link_custom_column', $column_name, $link->link_id ); ?></td>1737 <?php1738 break;1739 }1740 }1741 ?>1742 </tr>1743 <?php1744 }1745 }1746 }1747 1748 class WP_Sites_Table extends WP_List_Table {1749 1750 function WP_Sites_Table() {1751 parent::WP_List_Table( array(1752 'screen' => 'sites-network',1753 'plural' => 'sites',1754 ) );1755 }1756 1757 function check_permissions() {1758 if ( ! current_user_can( 'manage_sites' ) )1759 wp_die( __( 'You do not have permission to access this page.' ) );1760 }1761 1762 function prepare_items() {1763 global $s, $mode, $wpdb;1764 1765 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'list' : $_REQUEST['mode'];1766 1767 $per_page = $this->get_items_per_page( 'sites_network_per_page' );1768 1769 $pagenum = $this->get_pagenum();1770 1771 $s = isset( $_REQUEST['s'] ) ? stripslashes( trim( $_REQUEST[ 's' ] ) ) : '';1772 $like_s = esc_sql( like_escape( $s ) );1773 1774 $query = "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' ";1775 1776 if ( isset( $_REQUEST['searchaction'] ) ) {1777 if ( 'name' == $_REQUEST['searchaction'] ) {1778 $query .= " AND ( {$wpdb->blogs}.domain LIKE '%{$like_s}%' OR {$wpdb->blogs}.path LIKE '%{$like_s}%' ) ";1779 } elseif ( 'id' == $_REQUEST['searchaction'] ) {1780 $query .= " AND {$wpdb->blogs}.blog_id = '{$like_s}' ";1781 } elseif ( 'ip' == $_REQUEST['searchaction'] ) {1782 $query = "SELECT *1783 FROM {$wpdb->blogs}, {$wpdb->registration_log}1784 WHERE site_id = '{$wpdb->siteid}'1785 AND {$wpdb->blogs}.blog_id = {$wpdb->registration_log}.blog_id1786 AND {$wpdb->registration_log}.IP LIKE ( '%{$like_s}%' )";1787 }1788 }1789 1790 $order_by = isset( $_REQUEST['orderby'] ) ? $_REQUEST['orderby'] : 'id';1791 if ( $order_by == 'registered' ) {1792 $query .= ' ORDER BY registered ';1793 } elseif ( $order_by == 'lastupdated' ) {1794 $query .= ' ORDER BY last_updated ';1795 } elseif ( $order_by == 'blogname' ) {1796 $query .= ' ORDER BY domain ';1797 } else {1798 $order_by = 'id';1799 $query .= " ORDER BY {$wpdb->blogs}.blog_id ";1800 }1801 1802 $order = ( isset( $_REQUEST['order'] ) && 'DESC' == strtoupper( $_REQUEST['order'] ) ) ? "DESC" : "ASC";1803 $query .= $order;1804 1805 $total = $wpdb->get_var( str_replace( 'SELECT *', 'SELECT COUNT( blog_id )', $query ) );1806 1807 $query .= " LIMIT " . intval( ( $pagenum - 1 ) * $per_page ) . ", " . intval( $per_page );1808 $this->items = $wpdb->get_results( $query, ARRAY_A );1809 1810 $this->set_pagination_args( array(1811 'total_items' => $total,1812 'per_page' => $per_page,1813 ) );1814 }1815 1816 function no_items() {1817 _e( 'No sites found.' );1818 }1819 1820 function get_bulk_actions() {1821 $actions = array();1822 $actions['delete'] = __( 'Delete' );1823 $actions['spam'] = _x( 'Mark as Spam', 'site' );1824 $actions['notspam'] = _x( 'Not Spam', 'site' );1825 1826 return $actions;1827 }1828 1829 function pagination( $which ) {1830 global $mode;1831 1832 parent::pagination( $which );1833 1834 if ( 'top' == $which )1835 $this->view_switcher( $mode );1836 }1837 1838 function get_columns() {1839 $blogname_columns = ( is_subdomain_install() ) ? __( 'Domain' ) : __( 'Path' );1840 $sites_columns = array(1841 'cb' => '<input type="checkbox" />',1842 'blogname' => $blogname_columns,1843 'lastupdated' => __( 'Last Updated' ),1844 'registered' => _x( 'Registered', 'site' ),1845 'users' => __( 'Users' )1846 );1847 1848 if ( has_filter( 'wpmublogsaction' ) )1849 $sites_columns['plugins'] = __( 'Actions' );1850 1851 $sites_columns = apply_filters( 'wpmu_blogs_columns', $sites_columns );1852 1853 return $sites_columns;1854 }1855 1856 function get_sortable_columns() {1857 return array(1858 'id' => 'id',1859 'blogname' => 'blogname',1860 'lastupdated' => 'lastupdated',1861 'registered' => 'registered',1862 );1863 }1864 1865 function display_rows() {1866 global $current_site, $mode;1867 1868 $status_list = array(1869 'archived' => array( 'site-archived', __( 'Archived' ) ),1870 'spam' => array( 'site-spammed', _x( 'Spam', 'site' ) ),1871 'deleted' => array( 'site-deleted', __( 'Deleted' ) ),1872 'mature' => array( 'site-mature', __( 'Mature' ) )1873 );1874 1875 $class = '';1876 foreach ( $this->items as $blog ) {1877 $class = ( 'alternate' == $class ) ? '' : 'alternate';1878 reset( $status_list );1879 1880 $blog_states = array();1881 foreach ( $status_list as $status => $col ) {1882 if ( get_blog_status( $blog['blog_id'], $status ) == 1 ) {1883 $class = $col[0];1884 $blog_states[] = $col[1];1885 }1886 }1887 $blog_state = '';1888 if ( ! empty( $blog_states ) ) {1889 $state_count = count( $blog_states );1890 $i = 0;1891 $blog_state .= ' - ';1892 foreach ( $blog_states as $state ) {1893 ++$i;1894 ( $i == $state_count ) ? $sep = '' : $sep = ', ';1895 $blog_state .= "<span class='post-state'>$state$sep</span>";1896 }1897 }1898 echo "<tr class='$class'>";1899 1900 $blogname = ( is_subdomain_install() ) ? str_replace( '.'.$current_site->domain, '', $blog['domain'] ) : $blog['path'];1901 1902 list( $columns, $hidden ) = $this->get_column_info();1903 1904 foreach ( $columns as $column_name => $column_display_name ) {1905 switch ( $column_name ) {1906 case 'cb': ?>1907 <th scope="row" class="check-column">1908 <input type="checkbox" id="blog_<?php echo $blog['blog_id'] ?>" name="allblogs[]" value="<?php echo esc_attr( $blog['blog_id'] ) ?>" />1909 </th>1910 <?php1911 break;1912 1913 case 'id': ?>1914 <th valign="top" scope="row">1915 <?php echo $blog['blog_id'] ?>1916 </th>1917 <?php1918 break;1919 1920 case 'blogname': ?>1921 <td class="column-title">1922 <a href="<?php echo esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ); ?>" class="edit"><?php echo $blogname . $blog_state; ?></a>1923 <?php1924 if ( 'list' != $mode )1925 echo '<p>' . sprintf( _x( '%1$s – <em>%2$s</em>', '%1$s: site name. %2$s: site tagline.' ), get_blog_option( $blog['blog_id'], 'blogname' ), get_blog_option( $blog['blog_id'], 'blogdescription ' ) ) . '</p>';1926 1927 // Preordered.1928 $actions = array(1929 'edit' => '', 'backend' => '',1930 'activate' => '', 'deactivate' => '',1931 'archive' => '', 'unarchive' => '',1932 'spam' => '', 'unspam' => '',1933 'delete' => '',1934 'visit' => '',1935 );1936 1937 $actions['edit'] = '<span class="edit"><a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ) . '">' . __( 'Edit' ) . '</a></span>';1938 $actions['backend'] = "<span class='backend'><a href='" . esc_url( get_admin_url( $blog['blog_id'] ) ) . "' class='edit'>" . __( 'Dashboard' ) . '</a></span>';1939 if ( $current_site->blog_id != $blog['blog_id'] ) {1940 if ( get_blog_status( $blog['blog_id'], 'deleted' ) == '1' )1941 $actions['activate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=activateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to activate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Activate' ) . '</a></span>';1942 else1943 $actions['deactivate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deactivateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to deactivate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Deactivate' ) . '</a></span>';1944 1945 if ( get_blog_status( $blog['blog_id'], 'archived' ) == '1' )1946 $actions['unarchive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unarchiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unarchive the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Unarchive' ) . '</a></span>';1947 else1948 $actions['archive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=archiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to archive the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Archive', 'verb; site' ) . '</a></span>';1949 1950 if ( get_blog_status( $blog['blog_id'], 'spam' ) == '1' )1951 $actions['unspam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unspamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unspam the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Not Spam', 'site' ) . '</a></span>';1952 else1953 $actions['spam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=spamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to mark the site %s as spam.' ), $blogname ) ) ) ) . '">' . _x( 'Spam', 'site' ) . '</a></span>';1954 1955 $actions['delete'] = '<span class="delete"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deleteblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to delete the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Delete' ) . '</a></span>';1956 }1957 1958 $actions['visit'] = "<span class='view'><a href='" . esc_url( get_home_url( $blog['blog_id'] ) ) . "' rel='permalink'>" . __( 'Visit' ) . '</a></span>';1959 $actions = array_filter( $actions );1960 echo $this->row_actions( $actions );1961 ?>1962 </td>1963 <?php1964 break;1965 1966 case 'lastupdated': ?>1967 <td valign="top">1968 <?php1969 if ( 'list' == $mode )1970 $date = 'Y/m/d';1971 else1972 $date = 'Y/m/d \<\b\r \/\> g:i:s a';1973 echo ( $blog['last_updated'] == '0000-00-00 00:00:00' ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] ); ?>1974 </td>1975 <?php1976 break;1977 case 'registered': ?>1978 <td valign="top">1979 <?php1980 if ( $blog['registered'] == '0000-00-00 00:00:00' )1981 echo '—';1982 else1983 echo mysql2date( $date, $blog['registered'] );1984 ?>1985 </td>1986 <?php1987 break;1988 case 'users': ?>1989 <td valign="top">1990 <?php1991 $blogusers = get_users( array( 'blog_id' => $blog['blog_id'], 'number' => 6) );1992 if ( is_array( $blogusers ) ) {1993 $blogusers_warning = '';1994 if ( count( $blogusers ) > 5 ) {1995 $blogusers = array_slice( $blogusers, 0, 5 );1996 $blogusers_warning = __( 'Only showing first 5 users.' ) . ' <a href="' . esc_url( get_admin_url( $blog['blog_id'], 'users.php' ) ) . '">' . __( 'More' ) . '</a>';1997 }1998 foreach ( $blogusers as $user_object ) {1999 echo '<a href="' . esc_url( admin_url( 'user-edit.php?user_id=' . $user_object->ID ) ) . '">' . esc_html( $user_object->user_login ) . '</a> ';2000 if ( 'list' != $mode )2001 echo '( ' . $user_object->user_email . ' )';2002 echo '<br />';2003 }2004 if ( $blogusers_warning != '' )2005 echo '<strong>' . $blogusers_warning . '</strong><br />';2006 }2007 ?>2008 </td>2009 <?php2010 break;2011 2012 case 'plugins': ?>2013 <?php if ( has_filter( 'wpmublogsaction' ) ) { ?>2014 <td valign="top">2015 <?php do_action( 'wpmublogsaction', $blog['blog_id'] ); ?>2016 </td>2017 <?php } ?>2018 <?php break;2019 2020 default: ?>2021 <?php if ( has_filter( 'manage_blogs_custom_column' ) ) { ?>2022 <td valign="top">2023 <?php do_action( 'manage_blogs_custom_column', $column_name, $blog['blog_id'] ); ?>2024 </td>2025 <?php } ?>2026 <?php break;2027 }2028 }2029 ?>2030 </tr>2031 <?php2032 }2033 }2034 }2035 2036 class WP_MS_Users_Table extends WP_List_Table {2037 2038 function WP_MS_Users_Table() {2039 parent::WP_List_Table( array(2040 'screen' => 'users-network',2041 ) );2042 }2043 2044 function check_permissions() {2045 if ( !is_multisite() )2046 wp_die( __( 'Multisite support is not enabled.' ) );2047 2048 if ( ! current_user_can( 'manage_network_users' ) )2049 wp_die( __( 'You do not have permission to access this page.' ) );2050 }2051 2052 function prepare_items() {2053 global $usersearch;2054 2055 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';2056 2057 $users_per_page = $this->get_items_per_page( 'users_network_per_page' );2058 2059 $paged = $this->get_pagenum();2060 2061 $args = array(2062 'number' => $users_per_page,2063 'offset' => ( $paged-1 ) * $users_per_page,2064 'search' => $usersearch,2065 'blog_id' => 02066 );2067 2068 if ( isset( $_REQUEST['orderby'] ) )2069 $args['orderby'] = $_REQUEST['orderby'];2070 2071 if ( isset( $_REQUEST['order'] ) )2072 $args['order'] = $_REQUEST['order'];2073 2074 // Query the user IDs for this page2075 $wp_user_search = new WP_User_Query( $args );2076 2077 $this->items = $wp_user_search->get_results();2078 2079 $this->set_pagination_args( array(2080 'total_items' => $wp_user_search->get_total(),2081 'per_page' => $users_per_page,2082 ) );2083 }2084 2085 function get_bulk_actions() {2086 $actions = array();2087 $actions['delete'] = __( 'Delete' );2088 $actions['spam'] = _x( 'Mark as Spam', 'user' );2089 $actions['notspam'] = _x( 'Not Spam', 'user' );2090 2091 return $actions;2092 }2093 2094 function no_items() {2095 _e( 'No users found.' );2096 }2097 2098 function pagination( $which ) {2099 global $mode;2100 2101 parent::pagination ( $which );2102 2103 if ( 'top' == $which )2104 $this->view_switcher( $mode );2105 }2106 2107 function get_columns() {2108 $users_columns = array(2109 'cb' => '<input type="checkbox" />',2110 'login' => __( 'Login' ),2111 'name' => __( 'Name' ),2112 'email' => __( 'E-mail' ),2113 'registered' => _x( 'Registered', 'user' ),2114 'blogs' => __( 'Sites' )2115 );2116 $users_columns = apply_filters( 'wpmu_users_columns', $users_columns );2117 2118 return $users_columns;2119 }2120 2121 function get_sortable_columns() {2122 return array(2123 'id' => 'id',2124 'login' => 'login',2125 'name' => 'name',2126 'email' => 'email',2127 'registered' => 'registered',2128 );2129 }2130 2131 function display_rows() {2132 global $current_site, $mode;2133 2134 $class = '';2135 $super_admins = get_super_admins();2136 foreach ( $this->items as $user ) {2137 $class = ( 'alternate' == $class ) ? '' : 'alternate';2138 2139 $status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' );2140 2141 foreach ( $status_list as $status => $col ) {2142 if ( $user->$status )2143 $class = $col;2144 }2145 2146 ?>2147 <tr class="<?php echo $class; ?>">2148 <?php2149 2150 list( $columns, $hidden ) = $this->get_column_info();2151 2152 foreach ( $columns as $column_name => $column_display_name ) :2153 switch ( $column_name ) {2154 case 'cb': ?>2155 <th scope="row" class="check-column">2156 <input type="checkbox" id="blog_<?php echo $user->ID ?>" name="allusers[]" value="<?php echo esc_attr( $user->ID ) ?>" />2157 </th>2158 <?php2159 break;2160 2161 case 'id': ?>2162 <th valign="top" scope="row">2163 <?php echo $user->ID ?>2164 </th>2165 <?php2166 break;2167 2168 case 'login':2169 $avatar = get_avatar( $user->user_email, 32 );2170 $edit_link = ( get_current_user_id() == $user->ID ) ? 'profile.php' : 'user-edit.php?user_id=' . $user->ID;2171 ?>2172 <td class="username column-username">2173 <?php echo $avatar; ?><strong><a href="<?php echo esc_url( self_admin_url( $edit_link ) ); ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a><?php2174 if ( in_array( $user->user_login, $super_admins ) )2175 echo ' - ' . __( 'Super admin' );2176 ?></strong>2177 <br/>2178 <?php2179 $actions = array();2180 $actions['edit'] = '<a href="' . esc_url( self_admin_url( $edit_link ) ) . '">' . __( 'Edit' ) . '</a>';2181 2182 if ( ! in_array( $user->user_login, $super_admins ) ) {2183 $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deleteuser' ) . '&action=deleteuser&id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';2184 }2185 2186 echo $this->row_actions( $actions );2187 ?>2188 </div>2189 </td>2190 <?php2191 break;2192 2193 case 'name': ?>2194 <td class="name column-name"><?php echo $user->display_name ?></td>2195 <?php2196 break;2197 2198 case 'email': ?>2199 <td class="email column-email"><a href="mailto:<?php echo $user->user_email ?>"><?php echo $user->user_email ?></a></td>2200 <?php2201 break;2202 2203 case 'registered':2204 if ( 'list' == $mode )2205 $date = 'Y/m/d';2206 else2207 $date = 'Y/m/d \<\b\r \/\> g:i:s a';2208 ?>2209 <td><?php echo mysql2date( $date, $user->user_registered ); ?></td>2210 <?php2211 break;2212 2213 case 'blogs':2214 $blogs = get_blogs_of_user( $user->ID, true );2215 ?>2216 <td>2217 <?php2218 if ( is_array( $blogs ) ) {2219 foreach ( (array) $blogs as $key => $val ) {2220 $path = ( $val->path == '/' ) ? '' : $val->path;2221 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . str_replace( '.' . $current_site->domain, '', $val->domain . $path ) . '</a>';2222 echo ' <small class="row-actions">';2223 2224 // Edit2225 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . __( 'Edit' ) . '</a> | ';2226 2227 // View2228 echo '<a ';2229 if ( get_blog_status( $val->userblog_id, 'spam' ) == 1 )2230 echo 'style="background-color: #faa" ';2231 echo 'href="' . esc_url( get_home_url( $val->userblog_id ) ) . '">' . __( 'View' ) . '</a>';2232 2233 echo '</small><br />';2234 }2235 }2236 ?>2237 </td>2238 <?php2239 break;2240 2241 default: ?>2242 <td><?php do_action( 'manage_users_custom_column', $column_name, $user->ID ); ?></td>2243 <?php2244 break;2245 }2246 endforeach2247 ?>2248 </tr>2249 <?php2250 }2251 }2252 }2253 2254 class WP_Plugins_Table extends WP_List_Table {2255 2256 function WP_Plugins_Table() {2257 global $status, $page;2258 2259 $default_status = get_user_option( 'plugins_last_view' );2260 if ( empty( $default_status ) )2261 $default_status = 'all';2262 $status = isset( $_REQUEST['plugin_status'] ) ? $_REQUEST['plugin_status'] : $default_status;2263 if ( !in_array( $status, array( 'all', 'active', 'inactive', 'recently_activated', 'upgrade', 'network', 'mustuse', 'dropins', 'search' ) ) )2264 $status = 'all';2265 if ( $status != $default_status && 'search' != $status )2266 update_user_meta( get_current_user_id(), 'plugins_last_view', $status );2267 2268 $page = $this->get_pagenum();2269 2270 parent::WP_List_Table( array(2271 'screen' => 'plugins',2272 'plural' => 'plugins',2273 ) );2274 }2275 2276 function check_permissions() {2277 if ( is_multisite() ) {2278 $menu_perms = get_site_option( 'menu_items', array() );2279 2280 if ( empty( $menu_perms['plugins'] ) ) {2281 if ( !is_super_admin() )2282 wp_die( __( 'Cheatin’ uh?' ) );2283 }2284 }2285 2286 if ( !current_user_can('activate_plugins') )2287 wp_die( __( 'You do not have sufficient permissions to manage plugins for this site.' ) );2288 }2289 2290 function prepare_items() {2291 global $status, $plugins, $totals, $page, $orderby, $order, $s;2292 2293 wp_reset_vars( array( 'orderby', 'order', 's' ) );2294 2295 $plugins = array(2296 'all' => apply_filters( 'all_plugins', get_plugins() ),2297 'search' => array(),2298 'active' => array(),2299 'inactive' => array(),2300 'recently_activated' => array(),2301 'upgrade' => array(),2302 'mustuse' => array(),2303 'dropins' => array()2304 );2305 2306 if ( ! is_multisite() || ( is_network_admin() && current_user_can('manage_network_plugins') ) ) {2307 if ( apply_filters( 'show_advanced_plugins', true, 'mustuse' ) )2308 $plugins['mustuse'] = get_mu_plugins();2309 if ( apply_filters( 'show_advanced_plugins', true, 'dropins' ) )2310 $plugins['dropins'] = get_dropins();2311 }2312 2313 set_transient( 'plugin_slugs', array_keys( $plugins['all'] ), 86400 );2314 2315 $recently_activated = get_option( 'recently_activated', array() );2316 2317 $one_week = 7*24*60*60;2318 foreach ( $recently_activated as $key => $time )2319 if ( $time + $one_week < time() )2320 unset( $recently_activated[$key] );2321 update_option( 'recently_activated', $recently_activated );2322 2323 $current = get_site_transient( 'update_plugins' );2324 2325 foreach ( array( 'all', 'mustuse', 'dropins' ) as $type ) {2326 foreach ( (array) $plugins[$type] as $plugin_file => $plugin_data ) {2327 // Translate, Apply Markup, Sanitize HTML2328 $plugins[$type][$plugin_file] = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, false, true );2329 }2330 }2331 2332 foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) {2333 // Filter into individual sections2334 if ( is_plugin_active_for_network($plugin_file) && !is_network_admin() ) {2335 unset( $plugins['all'][ $plugin_file ] );2336 continue;2337 } elseif ( is_multisite() && is_network_only_plugin( $plugin_file ) && !current_user_can( 'manage_network_plugins' ) ) {2338 $plugins['network'][ $plugin_file ] = $plugin_data;2339 } elseif ( ( !is_network_admin() && is_plugin_active( $plugin_file ) )2340 || ( is_network_admin() && is_plugin_active_for_network( $plugin_file ) ) ) {2341 $plugins['active'][ $plugin_file ] = $plugin_data;2342 } else {2343 if ( !is_network_admin() && isset( $recently_activated[ $plugin_file ] ) ) // Was the plugin recently activated?2344 $plugins['recently_activated'][ $plugin_file ] = $plugin_data;2345 $plugins['inactive'][ $plugin_file ] = $plugin_data;2346 }2347 2348 if ( isset( $current->response[ $plugin_file ] ) )2349 $plugins['upgrade'][ $plugin_file ] = $plugin_data;2350 }2351 2352 if ( !current_user_can( 'update_plugins' ) )2353 $plugins['upgrade'] = array();2354 2355 if ( $s ) {2356 $status = 'search';2357 $plugins['search'] = array_filter( $plugins['all'], array( $this, '_search_callback' ) );2358 }2359 2360 $totals = array();2361 foreach ( $plugins as $type => $list )2362 $totals[ $type ] = count( $list );2363 2364 if ( empty( $plugins[ $status ] ) && !in_array( $status, array( 'all', 'search' ) ) )2365 $status = 'all';2366 2367 $this->items = $plugins[ $status ];2368 $total_this_page = $totals[ $status ];2369 2370 if ( $orderby ) {2371 $orderby = ucfirst( $orderby );2372 $order = strtoupper( $order );2373 2374 uasort( $this->items, array( $this, '_order_callback' ) );2375 }2376 2377 $plugins_per_page = $this->get_items_per_page( 'plugins_per_page', 999 );2378 2379 $start = ( $page - 1 ) * $plugins_per_page;2380 2381 if ( $total_this_page > $plugins_per_page )2382 $this->items = array_slice( $this->items, $start, $plugins_per_page );2383 2384 $this->set_pagination_args( array(2385 'total_items' => $total_this_page,2386 'per_page' => $plugins_per_page,2387 ) );2388 }2389 2390 function _search_callback( $plugin ) {2391 static $term;2392 if ( is_null( $term ) )2393 $term = stripslashes( $_REQUEST['s'] );2394 2395 foreach ( $plugin as $value )2396 if ( stripos( $value, $term ) !== false )2397 return true;2398 2399 return false;2400 }2401 2402 function _order_callback( $plugin_a, $plugin_b ) {2403 global $orderby, $order;2404 2405 $a = $plugin_a[$orderby];2406 $b = $plugin_b[$orderby];2407 2408 if ( $a == $b )2409 return 0;2410 2411 if ( 'DESC' == $order )2412 return ( $a < $b ) ? 1 : -1;2413 else2414 return ( $a < $b ) ? -1 : 1;2415 }2416 2417 function no_items() {2418 global $plugins;2419 2420 if ( !empty( $plugins['all'] ) )2421 _e( 'No plugins found.' );2422 else2423 _e( 'You do not appear to have any plugins available at this time.' );2424 }2425 2426 function get_columns() {2427 global $status;2428 2429 return array(2430 'cb' => !in_array( $status, array( 'mustuse', 'dropins' ) ) ? '<input type="checkbox" />' : '',2431 'name' => __( 'Plugin' ),2432 'description' => __( 'Description' ),2433 );2434 }2435 2436 function get_sortable_columns() {2437 return array(2438 'name' => 'name',2439 'description' => 'description',2440 );2441 }2442 2443 function display_tablenav( $which ) {2444 global $status;2445 2446 if ( !in_array( $status, array( 'mustuse', 'dropins' ) ) )2447 parent::display_tablenav( $which );2448 }2449 2450 function get_views() {2451 global $totals, $status;2452 2453 $status_links = array();2454 foreach ( $totals as $type => $count ) {2455 if ( !$count )2456 continue;2457 2458 switch ( $type ) {2459 case 'all':2460 $text = _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $count, 'plugins' );2461 break;2462 case 'active':2463 $text = _n( 'Active <span class="count">(%s)</span>', 'Active <span class="count">(%s)</span>', $count );2464 break;2465 case 'recently_activated':2466 $text = _n( 'Recently Active <span class="count">(%s)</span>', 'Recently Active <span class="count">(%s)</span>', $count );2467 break;2468 case 'inactive':2469 $text = _n( 'Inactive <span class="count">(%s)</span>', 'Inactive <span class="count">(%s)</span>', $count );2470 break;2471 case 'network':2472 $text = _n( 'Network <span class="count">(%s)</span>', 'Network <span class="count">(%s)</span>', $count );2473 break;2474 case 'mustuse':2475 $text = _n( 'Must-Use <span class="count">(%s)</span>', 'Must-Use <span class="count">(%s)</span>', $count );2476 break;2477 case 'dropins':2478 $text = _n( 'Drop-ins <span class="count">(%s)</span>', 'Drop-ins <span class="count">(%s)</span>', $count );2479 break;2480 case 'upgrade':2481 $text = _n( 'Upgrade Available <span class="count">(%s)</span>', 'Upgrade Available <span class="count">(%s)</span>', $count );2482 break;2483 case 'search':2484 $text = _n( 'Search Results <span class="count">(%s)</span>', 'Search Results <span class="count">(%s)</span>', $count );2485 break;2486 }2487 2488 $status_links[$type] = sprintf( "<li><a href='%s' %s>%s</a>",2489 add_query_arg('plugin_status', $type, 'plugins.php'),2490 ( $type == $status ) ? ' class="current"' : '',2491 sprintf( $text, number_format_i18n( $count ) )2492 );2493 }2494 2495 return $status_links;2496 }2497 2498 function get_bulk_actions() {2499 global $status;2500 2501 $actions = array();2502 if ( 'active' != $status )2503 $actions['activate-selected'] = __( 'Activate' );2504 if ( is_multisite() && 'network' != $status )2505 $actions['network-activate-selected'] = __( 'Network Activate' );2506 if ( 'inactive' != $status && 'recent' != $status )2507 $actions['deactivate-selected'] = __( 'Deactivate' );2508 if ( current_user_can( 'update_plugins' ) )2509 $actions['update-selected'] = __( 'Update' );2510 if ( current_user_can( 'delete_plugins' ) && ( 'active' != $status ) )2511 $actions['delete-selected'] = __( 'Delete' );2512 2513 return $actions;2514 }2515 2516 function bulk_actions( $which ) {2517 global $status;2518 2519 if ( in_array( $status, array( 'mustuse', 'dropins' ) ) )2520 return;2521 2522 parent::bulk_actions( $which );2523 }2524 2525 function extra_tablenav( $which ) {2526 global $status;2527 2528 if ( 'recently_activated' == $status ) { ?>2529 <div class="alignleft actions">2530 <input type="submit" name="clear-recent-list" value="<?php esc_attr_e( 'Clear List' ) ?>" class="button-secondary" />2531 </div>2532 <?php }2533 }2534 2535 function current_action() {2536 if ( isset($_POST['clear-recent-list']) )2537 return 'clear-recent-list';2538 2539 return parent::current_action();2540 }2541 2542 function display_rows() {2543 global $status, $page, $s;2544 2545 $context = $status;2546 2547 foreach ( $this->items as $plugin_file => $plugin_data ) {2548 // preorder2549 $actions = array(2550 'network_deactivate' => '', 'deactivate' => '',2551 'network_only' => '', 'activate' => '',2552 'network_activate' => '',2553 'edit' => '',2554 'delete' => '',2555 );2556 2557 if ( 'mustuse' == $context ) {2558 if ( is_multisite() && !is_network_admin() )2559 continue;2560 $is_active = true;2561 } elseif ( 'dropins' == $context ) {2562 if ( is_multisite() && !is_network_admin() )2563 continue;2564 $dropins = _get_dropins();2565 $plugin_name = $plugin_file;2566 if ( $plugin_file != $plugin_data['Name'] )2567 $plugin_name .= '<br/>' . $plugin_data['Name'];2568 if ( true === ( $dropins[ $plugin_file ][1] ) ) { // Doesn't require a constant2569 $is_active = true;2570 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';2571 } elseif ( constant( $dropins[ $plugin_file ][1] ) ) { // Constant is true2572 $is_active = true;2573 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';2574 } else {2575 $is_active = false;2576 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . ' <span class="attention">' . __('Inactive:') . '</span></strong> ' . sprintf( __( 'Requires <code>%s</code> in <code>wp-config.php</code>.' ), "define('" . $dropins[ $plugin_file ][1] . "', true);" ) . '</p>';2577 }2578 if ( $plugin_data['Description'] )2579 $description .= '<p>' . $plugin_data['Description'] . '</p>';2580 } else {2581 $is_active_for_network = is_plugin_active_for_network($plugin_file);2582 if ( is_network_admin() )2583 $is_active = $is_active_for_network;2584 else2585 $is_active = is_plugin_active( $plugin_file );2586 2587 if ( $is_active_for_network && !is_super_admin() && !is_network_admin() )2588 continue;2589 2590 if ( is_network_admin() ) {2591 if ( $is_active_for_network ) {2592 if ( current_user_can( 'manage_network_plugins' ) )2593 $actions['network_deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Network Deactivate') . '</a>';2594 } else {2595 if ( current_user_can( 'manage_network_plugins' ) )2596 $actions['network_activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin for all sites in this network') . '" class="edit">' . __('Network Activate') . '</a>';2597 if ( current_user_can('delete_plugins') )2598 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';2599 }2600 } else {2601 if ( $is_active ) {2602 $actions['deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Deactivate') . '</a>';2603 } else {2604 if ( is_network_only_plugin( $plugin_file ) && !is_network_admin() )2605 continue;2606 2607 $actions['activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin') . '" class="edit">' . __('Activate') . '</a>';2608 2609 if ( current_user_can('delete_plugins') )2610 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';2611 } // end if $is_active2612 } // end if is_network_admin()2613 2614 if ( current_user_can('edit_plugins') && is_writable(WP_PLUGIN_DIR . '/' . $plugin_file) )2615 $actions['edit'] = '<a href="plugin-editor.php?file=' . $plugin_file . '" title="' . __('Open this file in the Plugin Editor') . '" class="edit">' . __('Edit') . '</a>';2616 } // end if $context2617 2618 $actions = apply_filters( 'plugin_action_links', array_filter( $actions ), $plugin_file, $plugin_data, $context );2619 $actions = apply_filters( "plugin_action_links_$plugin_file", $actions, $plugin_file, $plugin_data, $context );2620 2621 $class = $is_active ? 'active' : 'inactive';2622 $checkbox = in_array( $status, array( 'mustuse', 'dropins' ) ) ? '' : "<input type='checkbox' name='checked[]' value='" . esc_attr( $plugin_file ) . "' />";2623 if ( 'dropins' != $status ) {2624 $description = '<p>' . $plugin_data['Description'] . '</p>';2625 $plugin_name = $plugin_data['Name'];2626 }2627 2628 $id = sanitize_title( $plugin_name );2629 2630 echo "2631 <tr id='$id' class='$class'>2632 <th scope='row' class='check-column'>$checkbox</th>2633 <td class='plugin-title'><strong>$plugin_name</strong></td>2634 <td class='desc'>$description</td>2635 </tr>2636 <tr class='$class second'>2637 <td></td>2638 <td class='plugin-title'>";2639 2640 echo $this->row_actions( $actions, true );2641 2642 echo "</td>2643 <td class='desc'>";2644 $plugin_meta = array();2645 if ( !empty( $plugin_data['Version'] ) )2646 $plugin_meta[] = sprintf( __( 'Version %s' ), $plugin_data['Version'] );2647 if ( !empty( $plugin_data['Author'] ) ) {2648 $author = $plugin_data['Author'];2649 if ( !empty( $plugin_data['AuthorURI'] ) )2650 $author = '<a href="' . $plugin_data['AuthorURI'] . '" title="' . __( 'Visit author homepage' ) . '">' . $plugin_data['Author'] . '</a>';2651 $plugin_meta[] = sprintf( __( 'By %s' ), $author );2652 }2653 if ( ! empty( $plugin_data['PluginURI'] ) )2654 $plugin_meta[] = '<a href="' . $plugin_data['PluginURI'] . '" title="' . __( 'Visit plugin site' ) . '">' . __( 'Visit plugin site' ) . '</a>';2655 2656 $plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status );2657 echo implode( ' | ', $plugin_meta );2658 echo "</td>2659 </tr>\n";2660 2661 do_action( 'after_plugin_row', $plugin_file, $plugin_data, $status );2662 do_action( "after_plugin_row_$plugin_file", $plugin_file, $plugin_data, $status );2663 }2664 }2665 }2666 11 2667 12 class WP_Plugin_Install_Table extends WP_List_Table { … … 2890 235 } 2891 236 2892 class WP_Themes_Table extends WP_List_Table {2893 2894 var $search = array();2895 var $features = array();2896 2897 function WP_Themes_Table() {2898 parent::__construct( array(2899 'screen' => 'themes',2900 ) );2901 }2902 2903 function check_permissions() {2904 if ( !current_user_can('switch_themes') && !current_user_can('edit_theme_options') )2905 wp_die( __( 'Cheatin’ uh?' ) );2906 }2907 2908 function prepare_items() {2909 global $ct;2910 2911 $ct = current_theme_info();2912 2913 $themes = get_allowed_themes();2914 2915 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';2916 2917 if ( '' !== $search ) {2918 $this->search = array_merge( $this->search, array_filter( array_map( 'trim', explode( ',', $search ) ) ) );2919 $this->search = array_unique( $this->search );2920 }2921 2922 if ( !empty( $_REQUEST['features'] ) ) {2923 $this->features = $_REQUEST['features'];2924 $this->features = array_map( 'trim', $this->features );2925 $this->features = array_map( 'sanitize_title_with_dashes', $this->features );2926 $this->features = array_unique( $this->features );2927 }2928 2929 if ( $this->search || $this->features ) {2930 foreach ( $themes as $key => $theme ) {2931 if ( !$this->search_theme( $theme ) )2932 unset( $themes[ $key ] );2933 }2934 }2935 2936 unset( $themes[$ct->name] );2937 uksort( $themes, "strnatcasecmp" );2938 2939 $per_page = 15;2940 $page = $this->get_pagenum();2941 2942 $start = ( $page - 1 ) * $per_page;2943 2944 $this->items = array_slice( $themes, $start, $per_page );2945 2946 $this->set_pagination_args( array(2947 'query_var' => 'pagenum',2948 'total_items' => count( $themes ),2949 'per_page' => $per_page,2950 ) );2951 }2952 2953 function no_items() {2954 if ( current_user_can( 'install_themes' ) )2955 printf( __( 'You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress.org Theme Directory at any time: just click on the <em><a href="%s">Install Themes</a></em> tab above.' ), 'theme-install.php' );2956 else2957 printf( __( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ), get_site_option( 'site_name' ) );2958 }2959 2960 function display_table() {2961 237 ?> 2962 <div class="tablenav">2963 <?php $this->pagination( 'top' ); ?>2964 <br class="clear" />2965 </div>2966 2967 <table id="availablethemes" cellspacing="0" cellpadding="0">2968 <tbody id="the-list" class="list:themes">2969 <?php $this->display_rows(); ?>2970 </tbody>2971 </table>2972 2973 <div class="tablenav">2974 <?php $this->pagination( 'bottom' ); ?>2975 <br class="clear" />2976 </div>2977 <?php2978 }2979 2980 function get_columns() {2981 return array();2982 }2983 2984 function display_rows() {2985 $themes = $this->items;2986 $theme_names = array_keys( $themes );2987 natcasesort( $theme_names );2988 2989 $table = array();2990 $rows = ceil( count( $theme_names ) / 3 );2991 for ( $row = 1; $row <= $rows; $row++ )2992 for ( $col = 1; $col <= 3; $col++ )2993 $table[$row][$col] = array_shift( $theme_names );2994 2995 foreach ( $table as $row => $cols ) {2996 ?>2997 <tr>2998 <?php2999 foreach ( $cols as $col => $theme_name ) {3000 $class = array( 'available-theme' );3001 if ( $row == 1 ) $class[] = 'top';3002 if ( $col == 1 ) $class[] = 'left';3003 if ( $row == $rows ) $class[] = 'bottom';3004 if ( $col == 3 ) $class[] = 'right';3005 ?>3006 <td class="<?php echo join( ' ', $class ); ?>">3007 <?php if ( !empty( $theme_name ) ) :3008 $template = $themes[$theme_name]['Template'];3009 $stylesheet = $themes[$theme_name]['Stylesheet'];3010 $title = $themes[$theme_name]['Title'];3011 $version = $themes[$theme_name]['Version'];3012 $description = $themes[$theme_name]['Description'];3013 $author = $themes[$theme_name]['Author'];3014 $screenshot = $themes[$theme_name]['Screenshot'];3015 $stylesheet_dir = $themes[$theme_name]['Stylesheet Dir'];3016 $template_dir = $themes[$theme_name]['Template Dir'];3017 $parent_theme = $themes[$theme_name]['Parent Theme'];3018 $theme_root = $themes[$theme_name]['Theme Root'];3019 $theme_root_uri = $themes[$theme_name]['Theme Root URI'];3020 $preview_link = esc_url( get_option( 'home' ) . '/' );3021 if ( is_ssl() )3022 $preview_link = str_replace( 'http://', 'https://', $preview_link );3023 $preview_link = htmlspecialchars( add_query_arg( array( 'preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'TB_iframe' => 'true' ), $preview_link ) );3024 $preview_text = esc_attr( sprintf( __( 'Preview of “%s”' ), $title ) );3025 $tags = $themes[$theme_name]['Tags'];3026 $thickbox_class = 'thickbox thickbox-preview';3027 $activate_link = wp_nonce_url( "themes.php?action=activate&template=".urlencode( $template )."&stylesheet=".urlencode( $stylesheet ), 'switch-theme_' . $template );3028 $activate_text = esc_attr( sprintf( __( 'Activate “%s”' ), $title ) );3029 $actions = array();3030 $actions[] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __( 'Activate' ) . '</a>';3031 $actions[] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr( sprintf( __( 'Preview “%s”' ), $theme_name ) ) . '">' . __( 'Preview' ) . '</a>';3032 if ( current_user_can( 'delete_themes' ) )3033 $actions[] = '<a class="submitdelete deletion" href="' . wp_nonce_url( "themes.php?action=delete&template=$stylesheet", 'delete-theme_' . $stylesheet ) . '" onclick="' . "return confirm( '" . esc_js( sprintf( __( "You are about to delete this theme '%s'\n 'Cancel' to stop, 'OK' to delete." ), $theme_name ) ) . "' );" . '">' . __( 'Delete' ) . '</a>';3034 $actions = apply_filters( 'theme_action_links', $actions, $themes[$theme_name] );3035 3036 $actions = implode ( ' | ', $actions );3037 ?>3038 <a href="<?php echo $preview_link; ?>" class="<?php echo $thickbox_class; ?> screenshot">3039 <?php if ( $screenshot ) : ?>3040 <img src="<?php echo $theme_root_uri . '/' . $stylesheet . '/' . $screenshot; ?>" alt="" />3041 <?php endif; ?>3042 </a>3043 <h3><?php3044 /* translators: 1: theme title, 2: theme version, 3: theme author */3045 printf( __( '%1$s %2$s by %3$s' ), $title, $version, $author ) ; ?></h3>3046 <p class="description"><?php echo $description; ?></p>3047 <span class='action-links'><?php echo $actions ?></span>3048 <?php if ( current_user_can( 'edit_themes' ) && $parent_theme ) {3049 /* translators: 1: theme title, 2: template dir, 3: stylesheet_dir, 4: theme title, 5: parent_theme */ ?>3050 <p><?php printf( __( 'The template files are located in <code>%2$s</code>. The stylesheet files are located in <code>%3$s</code>. <strong>%4$s</strong> uses templates from <strong>%5$s</strong>. Changes made to the templates will affect both themes.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ), $title, $parent_theme ); ?></p>3051 <?php } else { ?>3052 <p><?php printf( __( 'All of this theme’s files are located in <code>%2$s</code>.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ) ); ?></p>3053 <?php } ?>3054 <?php if ( $tags ) : ?>3055 <p><?php _e( 'Tags:' ); ?> <?php echo join( ', ', $tags ); ?></p>3056 <?php endif; ?>3057 <?php theme_update_available( $themes[$theme_name] ); ?>3058 <?php endif; // end if not empty theme_name ?>3059 </td>3060 <?php } // end foreach $cols ?>3061 </tr>3062 <?php } // end foreach $table3063 }3064 3065 function search_theme( $theme ) {3066 $matched = 0;3067 3068 // Match all phrases3069 if ( count( $this->search ) > 0 ) {3070 foreach ( $this->search as $word ) {3071 $matched = 0;3072 3073 // In a tag?3074 if ( in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) )3075 $matched = 1;3076 3077 // In one of the fields?3078 foreach ( array( 'Name', 'Title', 'Description', 'Author', 'Template', 'Stylesheet' ) AS $field ) {3079 if ( stripos( $theme[$field], $word ) !== false )3080 $matched++;3081 }3082 3083 if ( $matched == 0 )3084 return false;3085 }3086 }3087 3088 // Now search the features3089 if ( count( $this->features ) > 0 ) {3090 foreach ( $this->features as $word ) {3091 // In a tag?3092 if ( !in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) )3093 return false;3094 }3095 }3096 3097 // Only get here if each word exists in the tags or one of the fields3098 return true;3099 }3100 }3101 3102 class WP_Theme_Install_Table extends WP_List_Table {3103 3104 function WP_Theme_Install_Table() {3105 parent::WP_List_Table( array(3106 'screen' => 'theme-install',3107 ) );3108 }3109 3110 function check_permissions() {3111 if ( ! current_user_can('install_themes') )3112 wp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) );3113 }3114 3115 function prepare_items() {3116 include( ABSPATH . 'wp-admin/includes/theme-install.php' );3117 3118 global $tabs, $tab, $paged, $type, $term, $theme_field_defaults;3119 3120 wp_reset_vars( array( 'tab' ) );3121 3122 $paged = $this->get_pagenum();3123 3124 $per_page = 30;3125 3126 // These are the tabs which are shown on the page,3127 $tabs = array();3128 $tabs['dashboard'] = __( 'Search' );3129 if ( 'search' == $tab )3130 $tabs['search'] = __( 'Search Results' );3131 $tabs['upload'] = __( 'Upload' );3132 $tabs['featured'] = _x( 'Featured','Theme Installer' );3133 //$tabs['popular'] = _x( 'Popular','Theme Installer' );3134 $tabs['new'] = _x( 'Newest','Theme Installer' );3135 $tabs['updated'] = _x( 'Recently Updated','Theme Installer' );3136 3137 $nonmenu_tabs = array( 'theme-information' ); // Valid actions to perform which do not have a Menu item.3138 3139 $tabs = apply_filters( 'install_themes_tabs', $tabs );3140 $nonmenu_tabs = apply_filters( 'install_themes_nonmenu_tabs', $nonmenu_tabs );3141 3142 // If a non-valid menu tab has been selected, And its not a non-menu action.3143 if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs ) ) )3144 $tab = key( $tabs );3145 3146 $args = array( 'page' => $paged, 'per_page' => $per_page, 'fields' => $theme_field_defaults );3147 3148 switch ( $tab ) {3149 case 'search':3150 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : '';3151 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '';3152 3153 switch ( $type ) {3154 case 'tag':3155 $terms = explode( ',', $term );3156 $terms = array_map( 'trim', $terms );3157 $terms = array_map( 'sanitize_title_with_dashes', $terms );3158 $args['tag'] = $terms;3159 break;3160 case 'term':3161 $args['search'] = $term;3162 break;3163 case 'author':3164 $args['author'] = $term;3165 break;3166 }3167 3168 if ( !empty( $_POST['features'] ) ) {3169 $terms = $_POST['features'];3170 $terms = array_map( 'trim', $terms );3171 $terms = array_map( 'sanitize_title_with_dashes', $terms );3172 $args['tag'] = $terms;3173 $_REQUEST['s'] = implode( ',', $terms );3174 $_REQUEST['type'] = 'tag';3175 }3176 3177 add_action( 'install_themes_table_header', 'install_theme_search_form' );3178 break;3179 3180 case 'featured':3181 //case 'popular':3182 case 'new':3183 case 'updated':3184 $args['browse'] = $tab;3185 break;3186 3187 default:3188 $args = false;3189 }3190 3191 if ( !$args )3192 return;3193 3194 $api = themes_api( 'query_themes', $args );3195 3196 if ( is_wp_error( $api ) )3197 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' );3198 3199 $this->items = $api->themes;3200 3201 $this->set_pagination_args( array(3202 'total_items' => $api->info['results'],3203 'per_page' => $per_page,3204 ) );3205 }3206 3207 function no_items() {3208 _e( 'No themes match your request.' );3209 }3210 3211 function get_views() {3212 global $tabs, $tab;3213 3214 $display_tabs = array();3215 foreach ( (array) $tabs as $action => $text ) {3216 $class = ( $action == $tab ) ? ' class="current"' : '';3217 $href = self_admin_url('theme-install.php?tab=' . $action);3218 $display_tabs[$action] = "<a href='$href'$class>$text</a>";3219 }3220 3221 return $display_tabs;3222 }3223 3224 function get_columns() {3225 return array();3226 }3227 3228 function display_table() {3229 ?>3230 <div class="tablenav">3231 <div class="alignleft actions">3232 <?php do_action( 'install_themes_table_header' ); ?>3233 </div>3234 <?php $this->pagination( 'top' ); ?>3235 <br class="clear" />3236 </div>3237 3238 <table id="availablethemes" cellspacing="0" cellpadding="0">3239 <tbody id="the-list" class="list:themes">3240 <?php $this->display_rows(); ?>3241 </tbody>3242 </table>3243 3244 <div class="tablenav">3245 <?php $this->pagination( 'bottom' ); ?>3246 <br class="clear" />3247 </div>3248 <?php3249 }3250 3251 function display_rows() {3252 $themes = $this->items;3253 3254 $rows = ceil( count( $themes ) / 3 );3255 $table = array();3256 $theme_keys = array_keys( $themes );3257 for ( $row = 1; $row <= $rows; $row++ )3258 for ( $col = 1; $col <= 3; $col++ )3259 $table[$row][$col] = array_shift( $theme_keys );3260 3261 foreach ( $table as $row => $cols ) {3262 echo "\t<tr>\n";3263 foreach ( $cols as $col => $theme_index ) {3264 $class = array( 'available-theme' );3265 if ( $row == 1 ) $class[] = 'top';3266 if ( $col == 1 ) $class[] = 'left';3267 if ( $row == $rows ) $class[] = 'bottom';3268 if ( $col == 3 ) $class[] = 'right';3269 ?>3270 <td class="<?php echo join( ' ', $class ); ?>"><?php3271 if ( isset( $themes[$theme_index] ) )3272 display_theme( $themes[$theme_index] );3273 ?></td>3274 <?php } // end foreach $cols3275 echo "\t</tr>\n";3276 } // end foreach $table3277 }3278 }3279 -
trunk/wp-admin/includes/list-table-plugins.php
r15954 r15955 9 9 * @subpackage Administration 10 10 */ 11 12 class WP_Media_Table extends WP_List_Table {13 14 function WP_Media_Table() {15 global $detached;16 17 $detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );18 19 parent::WP_List_Table( array(20 'screen' => $detached ? 'upload-detached' : 'upload',21 'plural' => 'media'22 ) );23 }24 25 function check_permissions() {26 if ( !current_user_can('upload_files') )27 wp_die( __( 'You do not have permission to upload files.' ) );28 }29 30 function prepare_items() {31 global $lost, $wpdb, $wp_query, $post_mime_types, $avail_post_mime_types;32 33 $q = $_REQUEST;34 35 if ( !empty( $lost ) )36 $q['post__in'] = implode( ',', $lost );37 38 list( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $q );39 40 $this->is_trash = isset( $_REQUEST['status'] ) && 'trash' == $_REQUEST['status'];41 42 $this->set_pagination_args( array(43 'total_items' => $wp_query->found_posts,44 'total_pages' => $wp_query->max_num_pages,45 'per_page' => $wp_query->query_vars['posts_per_page'],46 ) );47 }48 49 function get_views() {50 global $wpdb, $post_mime_types, $detached, $avail_post_mime_types;51 52 $type_links = array();53 $_num_posts = (array) wp_count_attachments();54 $_total_posts = array_sum($_num_posts) - $_num_posts['trash'];55 if ( !isset( $total_orphans ) )56 $total_orphans = $wpdb->get_var( "SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent < 1" );57 $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));58 foreach ( $matches as $type => $reals )59 foreach ( $reals as $real )60 $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];61 62 $class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : '';63 $type_links['all'] = "<li><a href='upload.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $_total_posts, 'uploaded files' ), number_format_i18n( $_total_posts ) ) . '</a>';64 foreach ( $post_mime_types as $mime_type => $label ) {65 $class = '';66 67 if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )68 continue;69 70 if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )71 $class = ' class="current"';72 if ( !empty( $num_posts[$mime_type] ) )73 $type_links[$mime_type] = "<li><a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( _n( $label[2][0], $label[2][1], $num_posts[$mime_type] ), number_format_i18n( $num_posts[$mime_type] )) . '</a>';74 }75 $type_links['detached'] = '<li><a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( _nx( 'Unattached <span class="count">(%s)</span>', 'Unattached <span class="count">(%s)</span>', $total_orphans, 'detached files' ), number_format_i18n( $total_orphans ) ) . '</a>';76 77 if ( !empty($_num_posts['trash']) )78 $type_links['trash'] = '<li><a href="upload.php?status=trash"' . ( (isset($_GET['status']) && $_GET['status'] == 'trash' ) ? ' class="current"' : '') . '>' . sprintf( _nx( 'Trash <span class="count">(%s)</span>', 'Trash <span class="count">(%s)</span>', $_num_posts['trash'], 'uploaded files' ), number_format_i18n( $_num_posts['trash'] ) ) . '</a>';79 80 return $type_links;81 }82 83 function get_bulk_actions() {84 global $detached;85 86 $actions = array();87 $actions['delete'] = __( 'Delete Permanently' );88 if ( $detached )89 $actions['attach'] = __( 'Attach to a post' );90 91 return $actions;92 }93 94 function extra_tablenav( $which ) {95 global $post_type, $detached;96 ?>97 <div class="alignleft actions">98 <?php99 if ( 'top' == $which && !is_singular() && !$detached && !$this->is_trash ) {100 $this->months_dropdown( $post_type );101 102 do_action( 'restrict_manage_posts' );103 ?>104 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />105 <?php106 }107 108 if ( $detached ) { ?>109 <input type="submit" id="find_detached" name="find_detached" value="<?php esc_attr_e( 'Scan for lost attachments' ); ?>" class="button-secondary" />110 <?php } elseif ( $this->is_trash && current_user_can( 'edit_others_posts' ) ) { ?>111 <input type="submit" id="delete_all" name="delete_all" value="<?php esc_attr_e( 'Empty Trash' ); ?>" class="button-secondary apply" />112 <?php } ?>113 </div>114 <?php115 }116 117 function current_action() {118 if ( isset( $_REQUEST['find_detached'] ) )119 return 'find_detached';120 121 if ( isset( $_REQUEST['found_post_id'] ) && isset( $_REQUEST['media'] ) )122 return 'attach';123 124 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )125 return 'delete_all';126 127 return parent::current_action();128 }129 130 function has_items() {131 return have_posts();132 }133 134 function no_items() {135 _e( 'No media attachments found.' );136 }137 138 function get_columns() {139 $posts_columns = array();140 $posts_columns['cb'] = '<input type="checkbox" />';141 $posts_columns['icon'] = '';142 /* translators: column name */143 $posts_columns['title'] = _x( 'File', 'column name' );144 $posts_columns['author'] = __( 'Author' );145 //$posts_columns['tags'] = _x( 'Tags', 'column name' );146 /* translators: column name */147 if ( 'upload' == $this->_screen->id ) {148 $posts_columns['parent'] = _x( 'Attached to', 'column name' );149 $posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="' . esc_url( admin_url( 'images/comment-grey-bubble.png' ) ) . '" /></div>';150 }151 /* translators: column name */152 $posts_columns['date'] = _x( 'Date', 'column name' );153 $posts_columns = apply_filters( 'manage_media_columns', $posts_columns, 'upload' != $this->_screen->id );154 155 return $posts_columns;156 }157 158 function get_sortable_columns() {159 return array(160 'title' => 'title',161 'author' => 'author',162 'parent' => 'parent',163 'comments' => 'comment_count',164 'date' => 'date',165 );166 }167 168 function display_rows() {169 global $detached, $post, $id;170 171 if ( $detached ) {172 $this->display_orphans();173 return;174 }175 176 add_filter( 'the_title','esc_html' );177 $alt = '';178 179 while ( have_posts() ) : the_post();180 181 if ( $this->is_trash && $post->post_status != 'trash'182 || !$this->is_trash && $post->post_status == 'trash' )183 continue;184 185 $alt = ( 'alternate' == $alt ) ? '' : 'alternate';186 $post_owner = ( get_current_user_id() == $post->post_author ) ? 'self' : 'other';187 $att_title = _draft_or_post_title();188 ?>189 <tr id='post-<?php echo $id; ?>' class='<?php echo trim( $alt . ' author-' . $post_owner . ' status-' . $post->post_status ); ?>' valign="top">190 <?php191 192 list( $columns, $hidden ) = $this->get_column_info();193 foreach ( $columns as $column_name => $column_display_name ) {194 $class = "class='$column_name column-$column_name'";195 196 $style = '';197 if ( in_array( $column_name, $hidden ) )198 $style = ' style="display:none;"';199 200 $attributes = $class . $style;201 202 switch ( $column_name ) {203 204 case 'cb':205 ?>206 <th scope="row" class="check-column"><?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?><input type="checkbox" name="media[]" value="<?php the_ID(); ?>" /><?php } ?></th>207 <?php208 break;209 210 case 'icon':211 $attributes = 'class="column-icon media-icon"' . $style;212 ?>213 <td <?php echo $attributes ?>><?php214 if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {215 if ( $this->is_trash ) {216 echo $thumb;217 } else {218 ?>219 <a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>">220 <?php echo $thumb; ?>221 </a>222 223 <?php }224 }225 ?>226 </td>227 <?php228 break;229 230 case 'title':231 ?>232 <td <?php echo $attributes ?>><strong><?php if ( $this->is_trash ) echo $att_title; else { ?><a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php echo $att_title; ?></a><?php } ?></strong>233 <p>234 <?php235 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )236 echo esc_html( strtoupper( $matches[1] ) );237 else238 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );239 ?>240 </p>241 <?php242 $actions = array();243 if ( current_user_can( 'edit_post', $post->ID ) && !$this->is_trash )244 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';245 if ( current_user_can( 'delete_post', $post->ID ) ) {246 if ( $this->is_trash )247 $actions['untrash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=untrash&post=$post->ID", 'untrash-attachment_' . $post->ID ) . "'>" . __( 'Restore' ) . "</a>";248 elseif ( EMPTY_TRASH_DAYS && MEDIA_TRASH )249 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";250 if ( $this->is_trash || !EMPTY_TRASH_DAYS || !MEDIA_TRASH ) {251 $delete_ays = ( !$this->is_trash && !MEDIA_TRASH ) ? " onclick='return showNotice.warn();'" : '';252 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";253 }254 }255 if ( !$this->is_trash ) {256 $title =_draft_or_post_title( $post->post_parent );257 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';258 }259 $actions = apply_filters( 'media_row_actions', $actions, $post );260 echo $this->row_actions( $actions );261 ?>262 </td>263 <?php264 break;265 266 case 'author':267 ?>268 <td <?php echo $attributes ?>><?php the_author() ?></td>269 <?php270 break;271 272 case 'tags':273 ?>274 <td <?php echo $attributes ?>><?php275 $tags = get_the_tags();276 if ( !empty( $tags ) ) {277 $out = array();278 foreach ( $tags as $c )279 $out[] = "<a href='edit.php?tag=$c->slug'> " . esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'post_tag', 'display' ) ) . "</a>";280 echo join( ', ', $out );281 } else {282 _e( 'No Tags' );283 }284 ?>285 </td>286 <?php287 break;288 289 case 'desc':290 ?>291 <td <?php echo $attributes ?>><?php echo has_excerpt() ? $post->post_excerpt : ''; ?></td>292 <?php293 break;294 295 case 'date':296 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {297 $t_time = $h_time = __( 'Unpublished' );298 } else {299 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );300 $m_time = $post->post_date;301 $time = get_post_time( 'G', true, $post, false );302 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {303 if ( $t_diff < 0 )304 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );305 else306 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );307 } else {308 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );309 }310 }311 ?>312 <td <?php echo $attributes ?>><?php echo $h_time ?></td>313 <?php314 break;315 316 case 'parent':317 if ( $post->post_parent > 0 ) {318 if ( get_post( $post->post_parent ) ) {319 $title =_draft_or_post_title( $post->post_parent );320 }321 ?>322 <td <?php echo $attributes ?>>323 <strong><a href="<?php echo get_edit_post_link( $post->post_parent ); ?>"><?php echo $title ?></a></strong>,324 <?php echo get_the_time( __( 'Y/m/d' ) ); ?>325 </td>326 <?php327 } else {328 ?>329 <td <?php echo $attributes ?>><?php _e( '(Unattached)' ); ?><br />330 <a class="hide-if-no-js" onclick="findPosts.open( 'media[]','<?php echo $post->ID ?>' );return false;" href="#the-list"><?php _e( 'Attach' ); ?></a></td>331 <?php332 }333 break;334 335 case 'comments':336 $attributes = 'class="comments column-comments num"' . $style;337 ?>338 <td <?php echo $attributes ?>>339 <div class="post-com-count-wrapper">340 <?php341 $pending_comments = get_pending_comments_num( $post->ID );342 343 $this->comments_bubble( $post->ID, $pending_comments );344 ?>345 </div>346 </td>347 <?php348 break;349 350 case 'actions':351 ?>352 <td <?php echo $attributes ?>>353 <a href="media.php?action=edit&attachment_id=<?php the_ID(); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php _e( 'Edit' ); ?></a> |354 <a href="<?php the_permalink(); ?>"><?php _e( 'Get permalink' ); ?></a>355 </td>356 <?php357 break;358 359 default:360 ?>361 <td <?php echo $attributes ?>>362 <?php do_action( 'manage_media_custom_column', $column_name, $id ); ?>363 </td>364 <?php365 break;366 }367 }368 ?>369 </tr>370 <?php endwhile;371 }372 373 function display_orphans() {374 global $post;375 376 $class = '';377 378 while ( have_posts() ) : the_post();379 380 $class = ( 'alternate' == $class ) ? '' : 'alternate';381 $att_title = esc_html( _draft_or_post_title( $post->ID ) );382 383 $edit_link = '<a href="' . get_edit_post_link( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ) . '">%s</a>';384 ?>385 <tr id='post-<?php echo $post->ID; ?>' class='<?php echo $class; ?>' valign="top">386 <th scope="row" class="check-column">387 <?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?>388 <input type="checkbox" name="media[]" value="<?php echo esc_attr( $post->ID ); ?>" />389 <?php } ?>390 </th>391 392 <td class="media-icon">393 <?php if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {394 printf( $edit_link, $thumb );395 } ?>396 </td>397 398 <td class="media column-media">399 <strong><?php printf( $edit_link, $att_title ); ?></strong><br />400 <?php401 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )402 echo esc_html( strtoupper( $matches[1] ) );403 else404 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );405 ?>406 <?php407 $actions = array();408 if ( current_user_can( 'edit_post', $post->ID ) )409 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';410 if ( current_user_can( 'delete_post', $post->ID ) )411 if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) {412 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";413 } else {414 $delete_ays = !MEDIA_TRASH ? " onclick='return showNotice.warn();'" : '';415 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";416 }417 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $att_title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';418 if ( current_user_can( 'edit_post', $post->ID ) )419 $actions['attach'] = '<a href="#the-list" onclick="findPosts.open( \'media[]\',\''.$post->ID.'\' );return false;" class="hide-if-no-js">'.__( 'Attach' ).'</a>';420 $actions = apply_filters( 'media_row_actions', $actions, $post );421 422 echo $this->row_actions( $actions );423 ?>424 </td>425 <td class="author column-author">426 <?php $author = get_userdata( $post->post_author ); echo $author->display_name; ?>427 </td>428 <?php429 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {430 $t_time = $h_time = __( 'Unpublished' );431 } else {432 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );433 $m_time = $post->post_date;434 $time = get_post_time( 'G', true );435 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {436 if ( $t_diff < 0 )437 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );438 else439 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );440 } else {441 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );442 }443 }444 ?>445 <td class="date column-date"><?php echo $h_time ?></td>446 </tr>447 <?php448 endwhile;449 }450 }451 452 class WP_Terms_Table extends WP_List_Table {453 454 var $callback_args;455 456 function WP_Terms_Table() {457 global $post_type, $taxonomy, $tax, $current_screen;458 459 wp_reset_vars( array( 'action', 'taxonomy', 'post_type' ) );460 461 if ( empty( $taxonomy ) )462 $taxonomy = 'post_tag';463 464 if ( !taxonomy_exists( $taxonomy ) )465 wp_die( __( 'Invalid taxonomy' ) );466 467 $tax = get_taxonomy( $taxonomy );468 469 if ( empty( $post_type ) || !in_array( $post_type, get_post_types( array( 'public' => true ) ) ) )470 $post_type = 'post';471 472 if ( !isset( $current_screen ) )473 set_current_screen( 'edit-' . $taxonomy );474 475 parent::WP_List_Table( array(476 'screen' => $current_screen,477 'plural' => 'tags',478 'singular' => 'tag',479 ) );480 }481 482 function check_permissions( $type = 'manage' ) {483 global $tax;484 485 $cap = 'manage' == $type ? $tax->cap->manage_terms : $tax->cap->edit_terms;486 487 if ( !current_user_can( $tax->cap->manage_terms ) )488 wp_die( __( 'Cheatin’ uh?' ) );489 }490 491 function prepare_items() {492 global $taxonomy;493 494 $tags_per_page = $this->get_items_per_page( 'edit_' . $taxonomy . '_per_page' );495 496 if ( 'post_tag' == $taxonomy ) {497 $tags_per_page = apply_filters( 'edit_tags_per_page', $tags_per_page );498 $tags_per_page = apply_filters( 'tagsperpage', $tags_per_page ); // Old filter499 } elseif ( 'category' == $taxonomy ) {500 $tags_per_page = apply_filters( 'edit_categories_per_page', $tags_per_page ); // Old filter501 }502 503 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';504 505 $args = array(506 'search' => $search,507 'page' => $this->get_pagenum(),508 'number' => $tags_per_page,509 );510 511 if ( !empty( $_REQUEST['orderby'] ) )512 $args['orderby'] = trim( stripslashes( $_REQUEST['orderby'] ) );513 514 if ( !empty( $_REQUEST['order'] ) )515 $args['order'] = trim( stripslashes( $_REQUEST['order'] ) );516 517 $this->callback_args = $args;518 519 $this->set_pagination_args( array(520 'total_items' => wp_count_terms( $taxonomy, compact( 'search' ) ),521 'per_page' => $tags_per_page,522 ) );523 }524 525 function get_bulk_actions() {526 $actions = array();527 $actions['delete'] = __( 'Delete' );528 529 return $actions;530 }531 532 function current_action() {533 if ( isset( $_REQUEST['action'] ) && isset( $_REQUEST['delete_tags'] ) && ( 'delete' == $_REQUEST['action'] || 'delete' == $_REQUEST['action2'] ) )534 return 'bulk-delete';535 536 return parent::current_action();537 }538 539 function get_columns() {540 global $taxonomy;541 542 $columns = array(543 'cb' => '<input type="checkbox" />',544 'name' => __( 'Name' ),545 'description' => __( 'Description' ),546 'slug' => __( 'Slug' ),547 );548 549 if ( 'link_category' == $taxonomy )550 $columns['links'] = __( 'Links' );551 else552 $columns['posts'] = __( 'Posts' );553 554 return $columns;555 }556 557 function get_sortable_columns() {558 return array(559 'name' => 'name',560 'description' => 'description',561 'slug' => 'slug',562 'posts' => 'count',563 'links' => 'count'564 );565 }566 567 function display_rows() {568 global $taxonomy;569 570 $args = wp_parse_args( $this->callback_args, array(571 'page' => 1,572 'number' => 20,573 'search' => '',574 'hide_empty' => 0575 ) );576 577 extract( $args, EXTR_SKIP );578 579 $args['offset'] = $offset = ( $page - 1 ) * $number;580 581 // convert it to table rows582 $out = '';583 $count = 0;584 if ( is_taxonomy_hierarchical( $taxonomy ) && !isset( $orderby ) ) {585 // We'll need the full set of terms then.586 $args['number'] = $args['offset'] = 0;587 588 $terms = get_terms( $taxonomy, $args );589 if ( !empty( $search ) ) // Ignore children on searches.590 $children = array();591 else592 $children = _get_term_hierarchy( $taxonomy );593 594 // Some funky recursion to get the job done( Paging & parents mainly ) is contained within, Skip it for non-hierarchical taxonomies for performance sake595 $out .= $this->_rows( $taxonomy, $terms, $children, $offset, $number, $count );596 } else {597 $terms = get_terms( $taxonomy, $args );598 foreach ( $terms as $term )599 $out .= $this->single_row( $term, 0, $taxonomy );600 $count = $number; // Only displaying a single page.601 }602 603 echo $out;604 }605 606 function _rows( $taxonomy, $terms, &$children, $start = 0, $per_page = 20, &$count, $parent = 0, $level = 0 ) {607 608 $end = $start + $per_page;609 610 $output = '';611 foreach ( $terms as $key => $term ) {612 613 if ( $count >= $end )614 break;615 616 if ( $term->parent != $parent && empty( $_REQUEST['s'] ) )617 continue;618 619 // If the page starts in a subtree, print the parents.620 if ( $count == $start && $term->parent > 0 && empty( $_REQUEST['s'] ) ) {621 $my_parents = $parent_ids = array();622 $p = $term->parent;623 while ( $p ) {624 $my_parent = get_term( $p, $taxonomy );625 $my_parents[] = $my_parent;626 $p = $my_parent->parent;627 if ( in_array( $p, $parent_ids ) ) // Prevent parent loops.628 break;629 $parent_ids[] = $p;630 }631 unset( $parent_ids );632 633 $num_parents = count( $my_parents );634 while ( $my_parent = array_pop( $my_parents ) ) {635 $output .= "\t" . $this->single_row( $my_parent, $level - $num_parents, $taxonomy );636 $num_parents--;637 }638 }639 640 if ( $count >= $start )641 $output .= "\t" . $this->single_row( $term, $level, $taxonomy );642 643 ++$count;644 645 unset( $terms[$key] );646 647 if ( isset( $children[$term->term_id] ) && empty( $_REQUEST['s'] ) )648 $output .= $this->_rows( $taxonomy, $terms, $children, $start, $per_page, $count, $term->term_id, $level + 1 );649 }650 651 return $output;652 }653 654 function single_row( $tag, $level = 0 ) {655 static $row_class = '';656 $row_class = ( $row_class == '' ? ' class="alternate"' : '' );657 658 $this->level = $level;659 660 echo '<tr id="tag-' . $tag->term_id . '"' . $row_class . '>';661 echo $this->single_row_columns( $tag );662 echo '</tr>';663 }664 665 function column_cb( $tag ) {666 global $taxonomy, $tax;667 668 $default_term = get_option( 'default_' . $taxonomy );669 670 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )671 return '<input type="checkbox" name="delete_tags[]" value="' . $tag->term_id . '" />';672 else673 return ' ';674 }675 676 function column_name( $tag ) {677 global $taxonomy, $tax, $post_type;678 679 $default_term = get_option( 'default_' . $taxonomy );680 681 $pad = str_repeat( '— ', max( 0, $this->level ) );682 $name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag );683 $qe_data = get_term( $tag->term_id, $taxonomy, OBJECT, 'edit' );684 $edit_link = get_edit_term_link( $tag->term_id, $taxonomy, $post_type );685 686 $out = '<strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $name ) ) . '">' . $name . '</a></strong><br />';687 688 $actions = array();689 if ( current_user_can( $tax->cap->edit_terms ) ) {690 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';691 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __( 'Quick Edit' ) . '</a>';692 }693 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )694 $actions['delete'] = "<a class='delete-tag' href='" . wp_nonce_url( "edit-tags.php?action=delete&taxonomy=$taxonomy&tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id ) . "'>" . __( 'Delete' ) . "</a>";695 696 $actions = apply_filters( 'tag_row_actions', $actions, $tag );697 $actions = apply_filters( "${taxonomy}_row_actions", $actions, $tag );698 699 $out .= $this->row_actions( $actions );700 $out .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';701 $out .= '<div class="name">' . $qe_data->name . '</div>';702 $out .= '<div class="slug">' . apply_filters( 'editable_slug', $qe_data->slug ) . '</div>';703 $out .= '<div class="parent">' . $qe_data->parent . '</div></div></td>';704 705 return $out;706 }707 708 function column_description( $tag ) {709 return $tag->description;710 }711 712 function column_slug( $tag ) {713 return apply_filters( 'editable_slug', $tag->slug );714 }715 716 function column_posts( $tag ) {717 global $taxonomy, $post_type;718 719 $count = number_format_i18n( $tag->count );720 721 if ( 'post_tag' == $taxonomy ) {722 $tagsel = 'tag';723 } elseif ( 'category' == $taxonomy ) {724 $tagsel = 'category_name';725 } elseif ( ! empty( $tax->query_var ) ) {726 $tagsel = $tax->query_var;727 } else {728 $tagsel = $taxonomy;729 }730 731 return "<a href='edit.php?$tagsel=$tag->slug&post_type=$post_type'>$count</a>";732 }733 734 function column_links( $tag ) {735 $count = number_format_i18n( $tag->count );736 return $count;737 }738 739 function column_default( $tag, $column_name ) {740 global $taxonomy;741 742 return apply_filters( "manage_${taxonomy}_custom_column", '', $column_name, $tag->term_id );743 $out .= "</td>";744 }745 746 /**747 * Outputs the hidden row displayed when inline editing748 *749 * @since 3.1.0750 */751 function inline_edit() {752 global $tax;753 754 if ( ! current_user_can( $tax->cap->edit_terms ) )755 return;756 757 list( $columns, $hidden ) = $this->get_column_info();758 759 $col_count = count( $columns ) - count( $hidden );760 ?>761 762 <form method="get" action=""><table style="display: none"><tbody id="inlineedit">763 <tr id="inline-edit" class="inline-edit-row" style="display: none"><td colspan="<?php echo $col_count; ?>">764 765 <fieldset><div class="inline-edit-col">766 <h4><?php _e( 'Quick Edit' ); ?></h4>767 768 <label>769 <span class="title"><?php _e( 'Name' ); ?></span>770 <span class="input-text-wrap"><input type="text" name="name" class="ptitle" value="" /></span>771 </label>772 <?php if ( !global_terms_enabled() ) { ?>773 <label>774 <span class="title"><?php _e( 'Slug' ); ?></span>775 <span class="input-text-wrap"><input type="text" name="slug" class="ptitle" value="" /></span>776 </label>777 <?php } ?>778 779 </div></fieldset>780 <?php781 782 $core_columns = array( 'cb' => true, 'description' => true, 'name' => true, 'slug' => true, 'posts' => true );783 784 foreach ( $columns as $column_name => $column_display_name ) {785 if ( isset( $core_columns[$column_name] ) )786 continue;787 do_action( 'quick_edit_custom_box', $column_name, $type, $tax->taxonomy );788 }789 790 ?>791 792 <p class="inline-edit-save submit">793 <a accesskey="c" href="#inline-edit" title="<?php _e( 'Cancel' ); ?>" class="cancel button-secondary alignleft"><?php _e( 'Cancel' ); ?></a>794 <?php $update_text = $tax->labels->update_item; ?>795 <a accesskey="s" href="#inline-edit" title="<?php echo esc_attr( $update_text ); ?>" class="save button-primary alignright"><?php echo $update_text; ?></a>796 <img class="waiting" style="display:none;" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" />797 <span class="error" style="display:none;"></span>798 <?php wp_nonce_field( 'taxinlineeditnonce', '_inline_edit', false ); ?>799 <input type="hidden" name="taxonomy" value="<?php echo esc_attr( $tax->name ); ?>" />800 <br class="clear" />801 </p>802 </td></tr>803 </tbody></table></form>804 <?php805 }806 }807 808 class WP_Users_Table extends WP_List_Table {809 810 function WP_Users_Table() {811 parent::WP_List_Table( array(812 'screen' => 'users',813 'plural' => 'users'814 ) );815 }816 817 function check_permissions() {818 if ( !current_user_can('list_users') )819 wp_die(__('Cheatin’ uh?'));820 }821 822 function prepare_items() {823 global $role, $usersearch;824 825 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';826 827 $role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : '';828 829 $users_per_page = $this->get_items_per_page( 'users_per_page' );830 831 $paged = $this->get_pagenum();832 833 $args = array(834 'number' => $users_per_page,835 'offset' => ( $paged-1 ) * $users_per_page,836 'role' => $role,837 'search' => $usersearch838 );839 840 if ( isset( $_REQUEST['orderby'] ) )841 $args['orderby'] = $_REQUEST['orderby'];842 843 if ( isset( $_REQUEST['order'] ) )844 $args['order'] = $_REQUEST['order'];845 846 // Query the user IDs for this page847 $wp_user_search = new WP_User_Query( $args );848 849 $this->items = $wp_user_search->get_results();850 851 $this->set_pagination_args( array(852 'total_items' => $wp_user_search->get_total(),853 'per_page' => $users_per_page,854 ) );855 }856 857 function no_items() {858 _e( 'No matching users were found.' );859 }860 861 function get_views() {862 global $wp_roles, $role;863 864 $users_of_blog = count_users();865 $total_users = $users_of_blog['total_users'];866 $avail_roles =& $users_of_blog['avail_roles'];867 unset($users_of_blog);868 869 $current_role = false;870 $class = empty($role) ? ' class="current"' : '';871 $role_links = array();872 $role_links['all'] = "<li><a href='users.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>';873 foreach ( $wp_roles->get_names() as $this_role => $name ) {874 if ( !isset($avail_roles[$this_role]) )875 continue;876 877 $class = '';878 879 if ( $this_role == $role ) {880 $current_role = $role;881 $class = ' class="current"';882 }883 884 $name = translate_user_role( $name );885 /* translators: User role name with count */886 $name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, $avail_roles[$this_role] );887 $role_links[$this_role] = "<li><a href='users.php?role=$this_role'$class>$name</a>";888 }889 890 return $role_links;891 }892 893 function get_bulk_actions() {894 $actions = array();895 896 if ( !is_multisite() && current_user_can( 'delete_users' ) )897 $actions['delete'] = __( 'Delete' );898 else899 $actions['remove'] = __( 'Remove' );900 901 return $actions;902 }903 904 function extra_tablenav( $which ) {905 if ( 'top' != $which )906 return;907 ?>908 <div class="alignleft actions">909 <label class="screen-reader-text" for="new_role"><?php _e( 'Change role to…' ) ?></label>910 <select name="new_role" id="new_role">911 <option value=''><?php _e( 'Change role to…' ) ?></option>912 <?php wp_dropdown_roles(); ?>913 </select>914 <input type="submit" value="<?php esc_attr_e( 'Change' ); ?>" name="changeit" class="button-secondary" />915 </div>916 <?php917 }918 919 function current_action() {920 if ( isset($_REQUEST['changeit']) && !empty($_REQUEST['new_role']) )921 return 'promote';922 923 return parent::current_action();924 }925 926 function get_columns() {927 return array(928 'cb' => '<input type="checkbox" />',929 'username' => __( 'Login' ),930 'name' => __( 'Name' ),931 'email' => __( 'E-mail' ),932 'role' => __( 'Role' ),933 'posts' => __( 'Posts' )934 );935 }936 937 function get_sortable_columns() {938 return array(939 'username' => 'login',940 'name' => 'name',941 'email' => 'email',942 'posts' => 'post_count',943 );944 }945 946 function display_rows() {947 // Query the post counts for this page948 $post_counts = count_many_users_posts( array_keys( $this->items ) );949 950 $style = '';951 foreach ( $this->items as $userid => $user_object ) {952 $role = reset( $user_object->roles );953 954 if ( is_multisite() && empty( $role ) )955 continue;956 957 $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"';958 echo "\n\t", $this->single_row( $user_object, $style, $role, $post_counts[ $userid ] );959 }960 }961 962 /**963 * Generate HTML for a single row on the users.php admin panel.964 *965 * @since 2.1.0966 *967 * @param object $user_object968 * @param string $style Optional. Attributes added to the TR element. Must be sanitized.969 * @param string $role Key for the $wp_roles array.970 * @param int $numposts Optional. Post count to display for this user. Defaults to zero, as in, a new user has made zero posts.971 * @return string972 */973 function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) {974 global $wp_roles;975 976 if ( !( is_object( $user_object ) && is_a( $user_object, 'WP_User' ) ) )977 $user_object = new WP_User( (int) $user_object );978 $user_object = sanitize_user_object( $user_object, 'display' );979 $email = $user_object->user_email;980 $url = $user_object->user_url;981 $short_url = str_replace( 'http://', '', $url );982 $short_url = str_replace( 'www.', '', $short_url );983 if ( '/' == substr( $short_url, -1 ) )984 $short_url = substr( $short_url, 0, -1 );985 if ( strlen( $short_url ) > 35 )986 $short_url = substr( $short_url, 0, 32 ).'...';987 $checkbox = '';988 // Check if the user for this row is editable989 if ( current_user_can( 'list_users' ) ) {990 // Set up the user editing link991 // TODO: make profile/user-edit determination a separate function992 if ( get_current_user_id() == $user_object->ID ) {993 $edit_link = 'profile.php';994 } else {995 $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( esc_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" ) );996 }997 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";998 999 // Set up the hover actions for this user1000 $actions = array();1001 1002 if ( current_user_can( 'edit_user', $user_object->ID ) ) {1003 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";1004 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';1005 } else {1006 $edit = "<strong>$user_object->user_login</strong><br />";1007 }1008 1009 if ( !is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) )1010 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=delete&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Delete' ) . "</a>";1011 if ( is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'remove_user', $user_object->ID ) )1012 $actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=remove&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . "</a>";1013 $actions = apply_filters( 'user_row_actions', $actions, $user_object );1014 $edit .= $this->row_actions( $actions );1015 1016 // Set up the checkbox ( because the user is editable, otherwise its empty )1017 $checkbox = "<input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='$role' value='{$user_object->ID}' />";1018 1019 } else {1020 $edit = '<strong>' . $user_object->user_login . '</strong>';1021 }1022 $role_name = isset( $wp_roles->role_names[$role] ) ? translate_user_role( $wp_roles->role_names[$role] ) : __( 'None' );1023 $r = "<tr id='user-$user_object->ID'$style>";1024 $avatar = get_avatar( $user_object->ID, 32 );1025 1026 list( $columns, $hidden ) = $this->get_column_info();1027 1028 foreach ( $columns as $column_name => $column_display_name ) {1029 $class = "class=\"$column_name column-$column_name\"";1030 1031 $style = '';1032 if ( in_array( $column_name, $hidden ) )1033 $style = ' style="display:none;"';1034 1035 $attributes = "$class$style";1036 1037 switch ( $column_name ) {1038 case 'cb':1039 $r .= "<th scope='row' class='check-column'>$checkbox</th>";1040 break;1041 case 'username':1042 $r .= "<td $attributes>$avatar $edit</td>";1043 break;1044 case 'name':1045 $r .= "<td $attributes>$user_object->first_name $user_object->last_name</td>";1046 break;1047 case 'email':1048 $r .= "<td $attributes><a href='mailto:$email' title='" . sprintf( __( 'E-mail: %s' ), $email ) . "'>$email</a></td>";1049 break;1050 case 'role':1051 $r .= "<td $attributes>$role_name</td>";1052 break;1053 case 'posts':1054 $attributes = 'class="posts column-posts num"' . $style;1055 $r .= "<td $attributes>";1056 if ( $numposts > 0 ) {1057 $r .= "<a href='edit.php?author=$user_object->ID' title='" . __( 'View posts by this author' ) . "' class='edit'>";1058 $r .= $numposts;1059 $r .= '</a>';1060 } else {1061 $r .= 0;1062 }1063 $r .= "</td>";1064 break;1065 default:1066 $r .= "<td $attributes>";1067 $r .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID );1068 $r .= "</td>";1069 }1070 }1071 $r .= '</tr>';1072 1073 return $r;1074 }1075 }1076 1077 class WP_Comments_Table extends WP_List_Table {1078 1079 var $checkbox = true;1080 var $from_ajax = false;1081 1082 var $pending_count = array();1083 1084 function WP_Comments_Table() {1085 global $mode;1086 1087 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'detail' : $_REQUEST['mode'];1088 1089 if ( get_option('show_avatars') && 'single' != $mode )1090 add_filter( 'comment_author', 'floated_admin_avatar' );1091 1092 parent::WP_List_Table( array(1093 'screen' => 'edit-comments',1094 'plural' => 'comments'1095 ) );1096 }1097 1098 function check_permissions() {1099 if ( !current_user_can('edit_posts') )1100 wp_die(__('Cheatin’ uh?'));1101 }1102 1103 function prepare_items() {1104 global $post_id, $comment_status, $search;1105 1106 if ( isset( $_REQUEST['p'] ) )1107 $post_id = absint( $_REQUEST['p'] );1108 elseif ( isset( $_REQUEST['post'] ) )1109 $post_id = absint( $_REQUEST['post'] );1110 elseif ( isset( $_REQUEST['post_ID'] ) )1111 $post_id = absint( $_REQUEST['post_ID'] );1112 else1113 $post_id = 0;1114 1115 $comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all';1116 if ( !in_array( $comment_status, array( 'all', 'moderated', 'approved', 'spam', 'trash' ) ) )1117 $comment_status = 'all';1118 1119 $comment_type = !empty( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : '';1120 1121 $search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : '';1122 1123 $user_id = ( isset( $_REQUEST['user_id'] ) ) ? $_REQUEST['user_id'] : '';1124 1125 $comments_per_page = $this->get_items_per_page( 'edit_comments_per_page' );1126 $comments_per_page = apply_filters( 'comments_per_page', $comments_per_page, $comment_status );1127 1128 if ( isset( $_POST['number'] ) )1129 $number = (int) $_POST['number'];1130 else1131 $number = $comments_per_page + min( 8, $comments_per_page ); // Grab a few extra1132 1133 $page = $this->get_pagenum();1134 1135 $start = $offset = ( $page - 1 ) * $comments_per_page;1136 1137 $status_map = array(1138 'moderated' => 'hold',1139 'approved' => 'approve'1140 );1141 1142 $args = array(1143 'status' => isset( $status_map[$comment_status] ) ? $status_map[$comment_status] : $comment_status,1144 'search' => $search,1145 'user_id' => $user_id,1146 'offset' => $start,1147 'number' => $number,1148 'post_id' => $post_id,1149 'type' => $comment_type,1150 'orderby' => @$_REQUEST['orderby'],1151 'order' => @$_REQUEST['order'],1152 );1153 1154 $_comments = get_comments( $args );1155 1156 update_comment_cache( $_comments );1157 1158 $this->items = array_slice( $_comments, 0, $comments_per_page );1159 $this->extra_items = array_slice( $_comments, $comments_per_page );1160 1161 $total_comments = get_comments( array_merge( $args, array('count' => true, 'offset' => 0, 'number' => 0) ) );1162 1163 $_comment_post_ids = array();1164 foreach ( $_comments as $_c ) {1165 $_comment_post_ids[] = $_c->comment_post_ID;1166 }1167 1168 $this->pending_count = get_pending_comments_num( $_comment_post_ids );1169 1170 $this->set_pagination_args( array(1171 'total_items' => $total_comments,1172 'per_page' => $comments_per_page,1173 ) );1174 }1175 1176 function get_views() {1177 global $post_id, $comment_status;1178 1179 $status_links = array();1180 $num_comments = ( $post_id ) ? wp_count_comments( $post_id ) : wp_count_comments();1181 //, number_format_i18n($num_comments->moderated) ), "<span class='comment-count'>" . number_format_i18n($num_comments->moderated) . "</span>"),1182 //, number_format_i18n($num_comments->spam) ), "<span class='spam-comment-count'>" . number_format_i18n($num_comments->spam) . "</span>")1183 $stati = array(1184 'all' => _nx_noop('All', 'All', 'comments'), // singular not used1185 'moderated' => _n_noop('Pending <span class="count">(<span class="pending-count">%s</span>)</span>', 'Pending <span class="count">(<span class="pending-count">%s</span>)</span>'),1186 'approved' => _n_noop('Approved', 'Approved'), // singular not used1187 'spam' => _n_noop('Spam <span class="count">(<span class="spam-count">%s</span>)</span>', 'Spam <span class="count">(<span class="spam-count">%s</span>)</span>'),1188 'trash' => _n_noop('Trash <span class="count">(<span class="trash-count">%s</span>)</span>', 'Trash <span class="count">(<span class="trash-count">%s</span>)</span>')1189 );1190 1191 if ( !EMPTY_TRASH_DAYS )1192 unset($stati['trash']);1193 1194 $link = 'edit-comments.php';1195 if ( !empty($comment_type) && 'all' != $comment_type )1196 $link = add_query_arg( 'comment_type', $comment_type, $link );1197 1198 foreach ( $stati as $status => $label ) {1199 $class = ( $status == $comment_status ) ? ' class="current"' : '';1200 1201 if ( !isset( $num_comments->$status ) )1202 $num_comments->$status = 10;1203 $link = add_query_arg( 'comment_status', $status, $link );1204 if ( $post_id )1205 $link = add_query_arg( 'p', absint( $post_id ), $link );1206 /*1207 // I toyed with this, but decided against it. Leaving it in here in case anyone thinks it is a good idea. ~ Mark1208 if ( !empty( $_REQUEST['s'] ) )1209 $link = add_query_arg( 's', esc_attr( stripslashes( $_REQUEST['s'] ) ), $link );1210 */1211 $status_links[$status] = "<li class='$status'><a href='$link'$class>" . sprintf(1212 _n( $label[0], $label[1], $num_comments->$status ),1213 number_format_i18n( $num_comments->$status )1214 ) . '</a>';1215 }1216 1217 $status_links = apply_filters( 'comment_status_links', $status_links );1218 return $status_links;1219 }1220 1221 function get_bulk_actions() {1222 global $comment_status;1223 1224 $actions = array();1225 if ( in_array( $comment_status, array( 'all', 'approved' ) ) )1226 $actions['unapprove'] = __( 'Unapprove' );1227 if ( in_array( $comment_status, array( 'all', 'moderated', 'spam' ) ) )1228 $actions['approve'] = __( 'Approve' );1229 if ( in_array( $comment_status, array( 'all', 'moderated', 'approved' ) ) )1230 $actions['spam'] = _x( 'Mark as Spam', 'comment' );1231 1232 if ( 'trash' == $comment_status )1233 $actions['untrash'] = __( 'Restore' );1234 elseif ( 'spam' == $comment_status )1235 $actions['unspam'] = _x( 'Not Spam', 'comment' );1236 1237 if ( in_array( $comment_status, array( 'trash', 'spam' ) ) || !EMPTY_TRASH_DAYS )1238 $actions['delete'] = __( 'Delete Permanently' );1239 else1240 $actions['trash'] = __( 'Move to Trash' );1241 1242 return $actions;1243 }1244 1245 function extra_tablenav( $which ) {1246 global $comment_status, $comment_type;1247 ?>1248 <div class="alignleft actions">1249 <?php1250 if ( 'top' == $which ) {1251 ?>1252 <select name="comment_type">1253 <option value=""><?php _e( 'Show all comment types' ); ?></option>1254 <?php1255 $comment_types = apply_filters( 'admin_comment_types_dropdown', array(1256 'comment' => __( 'Comments' ),1257 'pings' => __( 'Pings' ),1258 ) );1259 1260 foreach ( $comment_types as $type => $label )1261 echo "\t<option value='" . esc_attr( $type ) . "'" . selected( $comment_type, $type, false ) . ">$label</option>\n";1262 ?>1263 </select>1264 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />1265 <?php1266 }1267 1268 if ( ( 'spam' == $comment_status || 'trash' == $comment_status ) && current_user_can( 'moderate_comments' ) ) {1269 wp_nonce_field( 'bulk-destroy', '_destroy_nonce' );1270 $title = ( 'spam' == $comment_status ) ? esc_attr__( 'Empty Spam' ) : esc_attr__( 'Empty Trash' );1271 ?>1272 <input type="submit" name="delete_all" id="delete_all" value="<?php echo $title ?>" class="button-secondary apply" />1273 <?php1274 }1275 ?>1276 <?php1277 do_action( 'manage_comments_nav', $comment_status );1278 echo '</div>';1279 }1280 1281 function current_action() {1282 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )1283 return 'delete_all';1284 1285 return parent::current_action();1286 }1287 1288 function get_columns() {1289 global $mode;1290 1291 $columns = array();1292 1293 if ( $this->checkbox )1294 $columns['cb'] = '<input type="checkbox" />';1295 1296 $columns['author'] = __( 'Author' );1297 $columns['comment'] = _x( 'Comment', 'column name' );1298 1299 if ( 'single' !== $mode )1300 $columns['response'] = _x( 'Comment', 'column name' );1301 1302 return $columns;1303 }1304 1305 function get_sortable_columns() {1306 return array(1307 'author' => 'comment_author',1308 'comment' => 'comment_content',1309 'response' => 'comment_post_ID'1310 );1311 }1312 1313 function display_table() {1314 extract( $this->_args );1315 1316 $this->display_tablenav( 'top' );1317 1318 ?>1319 <table class="<?php echo implode( ' ', $this->get_table_classes() ); ?>" cellspacing="0">1320 <thead>1321 <tr>1322 <?php $this->print_column_headers(); ?>1323 </tr>1324 </thead>1325 1326 <tfoot>1327 <tr>1328 <?php $this->print_column_headers( false ); ?>1329 </tr>1330 </tfoot>1331 1332 <tbody id="the-comment-list" class="list:comment">1333 <?php $this->display_rows(); ?>1334 </tbody>1335 1336 <tbody id="the-extra-comment-list" class="list:comment" style="display: none;">1337 <?php $this->items = $this->extra_items; $this->display_rows(); ?>1338 </tbody>1339 </table>1340 <?php1341 1342 $this->display_tablenav( 'bottom' );1343 }1344 1345 function single_row( $a_comment ) {1346 global $post, $comment, $the_comment_status;1347 1348 $comment = $a_comment;1349 $the_comment_status = wp_get_comment_status( $comment->comment_ID );1350 1351 $post = get_post( $comment->comment_post_ID );1352 1353 $this->user_can = current_user_can( 'edit_comment', $comment->comment_ID );1354 1355 echo "<tr id='comment-$comment->comment_ID' class='$the_comment_status'>";1356 echo $this->single_row_columns( $comment );1357 echo "</tr>\n";1358 }1359 1360 function column_cb( $comment ) {1361 if ( $this->user_can )1362 echo "<input type='checkbox' name='delete_comments[]' value='$comment->comment_ID' />";1363 }1364 1365 function column_comment( $comment ) {1366 global $post, $comment_status, $the_comment_status;1367 1368 $user_can = $this->user_can;1369 1370 $comment_url = esc_url( get_comment_link( $comment->comment_ID ) );1371 1372 $ptime = date( 'G', strtotime( $comment->comment_date ) );1373 if ( ( abs( time() - $ptime ) ) < 86400 )1374 $ptime = sprintf( __( '%s ago' ), human_time_diff( $ptime ) );1375 else1376 $ptime = mysql2date( __( 'Y/m/d \a\t g:i A' ), $comment->comment_date );1377 1378 if ( $user_can ) {1379 $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) );1380 $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) );1381 1382 $url = "comment.php?c=$comment->comment_ID";1383 1384 $approve_url = esc_url( $url . "&action=approvecomment&$approve_nonce" );1385 $unapprove_url = esc_url( $url . "&action=unapprovecomment&$approve_nonce" );1386 $spam_url = esc_url( $url . "&action=spamcomment&$del_nonce" );1387 $unspam_url = esc_url( $url . "&action=unspamcomment&$del_nonce" );1388 $trash_url = esc_url( $url . "&action=trashcomment&$del_nonce" );1389 $untrash_url = esc_url( $url . "&action=untrashcomment&$del_nonce" );1390 $delete_url = esc_url( $url . "&action=deletecomment&$del_nonce" );1391 }1392 1393 echo '<div id="submitted-on">';1394 /* translators: 2: comment date, 3: comment time */1395 printf( __( '<a href="%1$s">%2$s at %3$s</a>' ), $comment_url,1396 /* translators: comment date format. See http://php.net/date */ get_comment_date( __( 'Y/m/d' ) ),1397 /* translators: comment time format. See http://php.net/date */ get_comment_date( get_option( 'time_format' ) ) );1398 1399 if ( $comment->comment_parent ) {1400 $parent = get_comment( $comment->comment_parent );1401 $parent_link = esc_url( get_comment_link( $comment->comment_parent ) );1402 $name = get_comment_author( $parent->comment_ID );1403 printf( ' | '.__( 'In reply to <a href="%1$s">%2$s</a>.' ), $parent_link, $name );1404 }1405 1406 echo '</div>';1407 comment_text();1408 if ( $user_can ) { ?>1409 <div id="inline-<?php echo $comment->comment_ID; ?>" class="hidden">1410 <textarea class="comment" rows="1" cols="1"><?php echo esc_html( apply_filters( 'comment_edit_pre', $comment->comment_content ) ); ?></textarea>1411 <div class="author-email"><?php echo esc_attr( $comment->comment_author_email ); ?></div>1412 <div class="author"><?php echo esc_attr( $comment->comment_author ); ?></div>1413 <div class="author-url"><?php echo esc_attr( $comment->comment_author_url ); ?></div>1414 <div class="comment_status"><?php echo $comment->comment_approved; ?></div>1415 </div>1416 <?php1417 }1418 1419 if ( $user_can ) {1420 // preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash1421 $actions = array(1422 'approve' => '', 'unapprove' => '',1423 'reply' => '',1424 'quickedit' => '',1425 'edit' => '',1426 'spam' => '', 'unspam' => '',1427 'trash' => '', 'untrash' => '', 'delete' => ''1428 );1429 1430 if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments1431 if ( 'approved' == $the_comment_status )1432 $actions['unapprove'] = "<a href='$unapprove_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=unapproved vim-u vim-destructive' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';1433 else if ( 'unapproved' == $the_comment_status )1434 $actions['approve'] = "<a href='$approve_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=approved vim-a vim-destructive' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';1435 } else {1436 $actions['approve'] = "<a href='$approve_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved vim-a' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';1437 $actions['unapprove'] = "<a href='$unapprove_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved vim-u' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';1438 }1439 1440 if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) {1441 $actions['spam'] = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1 vim-s vim-destructive' title='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>';1442 } elseif ( 'spam' == $the_comment_status ) {1443 $actions['unspam'] = "<a href='$unspam_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:unspam=1 vim-z vim-destructive'>" . _x( 'Not Spam', 'comment' ) . '</a>';1444 } elseif ( 'trash' == $the_comment_status ) {1445 $actions['untrash'] = "<a href='$untrash_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:untrash=1 vim-z vim-destructive'>" . __( 'Restore' ) . '</a>';1446 }1447 1448 if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) {1449 $actions['delete'] = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID::delete=1 delete vim-d vim-destructive'>" . __( 'Delete Permanently' ) . '</a>';1450 } else {1451 $actions['trash'] = "<a href='$trash_url' class='delete:the-comment-list:comment-$comment->comment_ID::trash=1 delete vim-d vim-destructive' title='" . esc_attr__( 'Move this comment to the trash' ) . "'>" . _x( 'Trash', 'verb' ) . '</a>';1452 }1453 1454 if ( 'trash' != $the_comment_status ) {1455 $actions['edit'] = "<a href='comment.php?action=editcomment&c={$comment->comment_ID}' title='" . esc_attr__( 'Edit comment' ) . "'>". __( 'Edit' ) . '</a>';1456 $actions['quickedit'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\',\'edit\' );return false;" class="vim-q" title="'.esc_attr__( 'Quick Edit' ).'" href="#">' . __( 'Quick Edit' ) . '</a>';1457 if ( 'spam' != $the_comment_status )1458 $actions['reply'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\' );return false;" class="vim-r" title="'.esc_attr__( 'Reply to this comment' ).'" href="#">' . __( 'Reply' ) . '</a>';1459 }1460 1461 $actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment );1462 1463 $i = 0;1464 echo '<div class="row-actions">';1465 foreach ( $actions as $action => $link ) {1466 ++$i;1467 ( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';1468 1469 // Reply and quickedit need a hide-if-no-js span when not added with ajax1470 if ( ( 'reply' == $action || 'quickedit' == $action ) && ! $this->from_ajax )1471 $action .= ' hide-if-no-js';1472 elseif ( ( $action == 'untrash' && $the_comment_status == 'trash' ) || ( $action == 'unspam' && $the_comment_status == 'spam' ) ) {1473 if ( '1' == get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) )1474 $action .= ' approve';1475 else1476 $action .= ' unapprove';1477 }1478 1479 echo "<span class='$action'>$sep$link</span>";1480 }1481 echo '</div>';1482 }1483 }1484 1485 function column_author( $comment ) {1486 global $comment_status;1487 1488 $author_url = get_comment_author_url();1489 if ( 'http://' == $author_url )1490 $author_url = '';1491 $author_url_display = preg_replace( '|http://(www\.)?|i', '', $author_url );1492 if ( strlen( $author_url_display ) > 50 )1493 $author_url_display = substr( $author_url_display, 0, 49 ) . '...';1494 1495 echo "<strong>"; comment_author(); echo '</strong><br />';1496 if ( !empty( $author_url ) )1497 echo "<a title='$author_url' href='$author_url'>$author_url_display</a><br />";1498 1499 if ( $this->user_can ) {1500 if ( !empty( $comment->comment_author_email ) ) {1501 comment_author_email_link();1502 echo '<br />';1503 }1504 echo '<a href="edit-comments.php?s=';1505 comment_author_IP();1506 echo '&mode=detail';1507 if ( 'spam' == $comment_status )1508 echo '&comment_status=spam';1509 echo '">';1510 comment_author_IP();1511 echo '</a>';1512 }1513 }1514 1515 function column_date( $comment ) {1516 return get_comment_date( __( 'Y/m/d \a\t g:ia' ) );1517 }1518 1519 function column_response( $comment ) {1520 global $post;1521 1522 if ( isset( $this->pending_count[$post->ID] ) ) {1523 $pending_comments = $this->pending_count[$post->ID];1524 } else {1525 $_pending_count_temp = get_pending_comments_num( array( $post->ID ) );1526 $pending_comments = $this->pending_count[$post->ID] = $_pending_count_temp[$post->ID];1527 }1528 1529 if ( current_user_can( 'edit_post', $post->ID ) ) {1530 $post_link = "<a href='" . get_edit_post_link( $post->ID ) . "'>";1531 $post_link .= get_the_title( $post->ID ) . '</a>';1532 } else {1533 $post_link = get_the_title( $post->ID );1534 }1535 1536 echo '<div class="response-links"><span class="post-com-count-wrapper">';1537 echo $post_link . '<br />';1538 $this->comments_bubble( $post->ID, $pending_comments );1539 echo '</span> ';1540 echo "<a href='" . get_permalink( $post->ID ) . "'>#</a>";1541 echo '</div>';1542 if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) )1543 echo $thumb;1544 }1545 1546 function column_default( $comment, $column_name ) {1547 do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID );1548 }1549 }1550 1551 class WP_Post_Comments_Table extends WP_Comments_Table {1552 1553 function get_columns() {1554 return array(1555 'author' => __( 'Author' ),1556 'comment' => _x( 'Comment', 'column name' ),1557 );1558 }1559 1560 function get_sortable_columns() {1561 return array();1562 }1563 }1564 1565 class WP_Links_Table extends WP_List_Table {1566 1567 function WP_Links_Table() {1568 parent::WP_List_Table( array(1569 'screen' => 'link-manager',1570 'plural' => 'bookmarks',1571 ) );1572 }1573 1574 function check_permissions() {1575 if ( ! current_user_can( 'manage_links' ) )1576 wp_die( __( 'You do not have sufficient permissions to edit the links for this site.' ) );1577 }1578 1579 function prepare_items() {1580 global $cat_id, $s, $orderby, $order;1581 1582 wp_reset_vars( array( 'action', 'cat_id', 'linkurl', 'name', 'image', 'description', 'visible', 'target', 'category', 'link_id', 'submit', 'orderby', 'order', 'links_show_cat_id', 'rating', 'rel', 'notes', 'linkcheck[]', 's' ) );1583 1584 $args = array( 'hide_invisible' => 0, 'hide_empty' => 0 );1585 1586 if ( 'all' != $cat_id )1587 $args['category'] = $cat_id;1588 if ( !empty( $s ) )1589 $args['search'] = $s;1590 if ( !empty( $orderby ) )1591 $args['orderby'] = $orderby;1592 if ( !empty( $order ) )1593 $args['order'] = $order;1594 1595 $this->items = get_bookmarks( $args );1596 }1597 1598 function no_items() {1599 _e( 'No links found.' );1600 }1601 1602 function get_bulk_actions() {1603 $actions = array();1604 $actions['delete'] = __( 'Delete' );1605 1606 return $actions;1607 }1608 1609 function extra_tablenav( $which ) {1610 global $cat_id;1611 1612 if ( 'top' != $which )1613 return;1614 ?>1615 <div class="alignleft actions">1616 <?php1617 $dropdown_options = array(1618 'selected' => $cat_id,1619 'name' => 'cat_id',1620 'taxonomy' => 'link_category',1621 'show_option_all' => __( 'View all categories' ),1622 'hide_empty' => true,1623 'hierarchical' => 1,1624 'show_count' => 0,1625 'orderby' => 'name',1626 );1627 wp_dropdown_categories( $dropdown_options );1628 ?>1629 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />1630 </div>1631 <?php1632 }1633 1634 function get_columns() {1635 return array(1636 'cb' => '<input type="checkbox" />',1637 'name' => __( 'Name' ),1638 'url' => __( 'URL' ),1639 'categories' => __( 'Categories' ),1640 'rel' => __( 'Relationship' ),1641 'visible' => __( 'Visible' ),1642 'rating' => __( 'Rating' )1643 );1644 }1645 1646 function get_sortable_columns() {1647 return array(1648 'name' => 'name',1649 'url' => 'url',1650 'visible' => 'visible',1651 'rating' => 'rating'1652 );1653 }1654 1655 function display_rows() {1656 global $cat_id;1657 1658 $alt = 0;1659 1660 foreach ( $this->items as $link ) {1661 $link = sanitize_bookmark( $link );1662 $link->link_name = esc_attr( $link->link_name );1663 $link->link_category = wp_get_link_cats( $link->link_id );1664 1665 $short_url = str_replace( 'http://', '', $link->link_url );1666 $short_url = preg_replace( '/^www\./i', '', $short_url );1667 if ( '/' == substr( $short_url, -1 ) )1668 $short_url = substr( $short_url, 0, -1 );1669 if ( strlen( $short_url ) > 35 )1670 $short_url = substr( $short_url, 0, 32 ).'...';1671 1672 $visible = ( $link->link_visible == 'Y' ) ? __( 'Yes' ) : __( 'No' );1673 $rating = $link->link_rating;1674 $style = ( $alt++ % 2 ) ? '' : ' class="alternate"';1675 1676 $edit_link = get_edit_bookmark_link( $link );1677 ?>1678 <tr id="link-<?php echo $link->link_id; ?>" valign="middle" <?php echo $style; ?>>1679 <?php1680 1681 list( $columns, $hidden ) = $this->get_column_info();1682 1683 foreach ( $columns as $column_name => $column_display_name ) {1684 $class = "class='column-$column_name'";1685 1686 $style = '';1687 if ( in_array( $column_name, $hidden ) )1688 $style = ' style="display:none;"';1689 1690 $attributes = $class . $style;1691 1692 switch ( $column_name ) {1693 case 'cb':1694 echo '<th scope="row" class="check-column"><input type="checkbox" name="linkcheck[]" value="'. esc_attr( $link->link_id ) .'" /></th>';1695 break;1696 1697 case 'name':1698 echo "<td $attributes><strong><a class='row-title' href='$edit_link' title='" . esc_attr( sprintf( __( 'Edit “%s”' ), $link->link_name ) ) . "'>$link->link_name</a></strong><br />";1699 1700 $actions = array();1701 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';1702 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "link.php?action=delete&link_id=$link->link_id", 'delete-bookmark_' . $link->link_id ) . "' onclick=\"if ( confirm( '" . esc_js( sprintf( __( "You are about to delete this link '%s'\n 'Cancel' to stop, 'OK' to delete." ), $link->link_name ) ) . "' ) ) { return true;}return false;\">" . __( 'Delete' ) . "</a>";1703 echo $this->row_actions( $actions );1704 1705 echo '</td>';1706 break;1707 case 'url':1708 echo "<td $attributes><a href='$link->link_url' title='".sprintf( __( 'Visit %s' ), $link->link_name )."'>$short_url</a></td>";1709 break;1710 case 'categories':1711 ?><td <?php echo $attributes ?>><?php1712 $cat_names = array();1713 foreach ( $link->link_category as $category ) {1714 $cat = get_term( $category, 'link_category', OBJECT, 'display' );1715 if ( is_wp_error( $cat ) )1716 echo $cat->get_error_message();1717 $cat_name = $cat->name;1718 if ( $cat_id != $category )1719 $cat_name = "<a href='link-manager.php?cat_id=$category'>$cat_name</a>";1720 $cat_names[] = $cat_name;1721 }1722 echo implode( ', ', $cat_names );1723 ?></td><?php1724 break;1725 case 'rel':1726 ?><td <?php echo $attributes ?>><?php echo empty( $link->link_rel ) ? '<br />' : $link->link_rel; ?></td><?php1727 break;1728 case 'visible':1729 ?><td <?php echo $attributes ?>><?php echo $visible; ?></td><?php1730 break;1731 case 'rating':1732 ?><td <?php echo $attributes ?>><?php echo $rating; ?></td><?php1733 break;1734 default:1735 ?>1736 <td <?php echo $attributes ?>><?php do_action( 'manage_link_custom_column', $column_name, $link->link_id ); ?></td>1737 <?php1738 break;1739 }1740 }1741 ?>1742 </tr>1743 <?php1744 }1745 }1746 }1747 1748 class WP_Sites_Table extends WP_List_Table {1749 1750 function WP_Sites_Table() {1751 parent::WP_List_Table( array(1752 'screen' => 'sites-network',1753 'plural' => 'sites',1754 ) );1755 }1756 1757 function check_permissions() {1758 if ( ! current_user_can( 'manage_sites' ) )1759 wp_die( __( 'You do not have permission to access this page.' ) );1760 }1761 1762 function prepare_items() {1763 global $s, $mode, $wpdb;1764 1765 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'list' : $_REQUEST['mode'];1766 1767 $per_page = $this->get_items_per_page( 'sites_network_per_page' );1768 1769 $pagenum = $this->get_pagenum();1770 1771 $s = isset( $_REQUEST['s'] ) ? stripslashes( trim( $_REQUEST[ 's' ] ) ) : '';1772 $like_s = esc_sql( like_escape( $s ) );1773 1774 $query = "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' ";1775 1776 if ( isset( $_REQUEST['searchaction'] ) ) {1777 if ( 'name' == $_REQUEST['searchaction'] ) {1778 $query .= " AND ( {$wpdb->blogs}.domain LIKE '%{$like_s}%' OR {$wpdb->blogs}.path LIKE '%{$like_s}%' ) ";1779 } elseif ( 'id' == $_REQUEST['searchaction'] ) {1780 $query .= " AND {$wpdb->blogs}.blog_id = '{$like_s}' ";1781 } elseif ( 'ip' == $_REQUEST['searchaction'] ) {1782 $query = "SELECT *1783 FROM {$wpdb->blogs}, {$wpdb->registration_log}1784 WHERE site_id = '{$wpdb->siteid}'1785 AND {$wpdb->blogs}.blog_id = {$wpdb->registration_log}.blog_id1786 AND {$wpdb->registration_log}.IP LIKE ( '%{$like_s}%' )";1787 }1788 }1789 1790 $order_by = isset( $_REQUEST['orderby'] ) ? $_REQUEST['orderby'] : 'id';1791 if ( $order_by == 'registered' ) {1792 $query .= ' ORDER BY registered ';1793 } elseif ( $order_by == 'lastupdated' ) {1794 $query .= ' ORDER BY last_updated ';1795 } elseif ( $order_by == 'blogname' ) {1796 $query .= ' ORDER BY domain ';1797 } else {1798 $order_by = 'id';1799 $query .= " ORDER BY {$wpdb->blogs}.blog_id ";1800 }1801 1802 $order = ( isset( $_REQUEST['order'] ) && 'DESC' == strtoupper( $_REQUEST['order'] ) ) ? "DESC" : "ASC";1803 $query .= $order;1804 1805 $total = $wpdb->get_var( str_replace( 'SELECT *', 'SELECT COUNT( blog_id )', $query ) );1806 1807 $query .= " LIMIT " . intval( ( $pagenum - 1 ) * $per_page ) . ", " . intval( $per_page );1808 $this->items = $wpdb->get_results( $query, ARRAY_A );1809 1810 $this->set_pagination_args( array(1811 'total_items' => $total,1812 'per_page' => $per_page,1813 ) );1814 }1815 1816 function no_items() {1817 _e( 'No sites found.' );1818 }1819 1820 function get_bulk_actions() {1821 $actions = array();1822 $actions['delete'] = __( 'Delete' );1823 $actions['spam'] = _x( 'Mark as Spam', 'site' );1824 $actions['notspam'] = _x( 'Not Spam', 'site' );1825 1826 return $actions;1827 }1828 1829 function pagination( $which ) {1830 global $mode;1831 1832 parent::pagination( $which );1833 1834 if ( 'top' == $which )1835 $this->view_switcher( $mode );1836 }1837 1838 function get_columns() {1839 $blogname_columns = ( is_subdomain_install() ) ? __( 'Domain' ) : __( 'Path' );1840 $sites_columns = array(1841 'cb' => '<input type="checkbox" />',1842 'blogname' => $blogname_columns,1843 'lastupdated' => __( 'Last Updated' ),1844 'registered' => _x( 'Registered', 'site' ),1845 'users' => __( 'Users' )1846 );1847 1848 if ( has_filter( 'wpmublogsaction' ) )1849 $sites_columns['plugins'] = __( 'Actions' );1850 1851 $sites_columns = apply_filters( 'wpmu_blogs_columns', $sites_columns );1852 1853 return $sites_columns;1854 }1855 1856 function get_sortable_columns() {1857 return array(1858 'id' => 'id',1859 'blogname' => 'blogname',1860 'lastupdated' => 'lastupdated',1861 'registered' => 'registered',1862 );1863 }1864 1865 function display_rows() {1866 global $current_site, $mode;1867 1868 $status_list = array(1869 'archived' => array( 'site-archived', __( 'Archived' ) ),1870 'spam' => array( 'site-spammed', _x( 'Spam', 'site' ) ),1871 'deleted' => array( 'site-deleted', __( 'Deleted' ) ),1872 'mature' => array( 'site-mature', __( 'Mature' ) )1873 );1874 1875 $class = '';1876 foreach ( $this->items as $blog ) {1877 $class = ( 'alternate' == $class ) ? '' : 'alternate';1878 reset( $status_list );1879 1880 $blog_states = array();1881 foreach ( $status_list as $status => $col ) {1882 if ( get_blog_status( $blog['blog_id'], $status ) == 1 ) {1883 $class = $col[0];1884 $blog_states[] = $col[1];1885 }1886 }1887 $blog_state = '';1888 if ( ! empty( $blog_states ) ) {1889 $state_count = count( $blog_states );1890 $i = 0;1891 $blog_state .= ' - ';1892 foreach ( $blog_states as $state ) {1893 ++$i;1894 ( $i == $state_count ) ? $sep = '' : $sep = ', ';1895 $blog_state .= "<span class='post-state'>$state$sep</span>";1896 }1897 }1898 echo "<tr class='$class'>";1899 1900 $blogname = ( is_subdomain_install() ) ? str_replace( '.'.$current_site->domain, '', $blog['domain'] ) : $blog['path'];1901 1902 list( $columns, $hidden ) = $this->get_column_info();1903 1904 foreach ( $columns as $column_name => $column_display_name ) {1905 switch ( $column_name ) {1906 case 'cb': ?>1907 <th scope="row" class="check-column">1908 <input type="checkbox" id="blog_<?php echo $blog['blog_id'] ?>" name="allblogs[]" value="<?php echo esc_attr( $blog['blog_id'] ) ?>" />1909 </th>1910 <?php1911 break;1912 1913 case 'id': ?>1914 <th valign="top" scope="row">1915 <?php echo $blog['blog_id'] ?>1916 </th>1917 <?php1918 break;1919 1920 case 'blogname': ?>1921 <td class="column-title">1922 <a href="<?php echo esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ); ?>" class="edit"><?php echo $blogname . $blog_state; ?></a>1923 <?php1924 if ( 'list' != $mode )1925 echo '<p>' . sprintf( _x( '%1$s – <em>%2$s</em>', '%1$s: site name. %2$s: site tagline.' ), get_blog_option( $blog['blog_id'], 'blogname' ), get_blog_option( $blog['blog_id'], 'blogdescription ' ) ) . '</p>';1926 1927 // Preordered.1928 $actions = array(1929 'edit' => '', 'backend' => '',1930 'activate' => '', 'deactivate' => '',1931 'archive' => '', 'unarchive' => '',1932 'spam' => '', 'unspam' => '',1933 'delete' => '',1934 'visit' => '',1935 );1936 1937 $actions['edit'] = '<span class="edit"><a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ) . '">' . __( 'Edit' ) . '</a></span>';1938 $actions['backend'] = "<span class='backend'><a href='" . esc_url( get_admin_url( $blog['blog_id'] ) ) . "' class='edit'>" . __( 'Dashboard' ) . '</a></span>';1939 if ( $current_site->blog_id != $blog['blog_id'] ) {1940 if ( get_blog_status( $blog['blog_id'], 'deleted' ) == '1' )1941 $actions['activate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=activateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to activate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Activate' ) . '</a></span>';1942 else1943 $actions['deactivate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deactivateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to deactivate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Deactivate' ) . '</a></span>';1944 1945 if ( get_blog_status( $blog['blog_id'], 'archived' ) == '1' )1946 $actions['unarchive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unarchiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unarchive the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Unarchive' ) . '</a></span>';1947 else1948 $actions['archive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=archiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to archive the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Archive', 'verb; site' ) . '</a></span>';1949 1950 if ( get_blog_status( $blog['blog_id'], 'spam' ) == '1' )1951 $actions['unspam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unspamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unspam the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Not Spam', 'site' ) . '</a></span>';1952 else1953 $actions['spam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=spamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to mark the site %s as spam.' ), $blogname ) ) ) ) . '">' . _x( 'Spam', 'site' ) . '</a></span>';1954 1955 $actions['delete'] = '<span class="delete"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deleteblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to delete the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Delete' ) . '</a></span>';1956 }1957 1958 $actions['visit'] = "<span class='view'><a href='" . esc_url( get_home_url( $blog['blog_id'] ) ) . "' rel='permalink'>" . __( 'Visit' ) . '</a></span>';1959 $actions = array_filter( $actions );1960 echo $this->row_actions( $actions );1961 ?>1962 </td>1963 <?php1964 break;1965 1966 case 'lastupdated': ?>1967 <td valign="top">1968 <?php1969 if ( 'list' == $mode )1970 $date = 'Y/m/d';1971 else1972 $date = 'Y/m/d \<\b\r \/\> g:i:s a';1973 echo ( $blog['last_updated'] == '0000-00-00 00:00:00' ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] ); ?>1974 </td>1975 <?php1976 break;1977 case 'registered': ?>1978 <td valign="top">1979 <?php1980 if ( $blog['registered'] == '0000-00-00 00:00:00' )1981 echo '—';1982 else1983 echo mysql2date( $date, $blog['registered'] );1984 ?>1985 </td>1986 <?php1987 break;1988 case 'users': ?>1989 <td valign="top">1990 <?php1991 $blogusers = get_users( array( 'blog_id' => $blog['blog_id'], 'number' => 6) );1992 if ( is_array( $blogusers ) ) {1993 $blogusers_warning = '';1994 if ( count( $blogusers ) > 5 ) {1995 $blogusers = array_slice( $blogusers, 0, 5 );1996 $blogusers_warning = __( 'Only showing first 5 users.' ) . ' <a href="' . esc_url( get_admin_url( $blog['blog_id'], 'users.php' ) ) . '">' . __( 'More' ) . '</a>';1997 }1998 foreach ( $blogusers as $user_object ) {1999 echo '<a href="' . esc_url( admin_url( 'user-edit.php?user_id=' . $user_object->ID ) ) . '">' . esc_html( $user_object->user_login ) . '</a> ';2000 if ( 'list' != $mode )2001 echo '( ' . $user_object->user_email . ' )';2002 echo '<br />';2003 }2004 if ( $blogusers_warning != '' )2005 echo '<strong>' . $blogusers_warning . '</strong><br />';2006 }2007 ?>2008 </td>2009 <?php2010 break;2011 2012 case 'plugins': ?>2013 <?php if ( has_filter( 'wpmublogsaction' ) ) { ?>2014 <td valign="top">2015 <?php do_action( 'wpmublogsaction', $blog['blog_id'] ); ?>2016 </td>2017 <?php } ?>2018 <?php break;2019 2020 default: ?>2021 <?php if ( has_filter( 'manage_blogs_custom_column' ) ) { ?>2022 <td valign="top">2023 <?php do_action( 'manage_blogs_custom_column', $column_name, $blog['blog_id'] ); ?>2024 </td>2025 <?php } ?>2026 <?php break;2027 }2028 }2029 ?>2030 </tr>2031 <?php2032 }2033 }2034 }2035 2036 class WP_MS_Users_Table extends WP_List_Table {2037 2038 function WP_MS_Users_Table() {2039 parent::WP_List_Table( array(2040 'screen' => 'users-network',2041 ) );2042 }2043 2044 function check_permissions() {2045 if ( !is_multisite() )2046 wp_die( __( 'Multisite support is not enabled.' ) );2047 2048 if ( ! current_user_can( 'manage_network_users' ) )2049 wp_die( __( 'You do not have permission to access this page.' ) );2050 }2051 2052 function prepare_items() {2053 global $usersearch;2054 2055 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';2056 2057 $users_per_page = $this->get_items_per_page( 'users_network_per_page' );2058 2059 $paged = $this->get_pagenum();2060 2061 $args = array(2062 'number' => $users_per_page,2063 'offset' => ( $paged-1 ) * $users_per_page,2064 'search' => $usersearch,2065 'blog_id' => 02066 );2067 2068 if ( isset( $_REQUEST['orderby'] ) )2069 $args['orderby'] = $_REQUEST['orderby'];2070 2071 if ( isset( $_REQUEST['order'] ) )2072 $args['order'] = $_REQUEST['order'];2073 2074 // Query the user IDs for this page2075 $wp_user_search = new WP_User_Query( $args );2076 2077 $this->items = $wp_user_search->get_results();2078 2079 $this->set_pagination_args( array(2080 'total_items' => $wp_user_search->get_total(),2081 'per_page' => $users_per_page,2082 ) );2083 }2084 2085 function get_bulk_actions() {2086 $actions = array();2087 $actions['delete'] = __( 'Delete' );2088 $actions['spam'] = _x( 'Mark as Spam', 'user' );2089 $actions['notspam'] = _x( 'Not Spam', 'user' );2090 2091 return $actions;2092 }2093 2094 function no_items() {2095 _e( 'No users found.' );2096 }2097 2098 function pagination( $which ) {2099 global $mode;2100 2101 parent::pagination ( $which );2102 2103 if ( 'top' == $which )2104 $this->view_switcher( $mode );2105 }2106 2107 function get_columns() {2108 $users_columns = array(2109 'cb' => '<input type="checkbox" />',2110 'login' => __( 'Login' ),2111 'name' => __( 'Name' ),2112 'email' => __( 'E-mail' ),2113 'registered' => _x( 'Registered', 'user' ),2114 'blogs' => __( 'Sites' )2115 );2116 $users_columns = apply_filters( 'wpmu_users_columns', $users_columns );2117 2118 return $users_columns;2119 }2120 2121 function get_sortable_columns() {2122 return array(2123 'id' => 'id',2124 'login' => 'login',2125 'name' => 'name',2126 'email' => 'email',2127 'registered' => 'registered',2128 );2129 }2130 2131 function display_rows() {2132 global $current_site, $mode;2133 2134 $class = '';2135 $super_admins = get_super_admins();2136 foreach ( $this->items as $user ) {2137 $class = ( 'alternate' == $class ) ? '' : 'alternate';2138 2139 $status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' );2140 2141 foreach ( $status_list as $status => $col ) {2142 if ( $user->$status )2143 $class = $col;2144 }2145 2146 ?>2147 <tr class="<?php echo $class; ?>">2148 <?php2149 2150 list( $columns, $hidden ) = $this->get_column_info();2151 2152 foreach ( $columns as $column_name => $column_display_name ) :2153 switch ( $column_name ) {2154 case 'cb': ?>2155 <th scope="row" class="check-column">2156 <input type="checkbox" id="blog_<?php echo $user->ID ?>" name="allusers[]" value="<?php echo esc_attr( $user->ID ) ?>" />2157 </th>2158 <?php2159 break;2160 2161 case 'id': ?>2162 <th valign="top" scope="row">2163 <?php echo $user->ID ?>2164 </th>2165 <?php2166 break;2167 2168 case 'login':2169 $avatar = get_avatar( $user->user_email, 32 );2170 $edit_link = ( get_current_user_id() == $user->ID ) ? 'profile.php' : 'user-edit.php?user_id=' . $user->ID;2171 ?>2172 <td class="username column-username">2173 <?php echo $avatar; ?><strong><a href="<?php echo esc_url( self_admin_url( $edit_link ) ); ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a><?php2174 if ( in_array( $user->user_login, $super_admins ) )2175 echo ' - ' . __( 'Super admin' );2176 ?></strong>2177 <br/>2178 <?php2179 $actions = array();2180 $actions['edit'] = '<a href="' . esc_url( self_admin_url( $edit_link ) ) . '">' . __( 'Edit' ) . '</a>';2181 2182 if ( ! in_array( $user->user_login, $super_admins ) ) {2183 $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deleteuser' ) . '&action=deleteuser&id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';2184 }2185 2186 echo $this->row_actions( $actions );2187 ?>2188 </div>2189 </td>2190 <?php2191 break;2192 2193 case 'name': ?>2194 <td class="name column-name"><?php echo $user->display_name ?></td>2195 <?php2196 break;2197 2198 case 'email': ?>2199 <td class="email column-email"><a href="mailto:<?php echo $user->user_email ?>"><?php echo $user->user_email ?></a></td>2200 <?php2201 break;2202 2203 case 'registered':2204 if ( 'list' == $mode )2205 $date = 'Y/m/d';2206 else2207 $date = 'Y/m/d \<\b\r \/\> g:i:s a';2208 ?>2209 <td><?php echo mysql2date( $date, $user->user_registered ); ?></td>2210 <?php2211 break;2212 2213 case 'blogs':2214 $blogs = get_blogs_of_user( $user->ID, true );2215 ?>2216 <td>2217 <?php2218 if ( is_array( $blogs ) ) {2219 foreach ( (array) $blogs as $key => $val ) {2220 $path = ( $val->path == '/' ) ? '' : $val->path;2221 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . str_replace( '.' . $current_site->domain, '', $val->domain . $path ) . '</a>';2222 echo ' <small class="row-actions">';2223 2224 // Edit2225 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . __( 'Edit' ) . '</a> | ';2226 2227 // View2228 echo '<a ';2229 if ( get_blog_status( $val->userblog_id, 'spam' ) == 1 )2230 echo 'style="background-color: #faa" ';2231 echo 'href="' . esc_url( get_home_url( $val->userblog_id ) ) . '">' . __( 'View' ) . '</a>';2232 2233 echo '</small><br />';2234 }2235 }2236 ?>2237 </td>2238 <?php2239 break;2240 2241 default: ?>2242 <td><?php do_action( 'manage_users_custom_column', $column_name, $user->ID ); ?></td>2243 <?php2244 break;2245 }2246 endforeach2247 ?>2248 </tr>2249 <?php2250 }2251 }2252 }2253 11 2254 12 class WP_Plugins_Table extends WP_List_Table { … … 2665 423 } 2666 424 2667 class WP_Plugin_Install_Table extends WP_List_Table {2668 2669 function WP_Plugin_Install_Table() {2670 parent::WP_List_Table( array(2671 'screen' => 'plugin-install',2672 ) );2673 }2674 2675 function check_permissions() {2676 if ( ! current_user_can('install_plugins') )2677 wp_die(__('You do not have sufficient permissions to install plugins on this site.'));2678 }2679 2680 function prepare_items() {2681 include( ABSPATH . 'wp-admin/includes/plugin-install.php' );2682 2683 global $tabs, $tab, $paged, $type, $term;2684 2685 wp_reset_vars( array( 'tab' ) );2686 2687 $paged = $this->get_pagenum();2688 2689 $per_page = 30;2690 2691 // These are the tabs which are shown on the page2692 $tabs = array();2693 $tabs['dashboard'] = __( 'Search' );2694 if ( 'search' == $tab )2695 $tabs['search'] = __( 'Search Results' );2696 $tabs['upload'] = __( 'Upload' );2697 $tabs['featured'] = _x( 'Featured','Plugin Installer' );2698 $tabs['popular'] = _x( 'Popular','Plugin Installer' );2699 $tabs['new'] = _x( 'Newest','Plugin Installer' );2700 $tabs['updated'] = _x( 'Recently Updated','Plugin Installer' );2701 2702 $nonmenu_tabs = array( 'plugin-information' ); //Valid actions to perform which do not have a Menu item.2703 2704 $tabs = apply_filters( 'install_plugins_tabs', $tabs );2705 $nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs );2706 2707 // If a non-valid menu tab has been selected, And its not a non-menu action.2708 if ( empty( $tab ) || ( !isset( $tabs[ $tab ] ) && !in_array( $tab, (array) $nonmenu_tabs ) ) )2709 $tab = key( $tabs );2710 2711 $args = array( 'page' => $paged, 'per_page' => $per_page );2712 2713 switch ( $tab ) {2714 case 'search':2715 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : '';2716 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '';2717 2718 switch ( $type ) {2719 case 'tag':2720 $args['tag'] = sanitize_title_with_dashes( $term );2721 break;2722 case 'term':2723 $args['search'] = $term;2724 break;2725 case 'author':2726 $args['author'] = $term;2727 break;2728 }2729 2730 add_action( 'install_plugins_table_header', 'install_search_form' );2731 break;2732 2733 case 'featured':2734 case 'popular':2735 case 'new':2736 case 'updated':2737 $args['browse'] = $tab;2738 break;2739 2740 default:2741 $args = false;2742 }2743 2744 if ( !$args )2745 return;2746 2747 $api = plugins_api( 'query_plugins', $args );2748 2749 if ( is_wp_error( $api ) )2750 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' );2751 2752 $this->items = $api->plugins;2753 2754 $this->set_pagination_args( array(2755 'total_items' => $api->info['results'],2756 'per_page' => $per_page,2757 ) );2758 }2759 2760 function no_items() {2761 _e( 'No plugins match your request.' );2762 }2763 2764 function get_views() {2765 global $tabs, $tab;2766 2767 $display_tabs = array();2768 foreach ( (array) $tabs as $action => $text ) {2769 $class = ( $action == $tab ) ? ' class="current"' : '';2770 $href = admin_url('plugin-install.php?tab=' . $action);2771 $display_tabs[$action] = "<a href='$href'$class>$text</a>";2772 }2773 2774 return $display_tabs;2775 }2776 2777 function display_tablenav( $which ) {2778 if ( 'top' == $which ) { ?>2779 <div class="tablenav">2780 <div class="alignleft actions">2781 <?php do_action( 'install_plugins_table_header' ); ?>2782 </div>2783 <?php $this->pagination( $which ); ?>2784 <br class="clear" />2785 </div>2786 <?php } else { ?>2787 <div class="tablenav">2788 <?php $this->pagination( $which ); ?>2789 <br class="clear" />2790 </div>2791 <?php2792 }2793 }2794 2795 function get_table_classes() {2796 extract( $this->_args );2797 2798 return array( 'widefat', $plural );2799 }2800 2801 function get_columns() {2802 return array(2803 'name' => __( 'Name' ),2804 'version' => __( 'Version' ),2805 'rating' => __( 'Rating' ),2806 'description' => __( 'Description' ),2807 );2808 }2809 2810 function display_rows() {2811 $plugins_allowedtags = array(2812 'a' => array( 'href' => array(),'title' => array(), 'target' => array() ),2813 'abbr' => array( 'title' => array() ),'acronym' => array( 'title' => array() ),2814 'code' => array(), 'pre' => array(), 'em' => array(),'strong' => array(),2815 'ul' => array(), 'ol' => array(), 'li' => array(), 'p' => array(), 'br' => array()2816 );2817 2818 foreach ( (array) $this->items as $plugin ) {2819 if ( is_object( $plugin ) )2820 $plugin = (array) $plugin;2821 2822 $title = wp_kses( $plugin['name'], $plugins_allowedtags );2823 //Limit description to 400char, and remove any HTML.2824 $description = strip_tags( $plugin['description'] );2825 if ( strlen( $description ) > 400 )2826 $description = mb_substr( $description, 0, 400 ) . '…';2827 //remove any trailing entities2828 $description = preg_replace( '/&[^;\s]{0,6}$/', '', $description );2829 //strip leading/trailing & multiple consecutive lines2830 $description = trim( $description );2831 $description = preg_replace( "|(\r?\n)+|", "\n", $description );2832 //\n => <br>2833 $description = nl2br( $description );2834 $version = wp_kses( $plugin['version'], $plugins_allowedtags );2835 2836 $name = strip_tags( $title . ' ' . $version );2837 2838 $author = $plugin['author'];2839 if ( ! empty( $plugin['author'] ) )2840 $author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '.</cite>';2841 2842 $author = wp_kses( $author, $plugins_allowedtags );2843 2844 $action_links = array();2845 $action_links[] = '<a href="' . admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin['slug'] .2846 '&TB_iframe=true&width=600&height=550' ) . '" class="thickbox" title="' .2847 esc_attr( sprintf( __( 'More information about %s' ), $name ) ) . '">' . __( 'Details' ) . '</a>';2848 2849 if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) {2850 $status = install_plugin_install_status( $plugin );2851 2852 switch ( $status['status'] ) {2853 case 'install':2854 if ( $status['url'] )2855 $action_links[] = '<a class="install-now" href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Install %s' ), $name ) ) . '">' . __( 'Install Now' ) . '</a>';2856 break;2857 case 'update_available':2858 if ( $status['url'] )2859 $action_links[] = '<a href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Update to version %s' ), $status['version'] ) ) . '">' . sprintf( __( 'Update Now' ), $status['version'] ) . '</a>';2860 break;2861 case 'latest_installed':2862 case 'newer_installed':2863 $action_links[] = '<span title="' . esc_attr__( 'This plugin is already installed and is up to date' ) . ' ">' . __( 'Installed' ) . '</span>';2864 break;2865 }2866 }2867 2868 $action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin );2869 ?>2870 <tr>2871 <td class="name"><strong><?php echo $title; ?></strong>2872 <div class="action-links"><?php if ( !empty( $action_links ) ) echo implode( ' | ', $action_links ); ?></div>2873 </td>2874 <td class="vers"><?php echo $version; ?></td>2875 <td class="vers">2876 <div class="star-holder" title="<?php printf( _n( '( based on %s rating )', '( based on %s ratings )', $plugin['num_ratings'] ), number_format_i18n( $plugin['num_ratings'] ) ) ?>">2877 <div class="star star-rating" style="width: <?php echo esc_attr( $plugin['rating'] ) ?>px"></div>2878 <div class="star star5"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '5 stars' ) ?>" /></div>2879 <div class="star star4"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '4 stars' ) ?>" /></div>2880 <div class="star star3"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '3 stars' ) ?>" /></div>2881 <div class="star star2"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '2 stars' ) ?>" /></div>2882 <div class="star star1"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '1 star' ) ?>" /></div>2883 </div>2884 </td>2885 <td class="desc"><?php echo $description, $author; ?></td>2886 </tr>2887 <?php2888 }2889 }2890 }2891 2892 class WP_Themes_Table extends WP_List_Table {2893 2894 var $search = array();2895 var $features = array();2896 2897 function WP_Themes_Table() {2898 parent::__construct( array(2899 'screen' => 'themes',2900 ) );2901 }2902 2903 function check_permissions() {2904 if ( !current_user_can('switch_themes') && !current_user_can('edit_theme_options') )2905 wp_die( __( 'Cheatin’ uh?' ) );2906 }2907 2908 function prepare_items() {2909 global $ct;2910 2911 $ct = current_theme_info();2912 2913 $themes = get_allowed_themes();2914 2915 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';2916 2917 if ( '' !== $search ) {2918 $this->search = array_merge( $this->search, array_filter( array_map( 'trim', explode( ',', $search ) ) ) );2919 $this->search = array_unique( $this->search );2920 }2921 2922 if ( !empty( $_REQUEST['features'] ) ) {2923 $this->features = $_REQUEST['features'];2924 $this->features = array_map( 'trim', $this->features );2925 $this->features = array_map( 'sanitize_title_with_dashes', $this->features );2926 $this->features = array_unique( $this->features );2927 }2928 2929 if ( $this->search || $this->features ) {2930 foreach ( $themes as $key => $theme ) {2931 if ( !$this->search_theme( $theme ) )2932 unset( $themes[ $key ] );2933 }2934 }2935 2936 unset( $themes[$ct->name] );2937 uksort( $themes, "strnatcasecmp" );2938 2939 $per_page = 15;2940 $page = $this->get_pagenum();2941 2942 $start = ( $page - 1 ) * $per_page;2943 2944 $this->items = array_slice( $themes, $start, $per_page );2945 2946 $this->set_pagination_args( array(2947 'query_var' => 'pagenum',2948 'total_items' => count( $themes ),2949 'per_page' => $per_page,2950 ) );2951 }2952 2953 function no_items() {2954 if ( current_user_can( 'install_themes' ) )2955 printf( __( 'You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress.org Theme Directory at any time: just click on the <em><a href="%s">Install Themes</a></em> tab above.' ), 'theme-install.php' );2956 else2957 printf( __( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ), get_site_option( 'site_name' ) );2958 }2959 2960 function display_table() {2961 425 ?> 2962 <div class="tablenav">2963 <?php $this->pagination( 'top' ); ?>2964 <br class="clear" />2965 </div>2966 2967 <table id="availablethemes" cellspacing="0" cellpadding="0">2968 <tbody id="the-list" class="list:themes">2969 <?php $this->display_rows(); ?>2970 </tbody>2971 </table>2972 2973 <div class="tablenav">2974 <?php $this->pagination( 'bottom' ); ?>2975 <br class="clear" />2976 </div>2977 <?php2978 }2979 2980 function get_columns() {2981 return array();2982 }2983 2984 function display_rows() {2985 $themes = $this->items;2986 $theme_names = array_keys( $themes );2987 natcasesort( $theme_names );2988 2989 $table = array();2990 $rows = ceil( count( $theme_names ) / 3 );2991 for ( $row = 1; $row <= $rows; $row++ )2992 for ( $col = 1; $col <= 3; $col++ )2993 $table[$row][$col] = array_shift( $theme_names );2994 2995 foreach ( $table as $row => $cols ) {2996 ?>2997 <tr>2998 <?php2999 foreach ( $cols as $col => $theme_name ) {3000 $class = array( 'available-theme' );3001 if ( $row == 1 ) $class[] = 'top';3002 if ( $col == 1 ) $class[] = 'left';3003 if ( $row == $rows ) $class[] = 'bottom';3004 if ( $col == 3 ) $class[] = 'right';3005 ?>3006 <td class="<?php echo join( ' ', $class ); ?>">3007 <?php if ( !empty( $theme_name ) ) :3008 $template = $themes[$theme_name]['Template'];3009 $stylesheet = $themes[$theme_name]['Stylesheet'];3010 $title = $themes[$theme_name]['Title'];3011 $version = $themes[$theme_name]['Version'];3012 $description = $themes[$theme_name]['Description'];3013 $author = $themes[$theme_name]['Author'];3014 $screenshot = $themes[$theme_name]['Screenshot'];3015 $stylesheet_dir = $themes[$theme_name]['Stylesheet Dir'];3016 $template_dir = $themes[$theme_name]['Template Dir'];3017 $parent_theme = $themes[$theme_name]['Parent Theme'];3018 $theme_root = $themes[$theme_name]['Theme Root'];3019 $theme_root_uri = $themes[$theme_name]['Theme Root URI'];3020 $preview_link = esc_url( get_option( 'home' ) . '/' );3021 if ( is_ssl() )3022 $preview_link = str_replace( 'http://', 'https://', $preview_link );3023 $preview_link = htmlspecialchars( add_query_arg( array( 'preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'TB_iframe' => 'true' ), $preview_link ) );3024 $preview_text = esc_attr( sprintf( __( 'Preview of “%s”' ), $title ) );3025 $tags = $themes[$theme_name]['Tags'];3026 $thickbox_class = 'thickbox thickbox-preview';3027 $activate_link = wp_nonce_url( "themes.php?action=activate&template=".urlencode( $template )."&stylesheet=".urlencode( $stylesheet ), 'switch-theme_' . $template );3028 $activate_text = esc_attr( sprintf( __( 'Activate “%s”' ), $title ) );3029 $actions = array();3030 $actions[] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __( 'Activate' ) . '</a>';3031 $actions[] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr( sprintf( __( 'Preview “%s”' ), $theme_name ) ) . '">' . __( 'Preview' ) . '</a>';3032 if ( current_user_can( 'delete_themes' ) )3033 $actions[] = '<a class="submitdelete deletion" href="' . wp_nonce_url( "themes.php?action=delete&template=$stylesheet", 'delete-theme_' . $stylesheet ) . '" onclick="' . "return confirm( '" . esc_js( sprintf( __( "You are about to delete this theme '%s'\n 'Cancel' to stop, 'OK' to delete." ), $theme_name ) ) . "' );" . '">' . __( 'Delete' ) . '</a>';3034 $actions = apply_filters( 'theme_action_links', $actions, $themes[$theme_name] );3035 3036 $actions = implode ( ' | ', $actions );3037 ?>3038 <a href="<?php echo $preview_link; ?>" class="<?php echo $thickbox_class; ?> screenshot">3039 <?php if ( $screenshot ) : ?>3040 <img src="<?php echo $theme_root_uri . '/' . $stylesheet . '/' . $screenshot; ?>" alt="" />3041 <?php endif; ?>3042 </a>3043 <h3><?php3044 /* translators: 1: theme title, 2: theme version, 3: theme author */3045 printf( __( '%1$s %2$s by %3$s' ), $title, $version, $author ) ; ?></h3>3046 <p class="description"><?php echo $description; ?></p>3047 <span class='action-links'><?php echo $actions ?></span>3048 <?php if ( current_user_can( 'edit_themes' ) && $parent_theme ) {3049 /* translators: 1: theme title, 2: template dir, 3: stylesheet_dir, 4: theme title, 5: parent_theme */ ?>3050 <p><?php printf( __( 'The template files are located in <code>%2$s</code>. The stylesheet files are located in <code>%3$s</code>. <strong>%4$s</strong> uses templates from <strong>%5$s</strong>. Changes made to the templates will affect both themes.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ), $title, $parent_theme ); ?></p>3051 <?php } else { ?>3052 <p><?php printf( __( 'All of this theme’s files are located in <code>%2$s</code>.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ) ); ?></p>3053 <?php } ?>3054 <?php if ( $tags ) : ?>3055 <p><?php _e( 'Tags:' ); ?> <?php echo join( ', ', $tags ); ?></p>3056 <?php endif; ?>3057 <?php theme_update_available( $themes[$theme_name] ); ?>3058 <?php endif; // end if not empty theme_name ?>3059 </td>3060 <?php } // end foreach $cols ?>3061 </tr>3062 <?php } // end foreach $table3063 }3064 3065 function search_theme( $theme ) {3066 $matched = 0;3067 3068 // Match all phrases3069 if ( count( $this->search ) > 0 ) {3070 foreach ( $this->search as $word ) {3071 $matched = 0;3072 3073 // In a tag?3074 if ( in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) )3075 $matched = 1;3076 3077 // In one of the fields?3078 foreach ( array( 'Name', 'Title', 'Description', 'Author', 'Template', 'Stylesheet' ) AS $field ) {3079 if ( stripos( $theme[$field], $word ) !== false )3080 $matched++;3081 }3082 3083 if ( $matched == 0 )3084 return false;3085 }3086 }3087 3088 // Now search the features3089 if ( count( $this->features ) > 0 ) {3090 foreach ( $this->features as $word ) {3091 // In a tag?3092 if ( !in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) )3093 return false;3094 }3095 }3096 3097 // Only get here if each word exists in the tags or one of the fields3098 return true;3099 }3100 }3101 3102 class WP_Theme_Install_Table extends WP_List_Table {3103 3104 function WP_Theme_Install_Table() {3105 parent::WP_List_Table( array(3106 'screen' => 'theme-install',3107 ) );3108 }3109 3110 function check_permissions() {3111 if ( ! current_user_can('install_themes') )3112 wp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) );3113 }3114 3115 function prepare_items() {3116 include( ABSPATH . 'wp-admin/includes/theme-install.php' );3117 3118 global $tabs, $tab, $paged, $type, $term, $theme_field_defaults;3119 3120 wp_reset_vars( array( 'tab' ) );3121 3122 $paged = $this->get_pagenum();3123 3124 $per_page = 30;3125 3126 // These are the tabs which are shown on the page,3127 $tabs = array();3128 $tabs['dashboard'] = __( 'Search' );3129 if ( 'search' == $tab )3130 $tabs['search'] = __( 'Search Results' );3131 $tabs['upload'] = __( 'Upload' );3132 $tabs['featured'] = _x( 'Featured','Theme Installer' );3133 //$tabs['popular'] = _x( 'Popular','Theme Installer' );3134 $tabs['new'] = _x( 'Newest','Theme Installer' );3135 $tabs['updated'] = _x( 'Recently Updated','Theme Installer' );3136 3137 $nonmenu_tabs = array( 'theme-information' ); // Valid actions to perform which do not have a Menu item.3138 3139 $tabs = apply_filters( 'install_themes_tabs', $tabs );3140 $nonmenu_tabs = apply_filters( 'install_themes_nonmenu_tabs', $nonmenu_tabs );3141 3142 // If a non-valid menu tab has been selected, And its not a non-menu action.3143 if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs ) ) )3144 $tab = key( $tabs );3145 3146 $args = array( 'page' => $paged, 'per_page' => $per_page, 'fields' => $theme_field_defaults );3147 3148 switch ( $tab ) {3149 case 'search':3150 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : '';3151 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '';3152 3153 switch ( $type ) {3154 case 'tag':3155 $terms = explode( ',', $term );3156 $terms = array_map( 'trim', $terms );3157 $terms = array_map( 'sanitize_title_with_dashes', $terms );3158 $args['tag'] = $terms;3159 break;3160 case 'term':3161 $args['search'] = $term;3162 break;3163 case 'author':3164 $args['author'] = $term;3165 break;3166 }3167 3168 if ( !empty( $_POST['features'] ) ) {3169 $terms = $_POST['features'];3170 $terms = array_map( 'trim', $terms );3171 $terms = array_map( 'sanitize_title_with_dashes', $terms );3172 $args['tag'] = $terms;3173 $_REQUEST['s'] = implode( ',', $terms );3174 $_REQUEST['type'] = 'tag';3175 }3176 3177 add_action( 'install_themes_table_header', 'install_theme_search_form' );3178 break;3179 3180 case 'featured':3181 //case 'popular':3182 case 'new':3183 case 'updated':3184 $args['browse'] = $tab;3185 break;3186 3187 default:3188 $args = false;3189 }3190 3191 if ( !$args )3192 return;3193 3194 $api = themes_api( 'query_themes', $args );3195 3196 if ( is_wp_error( $api ) )3197 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' );3198 3199 $this->items = $api->themes;3200 3201 $this->set_pagination_args( array(3202 'total_items' => $api->info['results'],3203 'per_page' => $per_page,3204 ) );3205 }3206 3207 function no_items() {3208 _e( 'No themes match your request.' );3209 }3210 3211 function get_views() {3212 global $tabs, $tab;3213 3214 $display_tabs = array();3215 foreach ( (array) $tabs as $action => $text ) {3216 $class = ( $action == $tab ) ? ' class="current"' : '';3217 $href = self_admin_url('theme-install.php?tab=' . $action);3218 $display_tabs[$action] = "<a href='$href'$class>$text</a>";3219 }3220 3221 return $display_tabs;3222 }3223 3224 function get_columns() {3225 return array();3226 }3227 3228 function display_table() {3229 ?>3230 <div class="tablenav">3231 <div class="alignleft actions">3232 <?php do_action( 'install_themes_table_header' ); ?>3233 </div>3234 <?php $this->pagination( 'top' ); ?>3235 <br class="clear" />3236 </div>3237 3238 <table id="availablethemes" cellspacing="0" cellpadding="0">3239 <tbody id="the-list" class="list:themes">3240 <?php $this->display_rows(); ?>3241 </tbody>3242 </table>3243 3244 <div class="tablenav">3245 <?php $this->pagination( 'bottom' ); ?>3246 <br class="clear" />3247 </div>3248 <?php3249 }3250 3251 function display_rows() {3252 $themes = $this->items;3253 3254 $rows = ceil( count( $themes ) / 3 );3255 $table = array();3256 $theme_keys = array_keys( $themes );3257 for ( $row = 1; $row <= $rows; $row++ )3258 for ( $col = 1; $col <= 3; $col++ )3259 $table[$row][$col] = array_shift( $theme_keys );3260 3261 foreach ( $table as $row => $cols ) {3262 echo "\t<tr>\n";3263 foreach ( $cols as $col => $theme_index ) {3264 $class = array( 'available-theme' );3265 if ( $row == 1 ) $class[] = 'top';3266 if ( $col == 1 ) $class[] = 'left';3267 if ( $row == $rows ) $class[] = 'bottom';3268 if ( $col == 3 ) $class[] = 'right';3269 ?>3270 <td class="<?php echo join( ' ', $class ); ?>"><?php3271 if ( isset( $themes[$theme_index] ) )3272 display_theme( $themes[$theme_index] );3273 ?></td>3274 <?php } // end foreach $cols3275 echo "\t</tr>\n";3276 } // end foreach $table3277 }3278 }3279 -
trunk/wp-admin/includes/list-table-sites.php
r15954 r15955 9 9 * @subpackage Administration 10 10 */ 11 12 class WP_Media_Table extends WP_List_Table {13 14 function WP_Media_Table() {15 global $detached;16 17 $detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );18 19 parent::WP_List_Table( array(20 'screen' => $detached ? 'upload-detached' : 'upload',21 'plural' => 'media'22 ) );23 }24 25 function check_permissions() {26 if ( !current_user_can('upload_files') )27 wp_die( __( 'You do not have permission to upload files.' ) );28 }29 30 function prepare_items() {31 global $lost, $wpdb, $wp_query, $post_mime_types, $avail_post_mime_types;32 33 $q = $_REQUEST;34 35 if ( !empty( $lost ) )36 $q['post__in'] = implode( ',', $lost );37 38 list( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $q );39 40 $this->is_trash = isset( $_REQUEST['status'] ) && 'trash' == $_REQUEST['status'];41 42 $this->set_pagination_args( array(43 'total_items' => $wp_query->found_posts,44 'total_pages' => $wp_query->max_num_pages,45 'per_page' => $wp_query->query_vars['posts_per_page'],46 ) );47 }48 49 function get_views() {50 global $wpdb, $post_mime_types, $detached, $avail_post_mime_types;51 52 $type_links = array();53 $_num_posts = (array) wp_count_attachments();54 $_total_posts = array_sum($_num_posts) - $_num_posts['trash'];55 if ( !isset( $total_orphans ) )56 $total_orphans = $wpdb->get_var( "SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent < 1" );57 $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));58 foreach ( $matches as $type => $reals )59 foreach ( $reals as $real )60 $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];61 62 $class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : '';63 $type_links['all'] = "<li><a href='upload.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $_total_posts, 'uploaded files' ), number_format_i18n( $_total_posts ) ) . '</a>';64 foreach ( $post_mime_types as $mime_type => $label ) {65 $class = '';66 67 if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )68 continue;69 70 if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )71 $class = ' class="current"';72 if ( !empty( $num_posts[$mime_type] ) )73 $type_links[$mime_type] = "<li><a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( _n( $label[2][0], $label[2][1], $num_posts[$mime_type] ), number_format_i18n( $num_posts[$mime_type] )) . '</a>';74 }75 $type_links['detached'] = '<li><a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( _nx( 'Unattached <span class="count">(%s)</span>', 'Unattached <span class="count">(%s)</span>', $total_orphans, 'detached files' ), number_format_i18n( $total_orphans ) ) . '</a>';76 77 if ( !empty($_num_posts['trash']) )78 $type_links['trash'] = '<li><a href="upload.php?status=trash"' . ( (isset($_GET['status']) && $_GET['status'] == 'trash' ) ? ' class="current"' : '') . '>' . sprintf( _nx( 'Trash <span class="count">(%s)</span>', 'Trash <span class="count">(%s)</span>', $_num_posts['trash'], 'uploaded files' ), number_format_i18n( $_num_posts['trash'] ) ) . '</a>';79 80 return $type_links;81 }82 83 function get_bulk_actions() {84 global $detached;85 86 $actions = array();87 $actions['delete'] = __( 'Delete Permanently' );88 if ( $detached )89 $actions['attach'] = __( 'Attach to a post' );90 91 return $actions;92 }93 94 function extra_tablenav( $which ) {95 global $post_type, $detached;96 ?>97 <div class="alignleft actions">98 <?php99 if ( 'top' == $which && !is_singular() && !$detached && !$this->is_trash ) {100 $this->months_dropdown( $post_type );101 102 do_action( 'restrict_manage_posts' );103 ?>104 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />105 <?php106 }107 108 if ( $detached ) { ?>109 <input type="submit" id="find_detached" name="find_detached" value="<?php esc_attr_e( 'Scan for lost attachments' ); ?>" class="button-secondary" />110 <?php } elseif ( $this->is_trash && current_user_can( 'edit_others_posts' ) ) { ?>111 <input type="submit" id="delete_all" name="delete_all" value="<?php esc_attr_e( 'Empty Trash' ); ?>" class="button-secondary apply" />112 <?php } ?>113 </div>114 <?php115 }116 117 function current_action() {118 if ( isset( $_REQUEST['find_detached'] ) )119 return 'find_detached';120 121 if ( isset( $_REQUEST['found_post_id'] ) && isset( $_REQUEST['media'] ) )122 return 'attach';123 124 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )125 return 'delete_all';126 127 return parent::current_action();128 }129 130 function has_items() {131 return have_posts();132 }133 134 function no_items() {135 _e( 'No media attachments found.' );136 }137 138 function get_columns() {139 $posts_columns = array();140 $posts_columns['cb'] = '<input type="checkbox" />';141 $posts_columns['icon'] = '';142 /* translators: column name */143 $posts_columns['title'] = _x( 'File', 'column name' );144 $posts_columns['author'] = __( 'Author' );145 //$posts_columns['tags'] = _x( 'Tags', 'column name' );146 /* translators: column name */147 if ( 'upload' == $this->_screen->id ) {148 $posts_columns['parent'] = _x( 'Attached to', 'column name' );149 $posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="' . esc_url( admin_url( 'images/comment-grey-bubble.png' ) ) . '" /></div>';150 }151 /* translators: column name */152 $posts_columns['date'] = _x( 'Date', 'column name' );153 $posts_columns = apply_filters( 'manage_media_columns', $posts_columns, 'upload' != $this->_screen->id );154 155 return $posts_columns;156 }157 158 function get_sortable_columns() {159 return array(160 'title' => 'title',161 'author' => 'author',162 'parent' => 'parent',163 'comments' => 'comment_count',164 'date' => 'date',165 );166 }167 168 function display_rows() {169 global $detached, $post, $id;170 171 if ( $detached ) {172 $this->display_orphans();173 return;174 }175 176 add_filter( 'the_title','esc_html' );177 $alt = '';178 179 while ( have_posts() ) : the_post();180 181 if ( $this->is_trash && $post->post_status != 'trash'182 || !$this->is_trash && $post->post_status == 'trash' )183 continue;184 185 $alt = ( 'alternate' == $alt ) ? '' : 'alternate';186 $post_owner = ( get_current_user_id() == $post->post_author ) ? 'self' : 'other';187 $att_title = _draft_or_post_title();188 ?>189 <tr id='post-<?php echo $id; ?>' class='<?php echo trim( $alt . ' author-' . $post_owner . ' status-' . $post->post_status ); ?>' valign="top">190 <?php191 192 list( $columns, $hidden ) = $this->get_column_info();193 foreach ( $columns as $column_name => $column_display_name ) {194 $class = "class='$column_name column-$column_name'";195 196 $style = '';197 if ( in_array( $column_name, $hidden ) )198 $style = ' style="display:none;"';199 200 $attributes = $class . $style;201 202 switch ( $column_name ) {203 204 case 'cb':205 ?>206 <th scope="row" class="check-column"><?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?><input type="checkbox" name="media[]" value="<?php the_ID(); ?>" /><?php } ?></th>207 <?php208 break;209 210 case 'icon':211 $attributes = 'class="column-icon media-icon"' . $style;212 ?>213 <td <?php echo $attributes ?>><?php214 if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {215 if ( $this->is_trash ) {216 echo $thumb;217 } else {218 ?>219 <a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>">220 <?php echo $thumb; ?>221 </a>222 223 <?php }224 }225 ?>226 </td>227 <?php228 break;229 230 case 'title':231 ?>232 <td <?php echo $attributes ?>><strong><?php if ( $this->is_trash ) echo $att_title; else { ?><a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php echo $att_title; ?></a><?php } ?></strong>233 <p>234 <?php235 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )236 echo esc_html( strtoupper( $matches[1] ) );237 else238 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );239 ?>240 </p>241 <?php242 $actions = array();243 if ( current_user_can( 'edit_post', $post->ID ) && !$this->is_trash )244 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';245 if ( current_user_can( 'delete_post', $post->ID ) ) {246 if ( $this->is_trash )247 $actions['untrash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=untrash&post=$post->ID", 'untrash-attachment_' . $post->ID ) . "'>" . __( 'Restore' ) . "</a>";248 elseif ( EMPTY_TRASH_DAYS && MEDIA_TRASH )249 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";250 if ( $this->is_trash || !EMPTY_TRASH_DAYS || !MEDIA_TRASH ) {251 $delete_ays = ( !$this->is_trash && !MEDIA_TRASH ) ? " onclick='return showNotice.warn();'" : '';252 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";253 }254 }255 if ( !$this->is_trash ) {256 $title =_draft_or_post_title( $post->post_parent );257 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';258 }259 $actions = apply_filters( 'media_row_actions', $actions, $post );260 echo $this->row_actions( $actions );261 ?>262 </td>263 <?php264 break;265 266 case 'author':267 ?>268 <td <?php echo $attributes ?>><?php the_author() ?></td>269 <?php270 break;271 272 case 'tags':273 ?>274 <td <?php echo $attributes ?>><?php275 $tags = get_the_tags();276 if ( !empty( $tags ) ) {277 $out = array();278 foreach ( $tags as $c )279 $out[] = "<a href='edit.php?tag=$c->slug'> " . esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'post_tag', 'display' ) ) . "</a>";280 echo join( ', ', $out );281 } else {282 _e( 'No Tags' );283 }284 ?>285 </td>286 <?php287 break;288 289 case 'desc':290 ?>291 <td <?php echo $attributes ?>><?php echo has_excerpt() ? $post->post_excerpt : ''; ?></td>292 <?php293 break;294 295 case 'date':296 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {297 $t_time = $h_time = __( 'Unpublished' );298 } else {299 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );300 $m_time = $post->post_date;301 $time = get_post_time( 'G', true, $post, false );302 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {303 if ( $t_diff < 0 )304 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );305 else306 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );307 } else {308 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );309 }310 }311 ?>312 <td <?php echo $attributes ?>><?php echo $h_time ?></td>313 <?php314 break;315 316 case 'parent':317 if ( $post->post_parent > 0 ) {318 if ( get_post( $post->post_parent ) ) {319 $title =_draft_or_post_title( $post->post_parent );320 }321 ?>322 <td <?php echo $attributes ?>>323 <strong><a href="<?php echo get_edit_post_link( $post->post_parent ); ?>"><?php echo $title ?></a></strong>,324 <?php echo get_the_time( __( 'Y/m/d' ) ); ?>325 </td>326 <?php327 } else {328 ?>329 <td <?php echo $attributes ?>><?php _e( '(Unattached)' ); ?><br />330 <a class="hide-if-no-js" onclick="findPosts.open( 'media[]','<?php echo $post->ID ?>' );return false;" href="#the-list"><?php _e( 'Attach' ); ?></a></td>331 <?php332 }333 break;334 335 case 'comments':336 $attributes = 'class="comments column-comments num"' . $style;337 ?>338 <td <?php echo $attributes ?>>339 <div class="post-com-count-wrapper">340 <?php341 $pending_comments = get_pending_comments_num( $post->ID );342 343 $this->comments_bubble( $post->ID, $pending_comments );344 ?>345 </div>346 </td>347 <?php348 break;349 350 case 'actions':351 ?>352 <td <?php echo $attributes ?>>353 <a href="media.php?action=edit&attachment_id=<?php the_ID(); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php _e( 'Edit' ); ?></a> |354 <a href="<?php the_permalink(); ?>"><?php _e( 'Get permalink' ); ?></a>355 </td>356 <?php357 break;358 359 default:360 ?>361 <td <?php echo $attributes ?>>362 <?php do_action( 'manage_media_custom_column', $column_name, $id ); ?>363 </td>364 <?php365 break;366 }367 }368 ?>369 </tr>370 <?php endwhile;371 }372 373 function display_orphans() {374 global $post;375 376 $class = '';377 378 while ( have_posts() ) : the_post();379 380 $class = ( 'alternate' == $class ) ? '' : 'alternate';381 $att_title = esc_html( _draft_or_post_title( $post->ID ) );382 383 $edit_link = '<a href="' . get_edit_post_link( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ) . '">%s</a>';384 ?>385 <tr id='post-<?php echo $post->ID; ?>' class='<?php echo $class; ?>' valign="top">386 <th scope="row" class="check-column">387 <?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?>388 <input type="checkbox" name="media[]" value="<?php echo esc_attr( $post->ID ); ?>" />389 <?php } ?>390 </th>391 392 <td class="media-icon">393 <?php if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {394 printf( $edit_link, $thumb );395 } ?>396 </td>397 398 <td class="media column-media">399 <strong><?php printf( $edit_link, $att_title ); ?></strong><br />400 <?php401 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )402 echo esc_html( strtoupper( $matches[1] ) );403 else404 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );405 ?>406 <?php407 $actions = array();408 if ( current_user_can( 'edit_post', $post->ID ) )409 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';410 if ( current_user_can( 'delete_post', $post->ID ) )411 if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) {412 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";413 } else {414 $delete_ays = !MEDIA_TRASH ? " onclick='return showNotice.warn();'" : '';415 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";416 }417 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $att_title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';418 if ( current_user_can( 'edit_post', $post->ID ) )419 $actions['attach'] = '<a href="#the-list" onclick="findPosts.open( \'media[]\',\''.$post->ID.'\' );return false;" class="hide-if-no-js">'.__( 'Attach' ).'</a>';420 $actions = apply_filters( 'media_row_actions', $actions, $post );421 422 echo $this->row_actions( $actions );423 ?>424 </td>425 <td class="author column-author">426 <?php $author = get_userdata( $post->post_author ); echo $author->display_name; ?>427 </td>428 <?php429 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {430 $t_time = $h_time = __( 'Unpublished' );431 } else {432 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );433 $m_time = $post->post_date;434 $time = get_post_time( 'G', true );435 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {436 if ( $t_diff < 0 )437 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );438 else439 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );440 } else {441 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );442 }443 }444 ?>445 <td class="date column-date"><?php echo $h_time ?></td>446 </tr>447 <?php448 endwhile;449 }450 }451 452 class WP_Terms_Table extends WP_List_Table {453 454 var $callback_args;455 456 function WP_Terms_Table() {457 global $post_type, $taxonomy, $tax, $current_screen;458 459 wp_reset_vars( array( 'action', 'taxonomy', 'post_type' ) );460 461 if ( empty( $taxonomy ) )462 $taxonomy = 'post_tag';463 464 if ( !taxonomy_exists( $taxonomy ) )465 wp_die( __( 'Invalid taxonomy' ) );466 467 $tax = get_taxonomy( $taxonomy );468 469 if ( empty( $post_type ) || !in_array( $post_type, get_post_types( array( 'public' => true ) ) ) )470 $post_type = 'post';471 472 if ( !isset( $current_screen ) )473 set_current_screen( 'edit-' . $taxonomy );474 475 parent::WP_List_Table( array(476 'screen' => $current_screen,477 'plural' => 'tags',478 'singular' => 'tag',479 ) );480 }481 482 function check_permissions( $type = 'manage' ) {483 global $tax;484 485 $cap = 'manage' == $type ? $tax->cap->manage_terms : $tax->cap->edit_terms;486 487 if ( !current_user_can( $tax->cap->manage_terms ) )488 wp_die( __( 'Cheatin’ uh?' ) );489 }490 491 function prepare_items() {492 global $taxonomy;493 494 $tags_per_page = $this->get_items_per_page( 'edit_' . $taxonomy . '_per_page' );495 496 if ( 'post_tag' == $taxonomy ) {497 $tags_per_page = apply_filters( 'edit_tags_per_page', $tags_per_page );498 $tags_per_page = apply_filters( 'tagsperpage', $tags_per_page ); // Old filter499 } elseif ( 'category' == $taxonomy ) {500 $tags_per_page = apply_filters( 'edit_categories_per_page', $tags_per_page ); // Old filter501 }502 503 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';504 505 $args = array(506 'search' => $search,507 'page' => $this->get_pagenum(),508 'number' => $tags_per_page,509 );510 511 if ( !empty( $_REQUEST['orderby'] ) )512 $args['orderby'] = trim( stripslashes( $_REQUEST['orderby'] ) );513 514 if ( !empty( $_REQUEST['order'] ) )515 $args['order'] = trim( stripslashes( $_REQUEST['order'] ) );516 517 $this->callback_args = $args;518 519 $this->set_pagination_args( array(520 'total_items' => wp_count_terms( $taxonomy, compact( 'search' ) ),521 'per_page' => $tags_per_page,522 ) );523 }524 525 function get_bulk_actions() {526 $actions = array();527 $actions['delete'] = __( 'Delete' );528 529 return $actions;530 }531 532 function current_action() {533 if ( isset( $_REQUEST['action'] ) && isset( $_REQUEST['delete_tags'] ) && ( 'delete' == $_REQUEST['action'] || 'delete' == $_REQUEST['action2'] ) )534 return 'bulk-delete';535 536 return parent::current_action();537 }538 539 function get_columns() {540 global $taxonomy;541 542 $columns = array(543 'cb' => '<input type="checkbox" />',544 'name' => __( 'Name' ),545 'description' => __( 'Description' ),546 'slug' => __( 'Slug' ),547 );548 549 if ( 'link_category' == $taxonomy )550 $columns['links'] = __( 'Links' );551 else552 $columns['posts'] = __( 'Posts' );553 554 return $columns;555 }556 557 function get_sortable_columns() {558 return array(559 'name' => 'name',560 'description' => 'description',561 'slug' => 'slug',562 'posts' => 'count',563 'links' => 'count'564 );565 }566 567 function display_rows() {568 global $taxonomy;569 570 $args = wp_parse_args( $this->callback_args, array(571 'page' => 1,572 'number' => 20,573 'search' => '',574 'hide_empty' => 0575 ) );576 577 extract( $args, EXTR_SKIP );578 579 $args['offset'] = $offset = ( $page - 1 ) * $number;580 581 // convert it to table rows582 $out = '';583 $count = 0;584 if ( is_taxonomy_hierarchical( $taxonomy ) && !isset( $orderby ) ) {585 // We'll need the full set of terms then.586 $args['number'] = $args['offset'] = 0;587 588 $terms = get_terms( $taxonomy, $args );589 if ( !empty( $search ) ) // Ignore children on searches.590 $children = array();591 else592 $children = _get_term_hierarchy( $taxonomy );593 594 // Some funky recursion to get the job done( Paging & parents mainly ) is contained within, Skip it for non-hierarchical taxonomies for performance sake595 $out .= $this->_rows( $taxonomy, $terms, $children, $offset, $number, $count );596 } else {597 $terms = get_terms( $taxonomy, $args );598 foreach ( $terms as $term )599 $out .= $this->single_row( $term, 0, $taxonomy );600 $count = $number; // Only displaying a single page.601 }602 603 echo $out;604 }605 606 function _rows( $taxonomy, $terms, &$children, $start = 0, $per_page = 20, &$count, $parent = 0, $level = 0 ) {607 608 $end = $start + $per_page;609 610 $output = '';611 foreach ( $terms as $key => $term ) {612 613 if ( $count >= $end )614 break;615 616 if ( $term->parent != $parent && empty( $_REQUEST['s'] ) )617 continue;618 619 // If the page starts in a subtree, print the parents.620 if ( $count == $start && $term->parent > 0 && empty( $_REQUEST['s'] ) ) {621 $my_parents = $parent_ids = array();622 $p = $term->parent;623 while ( $p ) {624 $my_parent = get_term( $p, $taxonomy );625 $my_parents[] = $my_parent;626 $p = $my_parent->parent;627 if ( in_array( $p, $parent_ids ) ) // Prevent parent loops.628 break;629 $parent_ids[] = $p;630 }631 unset( $parent_ids );632 633 $num_parents = count( $my_parents );634 while ( $my_parent = array_pop( $my_parents ) ) {635 $output .= "\t" . $this->single_row( $my_parent, $level - $num_parents, $taxonomy );636 $num_parents--;637 }638 }639 640 if ( $count >= $start )641 $output .= "\t" . $this->single_row( $term, $level, $taxonomy );642 643 ++$count;644 645 unset( $terms[$key] );646 647 if ( isset( $children[$term->term_id] ) && empty( $_REQUEST['s'] ) )648 $output .= $this->_rows( $taxonomy, $terms, $children, $start, $per_page, $count, $term->term_id, $level + 1 );649 }650 651 return $output;652 }653 654 function single_row( $tag, $level = 0 ) {655 static $row_class = '';656 $row_class = ( $row_class == '' ? ' class="alternate"' : '' );657 658 $this->level = $level;659 660 echo '<tr id="tag-' . $tag->term_id . '"' . $row_class . '>';661 echo $this->single_row_columns( $tag );662 echo '</tr>';663 }664 665 function column_cb( $tag ) {666 global $taxonomy, $tax;667 668 $default_term = get_option( 'default_' . $taxonomy );669 670 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )671 return '<input type="checkbox" name="delete_tags[]" value="' . $tag->term_id . '" />';672 else673 return ' ';674 }675 676 function column_name( $tag ) {677 global $taxonomy, $tax, $post_type;678 679 $default_term = get_option( 'default_' . $taxonomy );680 681 $pad = str_repeat( '— ', max( 0, $this->level ) );682 $name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag );683 $qe_data = get_term( $tag->term_id, $taxonomy, OBJECT, 'edit' );684 $edit_link = get_edit_term_link( $tag->term_id, $taxonomy, $post_type );685 686 $out = '<strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $name ) ) . '">' . $name . '</a></strong><br />';687 688 $actions = array();689 if ( current_user_can( $tax->cap->edit_terms ) ) {690 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';691 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __( 'Quick Edit' ) . '</a>';692 }693 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )694 $actions['delete'] = "<a class='delete-tag' href='" . wp_nonce_url( "edit-tags.php?action=delete&taxonomy=$taxonomy&tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id ) . "'>" . __( 'Delete' ) . "</a>";695 696 $actions = apply_filters( 'tag_row_actions', $actions, $tag );697 $actions = apply_filters( "${taxonomy}_row_actions", $actions, $tag );698 699 $out .= $this->row_actions( $actions );700 $out .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';701 $out .= '<div class="name">' . $qe_data->name . '</div>';702 $out .= '<div class="slug">' . apply_filters( 'editable_slug', $qe_data->slug ) . '</div>';703 $out .= '<div class="parent">' . $qe_data->parent . '</div></div></td>';704 705 return $out;706 }707 708 function column_description( $tag ) {709 return $tag->description;710 }711 712 function column_slug( $tag ) {713 return apply_filters( 'editable_slug', $tag->slug );714 }715 716 function column_posts( $tag ) {717 global $taxonomy, $post_type;718 719 $count = number_format_i18n( $tag->count );720 721 if ( 'post_tag' == $taxonomy ) {722 $tagsel = 'tag';723 } elseif ( 'category' == $taxonomy ) {724 $tagsel = 'category_name';725 } elseif ( ! empty( $tax->query_var ) ) {726 $tagsel = $tax->query_var;727 } else {728 $tagsel = $taxonomy;729 }730 731 return "<a href='edit.php?$tagsel=$tag->slug&post_type=$post_type'>$count</a>";732 }733 734 function column_links( $tag ) {735 $count = number_format_i18n( $tag->count );736 return $count;737 }738 739 function column_default( $tag, $column_name ) {740 global $taxonomy;741 742 return apply_filters( "manage_${taxonomy}_custom_column", '', $column_name, $tag->term_id );743 $out .= "</td>";744 }745 746 /**747 * Outputs the hidden row displayed when inline editing748 *749 * @since 3.1.0750 */751 function inline_edit() {752 global $tax;753 754 if ( ! current_user_can( $tax->cap->edit_terms ) )755 return;756 757 list( $columns, $hidden ) = $this->get_column_info();758 759 $col_count = count( $columns ) - count( $hidden );760 ?>761 762 <form method="get" action=""><table style="display: none"><tbody id="inlineedit">763 <tr id="inline-edit" class="inline-edit-row" style="display: none"><td colspan="<?php echo $col_count; ?>">764 765 <fieldset><div class="inline-edit-col">766 <h4><?php _e( 'Quick Edit' ); ?></h4>767 768 <label>769 <span class="title"><?php _e( 'Name' ); ?></span>770 <span class="input-text-wrap"><input type="text" name="name" class="ptitle" value="" /></span>771 </label>772 <?php if ( !global_terms_enabled() ) { ?>773 <label>774 <span class="title"><?php _e( 'Slug' ); ?></span>775 <span class="input-text-wrap"><input type="text" name="slug" class="ptitle" value="" /></span>776 </label>777 <?php } ?>778 779 </div></fieldset>780 <?php781 782 $core_columns = array( 'cb' => true, 'description' => true, 'name' => true, 'slug' => true, 'posts' => true );783 784 foreach ( $columns as $column_name => $column_display_name ) {785 if ( isset( $core_columns[$column_name] ) )786 continue;787 do_action( 'quick_edit_custom_box', $column_name, $type, $tax->taxonomy );788 }789 790 ?>791 792 <p class="inline-edit-save submit">793 <a accesskey="c" href="#inline-edit" title="<?php _e( 'Cancel' ); ?>" class="cancel button-secondary alignleft"><?php _e( 'Cancel' ); ?></a>794 <?php $update_text = $tax->labels->update_item; ?>795 <a accesskey="s" href="#inline-edit" title="<?php echo esc_attr( $update_text ); ?>" class="save button-primary alignright"><?php echo $update_text; ?></a>796 <img class="waiting" style="display:none;" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" />797 <span class="error" style="display:none;"></span>798 <?php wp_nonce_field( 'taxinlineeditnonce', '_inline_edit', false ); ?>799 <input type="hidden" name="taxonomy" value="<?php echo esc_attr( $tax->name ); ?>" />800 <br class="clear" />801 </p>802 </td></tr>803 </tbody></table></form>804 <?php805 }806 }807 808 class WP_Users_Table extends WP_List_Table {809 810 function WP_Users_Table() {811 parent::WP_List_Table( array(812 'screen' => 'users',813 'plural' => 'users'814 ) );815 }816 817 function check_permissions() {818 if ( !current_user_can('list_users') )819 wp_die(__('Cheatin’ uh?'));820 }821 822 function prepare_items() {823 global $role, $usersearch;824 825 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';826 827 $role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : '';828 829 $users_per_page = $this->get_items_per_page( 'users_per_page' );830 831 $paged = $this->get_pagenum();832 833 $args = array(834 'number' => $users_per_page,835 'offset' => ( $paged-1 ) * $users_per_page,836 'role' => $role,837 'search' => $usersearch838 );839 840 if ( isset( $_REQUEST['orderby'] ) )841 $args['orderby'] = $_REQUEST['orderby'];842 843 if ( isset( $_REQUEST['order'] ) )844 $args['order'] = $_REQUEST['order'];845 846 // Query the user IDs for this page847 $wp_user_search = new WP_User_Query( $args );848 849 $this->items = $wp_user_search->get_results();850 851 $this->set_pagination_args( array(852 'total_items' => $wp_user_search->get_total(),853 'per_page' => $users_per_page,854 ) );855 }856 857 function no_items() {858 _e( 'No matching users were found.' );859 }860 861 function get_views() {862 global $wp_roles, $role;863 864 $users_of_blog = count_users();865 $total_users = $users_of_blog['total_users'];866 $avail_roles =& $users_of_blog['avail_roles'];867 unset($users_of_blog);868 869 $current_role = false;870 $class = empty($role) ? ' class="current"' : '';871 $role_links = array();872 $role_links['all'] = "<li><a href='users.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>';873 foreach ( $wp_roles->get_names() as $this_role => $name ) {874 if ( !isset($avail_roles[$this_role]) )875 continue;876 877 $class = '';878 879 if ( $this_role == $role ) {880 $current_role = $role;881 $class = ' class="current"';882 }883 884 $name = translate_user_role( $name );885 /* translators: User role name with count */886 $name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, $avail_roles[$this_role] );887 $role_links[$this_role] = "<li><a href='users.php?role=$this_role'$class>$name</a>";888 }889 890 return $role_links;891 }892 893 function get_bulk_actions() {894 $actions = array();895 896 if ( !is_multisite() && current_user_can( 'delete_users' ) )897 $actions['delete'] = __( 'Delete' );898 else899 $actions['remove'] = __( 'Remove' );900 901 return $actions;902 }903 904 function extra_tablenav( $which ) {905 if ( 'top' != $which )906 return;907 ?>908 <div class="alignleft actions">909 <label class="screen-reader-text" for="new_role"><?php _e( 'Change role to…' ) ?></label>910 <select name="new_role" id="new_role">911 <option value=''><?php _e( 'Change role to…' ) ?></option>912 <?php wp_dropdown_roles(); ?>913 </select>914 <input type="submit" value="<?php esc_attr_e( 'Change' ); ?>" name="changeit" class="button-secondary" />915 </div>916 <?php917 }918 919 function current_action() {920 if ( isset($_REQUEST['changeit']) && !empty($_REQUEST['new_role']) )921 return 'promote';922 923 return parent::current_action();924 }925 926 function get_columns() {927 return array(928 'cb' => '<input type="checkbox" />',929 'username' => __( 'Login' ),930 'name' => __( 'Name' ),931 'email' => __( 'E-mail' ),932 'role' => __( 'Role' ),933 'posts' => __( 'Posts' )934 );935 }936 937 function get_sortable_columns() {938 return array(939 'username' => 'login',940 'name' => 'name',941 'email' => 'email',942 'posts' => 'post_count',943 );944 }945 946 function display_rows() {947 // Query the post counts for this page948 $post_counts = count_many_users_posts( array_keys( $this->items ) );949 950 $style = '';951 foreach ( $this->items as $userid => $user_object ) {952 $role = reset( $user_object->roles );953 954 if ( is_multisite() && empty( $role ) )955 continue;956 957 $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"';958 echo "\n\t", $this->single_row( $user_object, $style, $role, $post_counts[ $userid ] );959 }960 }961 962 /**963 * Generate HTML for a single row on the users.php admin panel.964 *965 * @since 2.1.0966 *967 * @param object $user_object968 * @param string $style Optional. Attributes added to the TR element. Must be sanitized.969 * @param string $role Key for the $wp_roles array.970 * @param int $numposts Optional. Post count to display for this user. Defaults to zero, as in, a new user has made zero posts.971 * @return string972 */973 function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) {974 global $wp_roles;975 976 if ( !( is_object( $user_object ) && is_a( $user_object, 'WP_User' ) ) )977 $user_object = new WP_User( (int) $user_object );978 $user_object = sanitize_user_object( $user_object, 'display' );979 $email = $user_object->user_email;980 $url = $user_object->user_url;981 $short_url = str_replace( 'http://', '', $url );982 $short_url = str_replace( 'www.', '', $short_url );983 if ( '/' == substr( $short_url, -1 ) )984 $short_url = substr( $short_url, 0, -1 );985 if ( strlen( $short_url ) > 35 )986 $short_url = substr( $short_url, 0, 32 ).'...';987 $checkbox = '';988 // Check if the user for this row is editable989 if ( current_user_can( 'list_users' ) ) {990 // Set up the user editing link991 // TODO: make profile/user-edit determination a separate function992 if ( get_current_user_id() == $user_object->ID ) {993 $edit_link = 'profile.php';994 } else {995 $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( esc_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" ) );996 }997 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";998 999 // Set up the hover actions for this user1000 $actions = array();1001 1002 if ( current_user_can( 'edit_user', $user_object->ID ) ) {1003 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";1004 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';1005 } else {1006 $edit = "<strong>$user_object->user_login</strong><br />";1007 }1008 1009 if ( !is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) )1010 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=delete&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Delete' ) . "</a>";1011 if ( is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'remove_user', $user_object->ID ) )1012 $actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=remove&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . "</a>";1013 $actions = apply_filters( 'user_row_actions', $actions, $user_object );1014 $edit .= $this->row_actions( $actions );1015 1016 // Set up the checkbox ( because the user is editable, otherwise its empty )1017 $checkbox = "<input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='$role' value='{$user_object->ID}' />";1018 1019 } else {1020 $edit = '<strong>' . $user_object->user_login . '</strong>';1021 }1022 $role_name = isset( $wp_roles->role_names[$role] ) ? translate_user_role( $wp_roles->role_names[$role] ) : __( 'None' );1023 $r = "<tr id='user-$user_object->ID'$style>";1024 $avatar = get_avatar( $user_object->ID, 32 );1025 1026 list( $columns, $hidden ) = $this->get_column_info();1027 1028 foreach ( $columns as $column_name => $column_display_name ) {1029 $class = "class=\"$column_name column-$column_name\"";1030 1031 $style = '';1032 if ( in_array( $column_name, $hidden ) )1033 $style = ' style="display:none;"';1034 1035 $attributes = "$class$style";1036 1037 switch ( $column_name ) {1038 case 'cb':1039 $r .= "<th scope='row' class='check-column'>$checkbox</th>";1040 break;1041 case 'username':1042 $r .= "<td $attributes>$avatar $edit</td>";1043 break;1044 case 'name':1045 $r .= "<td $attributes>$user_object->first_name $user_object->last_name</td>";1046 break;1047 case 'email':1048 $r .= "<td $attributes><a href='mailto:$email' title='" . sprintf( __( 'E-mail: %s' ), $email ) . "'>$email</a></td>";1049 break;1050 case 'role':1051 $r .= "<td $attributes>$role_name</td>";1052 break;1053 case 'posts':1054 $attributes = 'class="posts column-posts num"' . $style;1055 $r .= "<td $attributes>";1056 if ( $numposts > 0 ) {1057 $r .= "<a href='edit.php?author=$user_object->ID' title='" . __( 'View posts by this author' ) . "' class='edit'>";1058 $r .= $numposts;1059 $r .= '</a>';1060 } else {1061 $r .= 0;1062 }1063 $r .= "</td>";1064 break;1065 default:1066 $r .= "<td $attributes>";1067 $r .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID );1068 $r .= "</td>";1069 }1070 }1071 $r .= '</tr>';1072 1073 return $r;1074 }1075 }1076 1077 class WP_Comments_Table extends WP_List_Table {1078 1079 var $checkbox = true;1080 var $from_ajax = false;1081 1082 var $pending_count = array();1083 1084 function WP_Comments_Table() {1085 global $mode;1086 1087 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'detail' : $_REQUEST['mode'];1088 1089 if ( get_option('show_avatars') && 'single' != $mode )1090 add_filter( 'comment_author', 'floated_admin_avatar' );1091 1092 parent::WP_List_Table( array(1093 'screen' => 'edit-comments',1094 'plural' => 'comments'1095 ) );1096 }1097 1098 function check_permissions() {1099 if ( !current_user_can('edit_posts') )1100 wp_die(__('Cheatin’ uh?'));1101 }1102 1103 function prepare_items() {1104 global $post_id, $comment_status, $search;1105 1106 if ( isset( $_REQUEST['p'] ) )1107 $post_id = absint( $_REQUEST['p'] );1108 elseif ( isset( $_REQUEST['post'] ) )1109 $post_id = absint( $_REQUEST['post'] );1110 elseif ( isset( $_REQUEST['post_ID'] ) )1111 $post_id = absint( $_REQUEST['post_ID'] );1112 else1113 $post_id = 0;1114 1115 $comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all';1116 if ( !in_array( $comment_status, array( 'all', 'moderated', 'approved', 'spam', 'trash' ) ) )1117 $comment_status = 'all';1118 1119 $comment_type = !empty( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : '';1120 1121 $search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : '';1122 1123 $user_id = ( isset( $_REQUEST['user_id'] ) ) ? $_REQUEST['user_id'] : '';1124 1125 $comments_per_page = $this->get_items_per_page( 'edit_comments_per_page' );1126 $comments_per_page = apply_filters( 'comments_per_page', $comments_per_page, $comment_status );1127 1128 if ( isset( $_POST['number'] ) )1129 $number = (int) $_POST['number'];1130 else1131 $number = $comments_per_page + min( 8, $comments_per_page ); // Grab a few extra1132 1133 $page = $this->get_pagenum();1134 1135 $start = $offset = ( $page - 1 ) * $comments_per_page;1136 1137 $status_map = array(1138 'moderated' => 'hold',1139 'approved' => 'approve'1140 );1141 1142 $args = array(1143 'status' => isset( $status_map[$comment_status] ) ? $status_map[$comment_status] : $comment_status,1144 'search' => $search,1145 'user_id' => $user_id,1146 'offset' => $start,1147 'number' => $number,1148 'post_id' => $post_id,1149 'type' => $comment_type,1150 'orderby' => @$_REQUEST['orderby'],1151 'order' => @$_REQUEST['order'],1152 );1153 1154 $_comments = get_comments( $args );1155 1156 update_comment_cache( $_comments );1157 1158 $this->items = array_slice( $_comments, 0, $comments_per_page );1159 $this->extra_items = array_slice( $_comments, $comments_per_page );1160 1161 $total_comments = get_comments( array_merge( $args, array('count' => true, 'offset' => 0, 'number' => 0) ) );1162 1163 $_comment_post_ids = array();1164 foreach ( $_comments as $_c ) {1165 $_comment_post_ids[] = $_c->comment_post_ID;1166 }1167 1168 $this->pending_count = get_pending_comments_num( $_comment_post_ids );1169 1170 $this->set_pagination_args( array(1171 'total_items' => $total_comments,1172 'per_page' => $comments_per_page,1173 ) );1174 }1175 1176 function get_views() {1177 global $post_id, $comment_status;1178 1179 $status_links = array();1180 $num_comments = ( $post_id ) ? wp_count_comments( $post_id ) : wp_count_comments();1181 //, number_format_i18n($num_comments->moderated) ), "<span class='comment-count'>" . number_format_i18n($num_comments->moderated) . "</span>"),1182 //, number_format_i18n($num_comments->spam) ), "<span class='spam-comment-count'>" . number_format_i18n($num_comments->spam) . "</span>")1183 $stati = array(1184 'all' => _nx_noop('All', 'All', 'comments'), // singular not used1185 'moderated' => _n_noop('Pending <span class="count">(<span class="pending-count">%s</span>)</span>', 'Pending <span class="count">(<span class="pending-count">%s</span>)</span>'),1186 'approved' => _n_noop('Approved', 'Approved'), // singular not used1187 'spam' => _n_noop('Spam <span class="count">(<span class="spam-count">%s</span>)</span>', 'Spam <span class="count">(<span class="spam-count">%s</span>)</span>'),1188 'trash' => _n_noop('Trash <span class="count">(<span class="trash-count">%s</span>)</span>', 'Trash <span class="count">(<span class="trash-count">%s</span>)</span>')1189 );1190 1191 if ( !EMPTY_TRASH_DAYS )1192 unset($stati['trash']);1193 1194 $link = 'edit-comments.php';1195 if ( !empty($comment_type) && 'all' != $comment_type )1196 $link = add_query_arg( 'comment_type', $comment_type, $link );1197 1198 foreach ( $stati as $status => $label ) {1199 $class = ( $status == $comment_status ) ? ' class="current"' : '';1200 1201 if ( !isset( $num_comments->$status ) )1202 $num_comments->$status = 10;1203 $link = add_query_arg( 'comment_status', $status, $link );1204 if ( $post_id )1205 $link = add_query_arg( 'p', absint( $post_id ), $link );1206 /*1207 // I toyed with this, but decided against it. Leaving it in here in case anyone thinks it is a good idea. ~ Mark1208 if ( !empty( $_REQUEST['s'] ) )1209 $link = add_query_arg( 's', esc_attr( stripslashes( $_REQUEST['s'] ) ), $link );1210 */1211 $status_links[$status] = "<li class='$status'><a href='$link'$class>" . sprintf(1212 _n( $label[0], $label[1], $num_comments->$status ),1213 number_format_i18n( $num_comments->$status )1214 ) . '</a>';1215 }1216 1217 $status_links = apply_filters( 'comment_status_links', $status_links );1218 return $status_links;1219 }1220 1221 function get_bulk_actions() {1222 global $comment_status;1223 1224 $actions = array();1225 if ( in_array( $comment_status, array( 'all', 'approved' ) ) )1226 $actions['unapprove'] = __( 'Unapprove' );1227 if ( in_array( $comment_status, array( 'all', 'moderated', 'spam' ) ) )1228 $actions['approve'] = __( 'Approve' );1229 if ( in_array( $comment_status, array( 'all', 'moderated', 'approved' ) ) )1230 $actions['spam'] = _x( 'Mark as Spam', 'comment' );1231 1232 if ( 'trash' == $comment_status )1233 $actions['untrash'] = __( 'Restore' );1234 elseif ( 'spam' == $comment_status )1235 $actions['unspam'] = _x( 'Not Spam', 'comment' );1236 1237 if ( in_array( $comment_status, array( 'trash', 'spam' ) ) || !EMPTY_TRASH_DAYS )1238 $actions['delete'] = __( 'Delete Permanently' );1239 else1240 $actions['trash'] = __( 'Move to Trash' );1241 1242 return $actions;1243 }1244 1245 function extra_tablenav( $which ) {1246 global $comment_status, $comment_type;1247 ?>1248 <div class="alignleft actions">1249 <?php1250 if ( 'top' == $which ) {1251 ?>1252 <select name="comment_type">1253 <option value=""><?php _e( 'Show all comment types' ); ?></option>1254 <?php1255 $comment_types = apply_filters( 'admin_comment_types_dropdown', array(1256 'comment' => __( 'Comments' ),1257 'pings' => __( 'Pings' ),1258 ) );1259 1260 foreach ( $comment_types as $type => $label )1261 echo "\t<option value='" . esc_attr( $type ) . "'" . selected( $comment_type, $type, false ) . ">$label</option>\n";1262 ?>1263 </select>1264 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />1265 <?php1266 }1267 1268 if ( ( 'spam' == $comment_status || 'trash' == $comment_status ) && current_user_can( 'moderate_comments' ) ) {1269 wp_nonce_field( 'bulk-destroy', '_destroy_nonce' );1270 $title = ( 'spam' == $comment_status ) ? esc_attr__( 'Empty Spam' ) : esc_attr__( 'Empty Trash' );1271 ?>1272 <input type="submit" name="delete_all" id="delete_all" value="<?php echo $title ?>" class="button-secondary apply" />1273 <?php1274 }1275 ?>1276 <?php1277 do_action( 'manage_comments_nav', $comment_status );1278 echo '</div>';1279 }1280 1281 function current_action() {1282 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )1283 return 'delete_all';1284 1285 return parent::current_action();1286 }1287 1288 function get_columns() {1289 global $mode;1290 1291 $columns = array();1292 1293 if ( $this->checkbox )1294 $columns['cb'] = '<input type="checkbox" />';1295 1296 $columns['author'] = __( 'Author' );1297 $columns['comment'] = _x( 'Comment', 'column name' );1298 1299 if ( 'single' !== $mode )1300 $columns['response'] = _x( 'Comment', 'column name' );1301 1302 return $columns;1303 }1304 1305 function get_sortable_columns() {1306 return array(1307 'author' => 'comment_author',1308 'comment' => 'comment_content',1309 'response' => 'comment_post_ID'1310 );1311 }1312 1313 function display_table() {1314 extract( $this->_args );1315 1316 $this->display_tablenav( 'top' );1317 1318 ?>1319 <table class="<?php echo implode( ' ', $this->get_table_classes() ); ?>" cellspacing="0">1320 <thead>1321 <tr>1322 <?php $this->print_column_headers(); ?>1323 </tr>1324 </thead>1325 1326 <tfoot>1327 <tr>1328 <?php $this->print_column_headers( false ); ?>1329 </tr>1330 </tfoot>1331 1332 <tbody id="the-comment-list" class="list:comment">1333 <?php $this->display_rows(); ?>1334 </tbody>1335 1336 <tbody id="the-extra-comment-list" class="list:comment" style="display: none;">1337 <?php $this->items = $this->extra_items; $this->display_rows(); ?>1338 </tbody>1339 </table>1340 <?php1341 1342 $this->display_tablenav( 'bottom' );1343 }1344 1345 function single_row( $a_comment ) {1346 global $post, $comment, $the_comment_status;1347 1348 $comment = $a_comment;1349 $the_comment_status = wp_get_comment_status( $comment->comment_ID );1350 1351 $post = get_post( $comment->comment_post_ID );1352 1353 $this->user_can = current_user_can( 'edit_comment', $comment->comment_ID );1354 1355 echo "<tr id='comment-$comment->comment_ID' class='$the_comment_status'>";1356 echo $this->single_row_columns( $comment );1357 echo "</tr>\n";1358 }1359 1360 function column_cb( $comment ) {1361 if ( $this->user_can )1362 echo "<input type='checkbox' name='delete_comments[]' value='$comment->comment_ID' />";1363 }1364 1365 function column_comment( $comment ) {1366 global $post, $comment_status, $the_comment_status;1367 1368 $user_can = $this->user_can;1369 1370 $comment_url = esc_url( get_comment_link( $comment->comment_ID ) );1371 1372 $ptime = date( 'G', strtotime( $comment->comment_date ) );1373 if ( ( abs( time() - $ptime ) ) < 86400 )1374 $ptime = sprintf( __( '%s ago' ), human_time_diff( $ptime ) );1375 else1376 $ptime = mysql2date( __( 'Y/m/d \a\t g:i A' ), $comment->comment_date );1377 1378 if ( $user_can ) {1379 $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) );1380 $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) );1381 1382 $url = "comment.php?c=$comment->comment_ID";1383 1384 $approve_url = esc_url( $url . "&action=approvecomment&$approve_nonce" );1385 $unapprove_url = esc_url( $url . "&action=unapprovecomment&$approve_nonce" );1386 $spam_url = esc_url( $url . "&action=spamcomment&$del_nonce" );1387 $unspam_url = esc_url( $url . "&action=unspamcomment&$del_nonce" );1388 $trash_url = esc_url( $url . "&action=trashcomment&$del_nonce" );1389 $untrash_url = esc_url( $url . "&action=untrashcomment&$del_nonce" );1390 $delete_url = esc_url( $url . "&action=deletecomment&$del_nonce" );1391 }1392 1393 echo '<div id="submitted-on">';1394 /* translators: 2: comment date, 3: comment time */1395 printf( __( '<a href="%1$s">%2$s at %3$s</a>' ), $comment_url,1396 /* translators: comment date format. See http://php.net/date */ get_comment_date( __( 'Y/m/d' ) ),1397 /* translators: comment time format. See http://php.net/date */ get_comment_date( get_option( 'time_format' ) ) );1398 1399 if ( $comment->comment_parent ) {1400 $parent = get_comment( $comment->comment_parent );1401 $parent_link = esc_url( get_comment_link( $comment->comment_parent ) );1402 $name = get_comment_author( $parent->comment_ID );1403 printf( ' | '.__( 'In reply to <a href="%1$s">%2$s</a>.' ), $parent_link, $name );1404 }1405 1406 echo '</div>';1407 comment_text();1408 if ( $user_can ) { ?>1409 <div id="inline-<?php echo $comment->comment_ID; ?>" class="hidden">1410 <textarea class="comment" rows="1" cols="1"><?php echo esc_html( apply_filters( 'comment_edit_pre', $comment->comment_content ) ); ?></textarea>1411 <div class="author-email"><?php echo esc_attr( $comment->comment_author_email ); ?></div>1412 <div class="author"><?php echo esc_attr( $comment->comment_author ); ?></div>1413 <div class="author-url"><?php echo esc_attr( $comment->comment_author_url ); ?></div>1414 <div class="comment_status"><?php echo $comment->comment_approved; ?></div>1415 </div>1416 <?php1417 }1418 1419 if ( $user_can ) {1420 // preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash1421 $actions = array(1422 'approve' => '', 'unapprove' => '',1423 'reply' => '',1424 'quickedit' => '',1425 'edit' => '',1426 'spam' => '', 'unspam' => '',1427 'trash' => '', 'untrash' => '', 'delete' => ''1428 );1429 1430 if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments1431 if ( 'approved' == $the_comment_status )1432 $actions['unapprove'] = "<a href='$unapprove_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=unapproved vim-u vim-destructive' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';1433 else if ( 'unapproved' == $the_comment_status )1434 $actions['approve'] = "<a href='$approve_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=approved vim-a vim-destructive' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';1435 } else {1436 $actions['approve'] = "<a href='$approve_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved vim-a' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';1437 $actions['unapprove'] = "<a href='$unapprove_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved vim-u' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';1438 }1439 1440 if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) {1441 $actions['spam'] = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1 vim-s vim-destructive' title='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>';1442 } elseif ( 'spam' == $the_comment_status ) {1443 $actions['unspam'] = "<a href='$unspam_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:unspam=1 vim-z vim-destructive'>" . _x( 'Not Spam', 'comment' ) . '</a>';1444 } elseif ( 'trash' == $the_comment_status ) {1445 $actions['untrash'] = "<a href='$untrash_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:untrash=1 vim-z vim-destructive'>" . __( 'Restore' ) . '</a>';1446 }1447 1448 if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) {1449 $actions['delete'] = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID::delete=1 delete vim-d vim-destructive'>" . __( 'Delete Permanently' ) . '</a>';1450 } else {1451 $actions['trash'] = "<a href='$trash_url' class='delete:the-comment-list:comment-$comment->comment_ID::trash=1 delete vim-d vim-destructive' title='" . esc_attr__( 'Move this comment to the trash' ) . "'>" . _x( 'Trash', 'verb' ) . '</a>';1452 }1453 1454 if ( 'trash' != $the_comment_status ) {1455 $actions['edit'] = "<a href='comment.php?action=editcomment&c={$comment->comment_ID}' title='" . esc_attr__( 'Edit comment' ) . "'>". __( 'Edit' ) . '</a>';1456 $actions['quickedit'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\',\'edit\' );return false;" class="vim-q" title="'.esc_attr__( 'Quick Edit' ).'" href="#">' . __( 'Quick Edit' ) . '</a>';1457 if ( 'spam' != $the_comment_status )1458 $actions['reply'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\' );return false;" class="vim-r" title="'.esc_attr__( 'Reply to this comment' ).'" href="#">' . __( 'Reply' ) . '</a>';1459 }1460 1461 $actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment );1462 1463 $i = 0;1464 echo '<div class="row-actions">';1465 foreach ( $actions as $action => $link ) {1466 ++$i;1467 ( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';1468 1469 // Reply and quickedit need a hide-if-no-js span when not added with ajax1470 if ( ( 'reply' == $action || 'quickedit' == $action ) && ! $this->from_ajax )1471 $action .= ' hide-if-no-js';1472 elseif ( ( $action == 'untrash' && $the_comment_status == 'trash' ) || ( $action == 'unspam' && $the_comment_status == 'spam' ) ) {1473 if ( '1' == get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) )1474 $action .= ' approve';1475 else1476 $action .= ' unapprove';1477 }1478 1479 echo "<span class='$action'>$sep$link</span>";1480 }1481 echo '</div>';1482 }1483 }1484 1485 function column_author( $comment ) {1486 global $comment_status;1487 1488 $author_url = get_comment_author_url();1489 if ( 'http://' == $author_url )1490 $author_url = '';1491 $author_url_display = preg_replace( '|http://(www\.)?|i', '', $author_url );1492 if ( strlen( $author_url_display ) > 50 )1493 $author_url_display = substr( $author_url_display, 0, 49 ) . '...';1494 1495 echo "<strong>"; comment_author(); echo '</strong><br />';1496 if ( !empty( $author_url ) )1497 echo "<a title='$author_url' href='$author_url'>$author_url_display</a><br />";1498 1499 if ( $this->user_can ) {1500 if ( !empty( $comment->comment_author_email ) ) {1501 comment_author_email_link();1502 echo '<br />';1503 }1504 echo '<a href="edit-comments.php?s=';1505 comment_author_IP();1506 echo '&mode=detail';1507 if ( 'spam' == $comment_status )1508 echo '&comment_status=spam';1509 echo '">';1510 comment_author_IP();1511 echo '</a>';1512 }1513 }1514 1515 function column_date( $comment ) {1516 return get_comment_date( __( 'Y/m/d \a\t g:ia' ) );1517 }1518 1519 function column_response( $comment ) {1520 global $post;1521 1522 if ( isset( $this->pending_count[$post->ID] ) ) {1523 $pending_comments = $this->pending_count[$post->ID];1524 } else {1525 $_pending_count_temp = get_pending_comments_num( array( $post->ID ) );1526 $pending_comments = $this->pending_count[$post->ID] = $_pending_count_temp[$post->ID];1527 }1528 1529 if ( current_user_can( 'edit_post', $post->ID ) ) {1530 $post_link = "<a href='" . get_edit_post_link( $post->ID ) . "'>";1531 $post_link .= get_the_title( $post->ID ) . '</a>';1532 } else {1533 $post_link = get_the_title( $post->ID );1534 }1535 1536 echo '<div class="response-links"><span class="post-com-count-wrapper">';1537 echo $post_link . '<br />';1538 $this->comments_bubble( $post->ID, $pending_comments );1539 echo '</span> ';1540 echo "<a href='" . get_permalink( $post->ID ) . "'>#</a>";1541 echo '</div>';1542 if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) )1543 echo $thumb;1544 }1545 1546 function column_default( $comment, $column_name ) {1547 do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID );1548 }1549 }1550 1551 class WP_Post_Comments_Table extends WP_Comments_Table {1552 1553 function get_columns() {1554 return array(1555 'author' => __( 'Author' ),1556 'comment' => _x( 'Comment', 'column name' ),1557 );1558 }1559 1560 function get_sortable_columns() {1561 return array();1562 }1563 }1564 1565 class WP_Links_Table extends WP_List_Table {1566 1567 function WP_Links_Table() {1568 parent::WP_List_Table( array(1569 'screen' => 'link-manager',1570 'plural' => 'bookmarks',1571 ) );1572 }1573 1574 function check_permissions() {1575 if ( ! current_user_can( 'manage_links' ) )1576 wp_die( __( 'You do not have sufficient permissions to edit the links for this site.' ) );1577 }1578 1579 function prepare_items() {1580 global $cat_id, $s, $orderby, $order;1581 1582 wp_reset_vars( array( 'action', 'cat_id', 'linkurl', 'name', 'image', 'description', 'visible', 'target', 'category', 'link_id', 'submit', 'orderby', 'order', 'links_show_cat_id', 'rating', 'rel', 'notes', 'linkcheck[]', 's' ) );1583 1584 $args = array( 'hide_invisible' => 0, 'hide_empty' => 0 );1585 1586 if ( 'all' != $cat_id )1587 $args['category'] = $cat_id;1588 if ( !empty( $s ) )1589 $args['search'] = $s;1590 if ( !empty( $orderby ) )1591 $args['orderby'] = $orderby;1592 if ( !empty( $order ) )1593 $args['order'] = $order;1594 1595 $this->items = get_bookmarks( $args );1596 }1597 1598 function no_items() {1599 _e( 'No links found.' );1600 }1601 1602 function get_bulk_actions() {1603 $actions = array();1604 $actions['delete'] = __( 'Delete' );1605 1606 return $actions;1607 }1608 1609 function extra_tablenav( $which ) {1610 global $cat_id;1611 1612 if ( 'top' != $which )1613 return;1614 ?>1615 <div class="alignleft actions">1616 <?php1617 $dropdown_options = array(1618 'selected' => $cat_id,1619 'name' => 'cat_id',1620 'taxonomy' => 'link_category',1621 'show_option_all' => __( 'View all categories' ),1622 'hide_empty' => true,1623 'hierarchical' => 1,1624 'show_count' => 0,1625 'orderby' => 'name',1626 );1627 wp_dropdown_categories( $dropdown_options );1628 ?>1629 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />1630 </div>1631 <?php1632 }1633 1634 function get_columns() {1635 return array(1636 'cb' => '<input type="checkbox" />',1637 'name' => __( 'Name' ),1638 'url' => __( 'URL' ),1639 'categories' => __( 'Categories' ),1640 'rel' => __( 'Relationship' ),1641 'visible' => __( 'Visible' ),1642 'rating' => __( 'Rating' )1643 );1644 }1645 1646 function get_sortable_columns() {1647 return array(1648 'name' => 'name',1649 'url' => 'url',1650 'visible' => 'visible',1651 'rating' => 'rating'1652 );1653 }1654 1655 function display_rows() {1656 global $cat_id;1657 1658 $alt = 0;1659 1660 foreach ( $this->items as $link ) {1661 $link = sanitize_bookmark( $link );1662 $link->link_name = esc_attr( $link->link_name );1663 $link->link_category = wp_get_link_cats( $link->link_id );1664 1665 $short_url = str_replace( 'http://', '', $link->link_url );1666 $short_url = preg_replace( '/^www\./i', '', $short_url );1667 if ( '/' == substr( $short_url, -1 ) )1668 $short_url = substr( $short_url, 0, -1 );1669 if ( strlen( $short_url ) > 35 )1670 $short_url = substr( $short_url, 0, 32 ).'...';1671 1672 $visible = ( $link->link_visible == 'Y' ) ? __( 'Yes' ) : __( 'No' );1673 $rating = $link->link_rating;1674 $style = ( $alt++ % 2 ) ? '' : ' class="alternate"';1675 1676 $edit_link = get_edit_bookmark_link( $link );1677 ?>1678 <tr id="link-<?php echo $link->link_id; ?>" valign="middle" <?php echo $style; ?>>1679 <?php1680 1681 list( $columns, $hidden ) = $this->get_column_info();1682 1683 foreach ( $columns as $column_name => $column_display_name ) {1684 $class = "class='column-$column_name'";1685 1686 $style = '';1687 if ( in_array( $column_name, $hidden ) )1688 $style = ' style="display:none;"';1689 1690 $attributes = $class . $style;1691 1692 switch ( $column_name ) {1693 case 'cb':1694 echo '<th scope="row" class="check-column"><input type="checkbox" name="linkcheck[]" value="'. esc_attr( $link->link_id ) .'" /></th>';1695 break;1696 1697 case 'name':1698 echo "<td $attributes><strong><a class='row-title' href='$edit_link' title='" . esc_attr( sprintf( __( 'Edit “%s”' ), $link->link_name ) ) . "'>$link->link_name</a></strong><br />";1699 1700 $actions = array();1701 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';1702 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "link.php?action=delete&link_id=$link->link_id", 'delete-bookmark_' . $link->link_id ) . "' onclick=\"if ( confirm( '" . esc_js( sprintf( __( "You are about to delete this link '%s'\n 'Cancel' to stop, 'OK' to delete." ), $link->link_name ) ) . "' ) ) { return true;}return false;\">" . __( 'Delete' ) . "</a>";1703 echo $this->row_actions( $actions );1704 1705 echo '</td>';1706 break;1707 case 'url':1708 echo "<td $attributes><a href='$link->link_url' title='".sprintf( __( 'Visit %s' ), $link->link_name )."'>$short_url</a></td>";1709 break;1710 case 'categories':1711 ?><td <?php echo $attributes ?>><?php1712 $cat_names = array();1713 foreach ( $link->link_category as $category ) {1714 $cat = get_term( $category, 'link_category', OBJECT, 'display' );1715 if ( is_wp_error( $cat ) )1716 echo $cat->get_error_message();1717 $cat_name = $cat->name;1718 if ( $cat_id != $category )1719 $cat_name = "<a href='link-manager.php?cat_id=$category'>$cat_name</a>";1720 $cat_names[] = $cat_name;1721 }1722 echo implode( ', ', $cat_names );1723 ?></td><?php1724 break;1725 case 'rel':1726 ?><td <?php echo $attributes ?>><?php echo empty( $link->link_rel ) ? '<br />' : $link->link_rel; ?></td><?php1727 break;1728 case 'visible':1729 ?><td <?php echo $attributes ?>><?php echo $visible; ?></td><?php1730 break;1731 case 'rating':1732 ?><td <?php echo $attributes ?>><?php echo $rating; ?></td><?php1733 break;1734 default:1735 ?>1736 <td <?php echo $attributes ?>><?php do_action( 'manage_link_custom_column', $column_name, $link->link_id ); ?></td>1737 <?php1738 break;1739 }1740 }1741 ?>1742 </tr>1743 <?php1744 }1745 }1746 }1747 11 1748 12 class WP_Sites_Table extends WP_List_Table { … … 2034 298 } 2035 299 2036 class WP_MS_Users_Table extends WP_List_Table {2037 2038 function WP_MS_Users_Table() {2039 parent::WP_List_Table( array(2040 'screen' => 'users-network',2041 ) );2042 }2043 2044 function check_permissions() {2045 if ( !is_multisite() )2046 wp_die( __( 'Multisite support is not enabled.' ) );2047 2048 if ( ! current_user_can( 'manage_network_users' ) )2049 wp_die( __( 'You do not have permission to access this page.' ) );2050 }2051 2052 function prepare_items() {2053 global $usersearch;2054 2055 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';2056 2057 $users_per_page = $this->get_items_per_page( 'users_network_per_page' );2058 2059 $paged = $this->get_pagenum();2060 2061 $args = array(2062 'number' => $users_per_page,2063 'offset' => ( $paged-1 ) * $users_per_page,2064 'search' => $usersearch,2065 'blog_id' => 02066 );2067 2068 if ( isset( $_REQUEST['orderby'] ) )2069 $args['orderby'] = $_REQUEST['orderby'];2070 2071 if ( isset( $_REQUEST['order'] ) )2072 $args['order'] = $_REQUEST['order'];2073 2074 // Query the user IDs for this page2075 $wp_user_search = new WP_User_Query( $args );2076 2077 $this->items = $wp_user_search->get_results();2078 2079 $this->set_pagination_args( array(2080 'total_items' => $wp_user_search->get_total(),2081 'per_page' => $users_per_page,2082 ) );2083 }2084 2085 function get_bulk_actions() {2086 $actions = array();2087 $actions['delete'] = __( 'Delete' );2088 $actions['spam'] = _x( 'Mark as Spam', 'user' );2089 $actions['notspam'] = _x( 'Not Spam', 'user' );2090 2091 return $actions;2092 }2093 2094 function no_items() {2095 _e( 'No users found.' );2096 }2097 2098 function pagination( $which ) {2099 global $mode;2100 2101 parent::pagination ( $which );2102 2103 if ( 'top' == $which )2104 $this->view_switcher( $mode );2105 }2106 2107 function get_columns() {2108 $users_columns = array(2109 'cb' => '<input type="checkbox" />',2110 'login' => __( 'Login' ),2111 'name' => __( 'Name' ),2112 'email' => __( 'E-mail' ),2113 'registered' => _x( 'Registered', 'user' ),2114 'blogs' => __( 'Sites' )2115 );2116 $users_columns = apply_filters( 'wpmu_users_columns', $users_columns );2117 2118 return $users_columns;2119 }2120 2121 function get_sortable_columns() {2122 return array(2123 'id' => 'id',2124 'login' => 'login',2125 'name' => 'name',2126 'email' => 'email',2127 'registered' => 'registered',2128 );2129 }2130 2131 function display_rows() {2132 global $current_site, $mode;2133 2134 $class = '';2135 $super_admins = get_super_admins();2136 foreach ( $this->items as $user ) {2137 $class = ( 'alternate' == $class ) ? '' : 'alternate';2138 2139 $status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' );2140 2141 foreach ( $status_list as $status => $col ) {2142 if ( $user->$status )2143 $class = $col;2144 }2145 2146 ?>2147 <tr class="<?php echo $class; ?>">2148 <?php2149 2150 list( $columns, $hidden ) = $this->get_column_info();2151 2152 foreach ( $columns as $column_name => $column_display_name ) :2153 switch ( $column_name ) {2154 case 'cb': ?>2155 <th scope="row" class="check-column">2156 <input type="checkbox" id="blog_<?php echo $user->ID ?>" name="allusers[]" value="<?php echo esc_attr( $user->ID ) ?>" />2157 </th>2158 <?php2159 break;2160 2161 case 'id': ?>2162 <th valign="top" scope="row">2163 <?php echo $user->ID ?>2164 </th>2165 <?php2166 break;2167 2168 case 'login':2169 $avatar = get_avatar( $user->user_email, 32 );2170 $edit_link = ( get_current_user_id() == $user->ID ) ? 'profile.php' : 'user-edit.php?user_id=' . $user->ID;2171 ?>2172 <td class="username column-username">2173 <?php echo $avatar; ?><strong><a href="<?php echo esc_url( self_admin_url( $edit_link ) ); ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a><?php2174 if ( in_array( $user->user_login, $super_admins ) )2175 echo ' - ' . __( 'Super admin' );2176 ?></strong>2177 <br/>2178 <?php2179 $actions = array();2180 $actions['edit'] = '<a href="' . esc_url( self_admin_url( $edit_link ) ) . '">' . __( 'Edit' ) . '</a>';2181 2182 if ( ! in_array( $user->user_login, $super_admins ) ) {2183 $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deleteuser' ) . '&action=deleteuser&id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';2184 }2185 2186 echo $this->row_actions( $actions );2187 ?>2188 </div>2189 </td>2190 <?php2191 break;2192 2193 case 'name': ?>2194 <td class="name column-name"><?php echo $user->display_name ?></td>2195 <?php2196 break;2197 2198 case 'email': ?>2199 <td class="email column-email"><a href="mailto:<?php echo $user->user_email ?>"><?php echo $user->user_email ?></a></td>2200 <?php2201 break;2202 2203 case 'registered':2204 if ( 'list' == $mode )2205 $date = 'Y/m/d';2206 else2207 $date = 'Y/m/d \<\b\r \/\> g:i:s a';2208 ?>2209 <td><?php echo mysql2date( $date, $user->user_registered ); ?></td>2210 <?php2211 break;2212 2213 case 'blogs':2214 $blogs = get_blogs_of_user( $user->ID, true );2215 ?>2216 <td>2217 <?php2218 if ( is_array( $blogs ) ) {2219 foreach ( (array) $blogs as $key => $val ) {2220 $path = ( $val->path == '/' ) ? '' : $val->path;2221 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . str_replace( '.' . $current_site->domain, '', $val->domain . $path ) . '</a>';2222 echo ' <small class="row-actions">';2223 2224 // Edit2225 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . __( 'Edit' ) . '</a> | ';2226 2227 // View2228 echo '<a ';2229 if ( get_blog_status( $val->userblog_id, 'spam' ) == 1 )2230 echo 'style="background-color: #faa" ';2231 echo 'href="' . esc_url( get_home_url( $val->userblog_id ) ) . '">' . __( 'View' ) . '</a>';2232 2233 echo '</small><br />';2234 }2235 }2236 ?>2237 </td>2238 <?php2239 break;2240 2241 default: ?>2242 <td><?php do_action( 'manage_users_custom_column', $column_name, $user->ID ); ?></td>2243 <?php2244 break;2245 }2246 endforeach2247 ?>2248 </tr>2249 <?php2250 }2251 }2252 }2253 2254 class WP_Plugins_Table extends WP_List_Table {2255 2256 function WP_Plugins_Table() {2257 global $status, $page;2258 2259 $default_status = get_user_option( 'plugins_last_view' );2260 if ( empty( $default_status ) )2261 $default_status = 'all';2262 $status = isset( $_REQUEST['plugin_status'] ) ? $_REQUEST['plugin_status'] : $default_status;2263 if ( !in_array( $status, array( 'all', 'active', 'inactive', 'recently_activated', 'upgrade', 'network', 'mustuse', 'dropins', 'search' ) ) )2264 $status = 'all';2265 if ( $status != $default_status && 'search' != $status )2266 update_user_meta( get_current_user_id(), 'plugins_last_view', $status );2267 2268 $page = $this->get_pagenum();2269 2270 parent::WP_List_Table( array(2271 'screen' => 'plugins',2272 'plural' => 'plugins',2273 ) );2274 }2275 2276 function check_permissions() {2277 if ( is_multisite() ) {2278 $menu_perms = get_site_option( 'menu_items', array() );2279 2280 if ( empty( $menu_perms['plugins'] ) ) {2281 if ( !is_super_admin() )2282 wp_die( __( 'Cheatin’ uh?' ) );2283 }2284 }2285 2286 if ( !current_user_can('activate_plugins') )2287 wp_die( __( 'You do not have sufficient permissions to manage plugins for this site.' ) );2288 }2289 2290 function prepare_items() {2291 global $status, $plugins, $totals, $page, $orderby, $order, $s;2292 2293 wp_reset_vars( array( 'orderby', 'order', 's' ) );2294 2295 $plugins = array(2296 'all' => apply_filters( 'all_plugins', get_plugins() ),2297 'search' => array(),2298 'active' => array(),2299 'inactive' => array(),2300 'recently_activated' => array(),2301 'upgrade' => array(),2302 'mustuse' => array(),2303 'dropins' => array()2304 );2305 2306 if ( ! is_multisite() || ( is_network_admin() && current_user_can('manage_network_plugins') ) ) {2307 if ( apply_filters( 'show_advanced_plugins', true, 'mustuse' ) )2308 $plugins['mustuse'] = get_mu_plugins();2309 if ( apply_filters( 'show_advanced_plugins', true, 'dropins' ) )2310 $plugins['dropins'] = get_dropins();2311 }2312 2313 set_transient( 'plugin_slugs', array_keys( $plugins['all'] ), 86400 );2314 2315 $recently_activated = get_option( 'recently_activated', array() );2316 2317 $one_week = 7*24*60*60;2318 foreach ( $recently_activated as $key => $time )2319 if ( $time + $one_week < time() )2320 unset( $recently_activated[$key] );2321 update_option( 'recently_activated', $recently_activated );2322 2323 $current = get_site_transient( 'update_plugins' );2324 2325 foreach ( array( 'all', 'mustuse', 'dropins' ) as $type ) {2326 foreach ( (array) $plugins[$type] as $plugin_file => $plugin_data ) {2327 // Translate, Apply Markup, Sanitize HTML2328 $plugins[$type][$plugin_file] = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, false, true );2329 }2330 }2331 2332 foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) {2333 // Filter into individual sections2334 if ( is_plugin_active_for_network($plugin_file) && !is_network_admin() ) {2335 unset( $plugins['all'][ $plugin_file ] );2336 continue;2337 } elseif ( is_multisite() && is_network_only_plugin( $plugin_file ) && !current_user_can( 'manage_network_plugins' ) ) {2338 $plugins['network'][ $plugin_file ] = $plugin_data;2339 } elseif ( ( !is_network_admin() && is_plugin_active( $plugin_file ) )2340 || ( is_network_admin() && is_plugin_active_for_network( $plugin_file ) ) ) {2341 $plugins['active'][ $plugin_file ] = $plugin_data;2342 } else {2343 if ( !is_network_admin() && isset( $recently_activated[ $plugin_file ] ) ) // Was the plugin recently activated?2344 $plugins['recently_activated'][ $plugin_file ] = $plugin_data;2345 $plugins['inactive'][ $plugin_file ] = $plugin_data;2346 }2347 2348 if ( isset( $current->response[ $plugin_file ] ) )2349 $plugins['upgrade'][ $plugin_file ] = $plugin_data;2350 }2351 2352 if ( !current_user_can( 'update_plugins' ) )2353 $plugins['upgrade'] = array();2354 2355 if ( $s ) {2356 $status = 'search';2357 $plugins['search'] = array_filter( $plugins['all'], array( $this, '_search_callback' ) );2358 }2359 2360 $totals = array();2361 foreach ( $plugins as $type => $list )2362 $totals[ $type ] = count( $list );2363 2364 if ( empty( $plugins[ $status ] ) && !in_array( $status, array( 'all', 'search' ) ) )2365 $status = 'all';2366 2367 $this->items = $plugins[ $status ];2368 $total_this_page = $totals[ $status ];2369 2370 if ( $orderby ) {2371 $orderby = ucfirst( $orderby );2372 $order = strtoupper( $order );2373 2374 uasort( $this->items, array( $this, '_order_callback' ) );2375 }2376 2377 $plugins_per_page = $this->get_items_per_page( 'plugins_per_page', 999 );2378 2379 $start = ( $page - 1 ) * $plugins_per_page;2380 2381 if ( $total_this_page > $plugins_per_page )2382 $this->items = array_slice( $this->items, $start, $plugins_per_page );2383 2384 $this->set_pagination_args( array(2385 'total_items' => $total_this_page,2386 'per_page' => $plugins_per_page,2387 ) );2388 }2389 2390 function _search_callback( $plugin ) {2391 static $term;2392 if ( is_null( $term ) )2393 $term = stripslashes( $_REQUEST['s'] );2394 2395 foreach ( $plugin as $value )2396 if ( stripos( $value, $term ) !== false )2397 return true;2398 2399 return false;2400 }2401 2402 function _order_callback( $plugin_a, $plugin_b ) {2403 global $orderby, $order;2404 2405 $a = $plugin_a[$orderby];2406 $b = $plugin_b[$orderby];2407 2408 if ( $a == $b )2409 return 0;2410 2411 if ( 'DESC' == $order )2412 return ( $a < $b ) ? 1 : -1;2413 else2414 return ( $a < $b ) ? -1 : 1;2415 }2416 2417 function no_items() {2418 global $plugins;2419 2420 if ( !empty( $plugins['all'] ) )2421 _e( 'No plugins found.' );2422 else2423 _e( 'You do not appear to have any plugins available at this time.' );2424 }2425 2426 function get_columns() {2427 global $status;2428 2429 return array(2430 'cb' => !in_array( $status, array( 'mustuse', 'dropins' ) ) ? '<input type="checkbox" />' : '',2431 'name' => __( 'Plugin' ),2432 'description' => __( 'Description' ),2433 );2434 }2435 2436 function get_sortable_columns() {2437 return array(2438 'name' => 'name',2439 'description' => 'description',2440 );2441 }2442 2443 function display_tablenav( $which ) {2444 global $status;2445 2446 if ( !in_array( $status, array( 'mustuse', 'dropins' ) ) )2447 parent::display_tablenav( $which );2448 }2449 2450 function get_views() {2451 global $totals, $status;2452 2453 $status_links = array();2454 foreach ( $totals as $type => $count ) {2455 if ( !$count )2456 continue;2457 2458 switch ( $type ) {2459 case 'all':2460 $text = _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $count, 'plugins' );2461 break;2462 case 'active':2463 $text = _n( 'Active <span class="count">(%s)</span>', 'Active <span class="count">(%s)</span>', $count );2464 break;2465 case 'recently_activated':2466 $text = _n( 'Recently Active <span class="count">(%s)</span>', 'Recently Active <span class="count">(%s)</span>', $count );2467 break;2468 case 'inactive':2469 $text = _n( 'Inactive <span class="count">(%s)</span>', 'Inactive <span class="count">(%s)</span>', $count );2470 break;2471 case 'network':2472 $text = _n( 'Network <span class="count">(%s)</span>', 'Network <span class="count">(%s)</span>', $count );2473 break;2474 case 'mustuse':2475 $text = _n( 'Must-Use <span class="count">(%s)</span>', 'Must-Use <span class="count">(%s)</span>', $count );2476 break;2477 case 'dropins':2478 $text = _n( 'Drop-ins <span class="count">(%s)</span>', 'Drop-ins <span class="count">(%s)</span>', $count );2479 break;2480 case 'upgrade':2481 $text = _n( 'Upgrade Available <span class="count">(%s)</span>', 'Upgrade Available <span class="count">(%s)</span>', $count );2482 break;2483 case 'search':2484 $text = _n( 'Search Results <span class="count">(%s)</span>', 'Search Results <span class="count">(%s)</span>', $count );2485 break;2486 }2487 2488 $status_links[$type] = sprintf( "<li><a href='%s' %s>%s</a>",2489 add_query_arg('plugin_status', $type, 'plugins.php'),2490 ( $type == $status ) ? ' class="current"' : '',2491 sprintf( $text, number_format_i18n( $count ) )2492 );2493 }2494 2495 return $status_links;2496 }2497 2498 function get_bulk_actions() {2499 global $status;2500 2501 $actions = array();2502 if ( 'active' != $status )2503 $actions['activate-selected'] = __( 'Activate' );2504 if ( is_multisite() && 'network' != $status )2505 $actions['network-activate-selected'] = __( 'Network Activate' );2506 if ( 'inactive' != $status && 'recent' != $status )2507 $actions['deactivate-selected'] = __( 'Deactivate' );2508 if ( current_user_can( 'update_plugins' ) )2509 $actions['update-selected'] = __( 'Update' );2510 if ( current_user_can( 'delete_plugins' ) && ( 'active' != $status ) )2511 $actions['delete-selected'] = __( 'Delete' );2512 2513 return $actions;2514 }2515 2516 function bulk_actions( $which ) {2517 global $status;2518 2519 if ( in_array( $status, array( 'mustuse', 'dropins' ) ) )2520 return;2521 2522 parent::bulk_actions( $which );2523 }2524 2525 function extra_tablenav( $which ) {2526 global $status;2527 2528 if ( 'recently_activated' == $status ) { ?>2529 <div class="alignleft actions">2530 <input type="submit" name="clear-recent-list" value="<?php esc_attr_e( 'Clear List' ) ?>" class="button-secondary" />2531 </div>2532 <?php }2533 }2534 2535 function current_action() {2536 if ( isset($_POST['clear-recent-list']) )2537 return 'clear-recent-list';2538 2539 return parent::current_action();2540 }2541 2542 function display_rows() {2543 global $status, $page, $s;2544 2545 $context = $status;2546 2547 foreach ( $this->items as $plugin_file => $plugin_data ) {2548 // preorder2549 $actions = array(2550 'network_deactivate' => '', 'deactivate' => '',2551 'network_only' => '', 'activate' => '',2552 'network_activate' => '',2553 'edit' => '',2554 'delete' => '',2555 );2556 2557 if ( 'mustuse' == $context ) {2558 if ( is_multisite() && !is_network_admin() )2559 continue;2560 $is_active = true;2561 } elseif ( 'dropins' == $context ) {2562 if ( is_multisite() && !is_network_admin() )2563 continue;2564 $dropins = _get_dropins();2565 $plugin_name = $plugin_file;2566 if ( $plugin_file != $plugin_data['Name'] )2567 $plugin_name .= '<br/>' . $plugin_data['Name'];2568 if ( true === ( $dropins[ $plugin_file ][1] ) ) { // Doesn't require a constant2569 $is_active = true;2570 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';2571 } elseif ( constant( $dropins[ $plugin_file ][1] ) ) { // Constant is true2572 $is_active = true;2573 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';2574 } else {2575 $is_active = false;2576 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . ' <span class="attention">' . __('Inactive:') . '</span></strong> ' . sprintf( __( 'Requires <code>%s</code> in <code>wp-config.php</code>.' ), "define('" . $dropins[ $plugin_file ][1] . "', true);" ) . '</p>';2577 }2578 if ( $plugin_data['Description'] )2579 $description .= '<p>' . $plugin_data['Description'] . '</p>';2580 } else {2581 $is_active_for_network = is_plugin_active_for_network($plugin_file);2582 if ( is_network_admin() )2583 $is_active = $is_active_for_network;2584 else2585 $is_active = is_plugin_active( $plugin_file );2586 2587 if ( $is_active_for_network && !is_super_admin() && !is_network_admin() )2588 continue;2589 2590 if ( is_network_admin() ) {2591 if ( $is_active_for_network ) {2592 if ( current_user_can( 'manage_network_plugins' ) )2593 $actions['network_deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Network Deactivate') . '</a>';2594 } else {2595 if ( current_user_can( 'manage_network_plugins' ) )2596 $actions['network_activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin for all sites in this network') . '" class="edit">' . __('Network Activate') . '</a>';2597 if ( current_user_can('delete_plugins') )2598 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';2599 }2600 } else {2601 if ( $is_active ) {2602 $actions['deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Deactivate') . '</a>';2603 } else {2604 if ( is_network_only_plugin( $plugin_file ) && !is_network_admin() )2605 continue;2606 2607 $actions['activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin') . '" class="edit">' . __('Activate') . '</a>';2608 2609 if ( current_user_can('delete_plugins') )2610 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';2611 } // end if $is_active2612 } // end if is_network_admin()2613 2614 if ( current_user_can('edit_plugins') && is_writable(WP_PLUGIN_DIR . '/' . $plugin_file) )2615 $actions['edit'] = '<a href="plugin-editor.php?file=' . $plugin_file . '" title="' . __('Open this file in the Plugin Editor') . '" class="edit">' . __('Edit') . '</a>';2616 } // end if $context2617 2618 $actions = apply_filters( 'plugin_action_links', array_filter( $actions ), $plugin_file, $plugin_data, $context );2619 $actions = apply_filters( "plugin_action_links_$plugin_file", $actions, $plugin_file, $plugin_data, $context );2620 2621 $class = $is_active ? 'active' : 'inactive';2622 $checkbox = in_array( $status, array( 'mustuse', 'dropins' ) ) ? '' : "<input type='checkbox' name='checked[]' value='" . esc_attr( $plugin_file ) . "' />";2623 if ( 'dropins' != $status ) {2624 $description = '<p>' . $plugin_data['Description'] . '</p>';2625 $plugin_name = $plugin_data['Name'];2626 }2627 2628 $id = sanitize_title( $plugin_name );2629 2630 echo "2631 <tr id='$id' class='$class'>2632 <th scope='row' class='check-column'>$checkbox</th>2633 <td class='plugin-title'><strong>$plugin_name</strong></td>2634 <td class='desc'>$description</td>2635 </tr>2636 <tr class='$class second'>2637 <td></td>2638 <td class='plugin-title'>";2639 2640 echo $this->row_actions( $actions, true );2641 2642 echo "</td>2643 <td class='desc'>";2644 $plugin_meta = array();2645 if ( !empty( $plugin_data['Version'] ) )2646 $plugin_meta[] = sprintf( __( 'Version %s' ), $plugin_data['Version'] );2647 if ( !empty( $plugin_data['Author'] ) ) {2648 $author = $plugin_data['Author'];2649 if ( !empty( $plugin_data['AuthorURI'] ) )2650 $author = '<a href="' . $plugin_data['AuthorURI'] . '" title="' . __( 'Visit author homepage' ) . '">' . $plugin_data['Author'] . '</a>';2651 $plugin_meta[] = sprintf( __( 'By %s' ), $author );2652 }2653 if ( ! empty( $plugin_data['PluginURI'] ) )2654 $plugin_meta[] = '<a href="' . $plugin_data['PluginURI'] . '" title="' . __( 'Visit plugin site' ) . '">' . __( 'Visit plugin site' ) . '</a>';2655 2656 $plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status );2657 echo implode( ' | ', $plugin_meta );2658 echo "</td>2659 </tr>\n";2660 2661 do_action( 'after_plugin_row', $plugin_file, $plugin_data, $status );2662 do_action( "after_plugin_row_$plugin_file", $plugin_file, $plugin_data, $status );2663 }2664 }2665 }2666 2667 class WP_Plugin_Install_Table extends WP_List_Table {2668 2669 function WP_Plugin_Install_Table() {2670 parent::WP_List_Table( array(2671 'screen' => 'plugin-install',2672 ) );2673 }2674 2675 function check_permissions() {2676 if ( ! current_user_can('install_plugins') )2677 wp_die(__('You do not have sufficient permissions to install plugins on this site.'));2678 }2679 2680 function prepare_items() {2681 include( ABSPATH . 'wp-admin/includes/plugin-install.php' );2682 2683 global $tabs, $tab, $paged, $type, $term;2684 2685 wp_reset_vars( array( 'tab' ) );2686 2687 $paged = $this->get_pagenum();2688 2689 $per_page = 30;2690 2691 // These are the tabs which are shown on the page2692 $tabs = array();2693 $tabs['dashboard'] = __( 'Search' );2694 if ( 'search' == $tab )2695 $tabs['search'] = __( 'Search Results' );2696 $tabs['upload'] = __( 'Upload' );2697 $tabs['featured'] = _x( 'Featured','Plugin Installer' );2698 $tabs['popular'] = _x( 'Popular','Plugin Installer' );2699 $tabs['new'] = _x( 'Newest','Plugin Installer' );2700 $tabs['updated'] = _x( 'Recently Updated','Plugin Installer' );2701 2702 $nonmenu_tabs = array( 'plugin-information' ); //Valid actions to perform which do not have a Menu item.2703 2704 $tabs = apply_filters( 'install_plugins_tabs', $tabs );2705 $nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs );2706 2707 // If a non-valid menu tab has been selected, And its not a non-menu action.2708 if ( empty( $tab ) || ( !isset( $tabs[ $tab ] ) && !in_array( $tab, (array) $nonmenu_tabs ) ) )2709 $tab = key( $tabs );2710 2711 $args = array( 'page' => $paged, 'per_page' => $per_page );2712 2713 switch ( $tab ) {2714 case 'search':2715 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : '';2716 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '';2717 2718 switch ( $type ) {2719 case 'tag':2720 $args['tag'] = sanitize_title_with_dashes( $term );2721 break;2722 case 'term':2723 $args['search'] = $term;2724 break;2725 case 'author':2726 $args['author'] = $term;2727 break;2728 }2729 2730 add_action( 'install_plugins_table_header', 'install_search_form' );2731 break;2732 2733 case 'featured':2734 case 'popular':2735 case 'new':2736 case 'updated':2737 $args['browse'] = $tab;2738 break;2739 2740 default:2741 $args = false;2742 }2743 2744 if ( !$args )2745 return;2746 2747 $api = plugins_api( 'query_plugins', $args );2748 2749 if ( is_wp_error( $api ) )2750 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' );2751 2752 $this->items = $api->plugins;2753 2754 $this->set_pagination_args( array(2755 'total_items' => $api->info['results'],2756 'per_page' => $per_page,2757 ) );2758 }2759 2760 function no_items() {2761 _e( 'No plugins match your request.' );2762 }2763 2764 function get_views() {2765 global $tabs, $tab;2766 2767 $display_tabs = array();2768 foreach ( (array) $tabs as $action => $text ) {2769 $class = ( $action == $tab ) ? ' class="current"' : '';2770 $href = admin_url('plugin-install.php?tab=' . $action);2771 $display_tabs[$action] = "<a href='$href'$class>$text</a>";2772 }2773 2774 return $display_tabs;2775 }2776 2777 function display_tablenav( $which ) {2778 if ( 'top' == $which ) { ?>2779 <div class="tablenav">2780 <div class="alignleft actions">2781 <?php do_action( 'install_plugins_table_header' ); ?>2782 </div>2783 <?php $this->pagination( $which ); ?>2784 <br class="clear" />2785 </div>2786 <?php } else { ?>2787 <div class="tablenav">2788 <?php $this->pagination( $which ); ?>2789 <br class="clear" />2790 </div>2791 <?php2792 }2793 }2794 2795 function get_table_classes() {2796 extract( $this->_args );2797 2798 return array( 'widefat', $plural );2799 }2800 2801 function get_columns() {2802 return array(2803 'name' => __( 'Name' ),2804 'version' => __( 'Version' ),2805 'rating' => __( 'Rating' ),2806 'description' => __( 'Description' ),2807 );2808 }2809 2810 function display_rows() {2811 $plugins_allowedtags = array(2812 'a' => array( 'href' => array(),'title' => array(), 'target' => array() ),2813 'abbr' => array( 'title' => array() ),'acronym' => array( 'title' => array() ),2814 'code' => array(), 'pre' => array(), 'em' => array(),'strong' => array(),2815 'ul' => array(), 'ol' => array(), 'li' => array(), 'p' => array(), 'br' => array()2816 );2817 2818 foreach ( (array) $this->items as $plugin ) {2819 if ( is_object( $plugin ) )2820 $plugin = (array) $plugin;2821 2822 $title = wp_kses( $plugin['name'], $plugins_allowedtags );2823 //Limit description to 400char, and remove any HTML.2824 $description = strip_tags( $plugin['description'] );2825 if ( strlen( $description ) > 400 )2826 $description = mb_substr( $description, 0, 400 ) . '…';2827 //remove any trailing entities2828 $description = preg_replace( '/&[^;\s]{0,6}$/', '', $description );2829 //strip leading/trailing & multiple consecutive lines2830 $description = trim( $description );2831 $description = preg_replace( "|(\r?\n)+|", "\n", $description );2832 //\n => <br>2833 $description = nl2br( $description );2834 $version = wp_kses( $plugin['version'], $plugins_allowedtags );2835 2836 $name = strip_tags( $title . ' ' . $version );2837 2838 $author = $plugin['author'];2839 if ( ! empty( $plugin['author'] ) )2840 $author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '.</cite>';2841 2842 $author = wp_kses( $author, $plugins_allowedtags );2843 2844 $action_links = array();2845 $action_links[] = '<a href="' . admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin['slug'] .2846 '&TB_iframe=true&width=600&height=550' ) . '" class="thickbox" title="' .2847 esc_attr( sprintf( __( 'More information about %s' ), $name ) ) . '">' . __( 'Details' ) . '</a>';2848 2849 if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) {2850 $status = install_plugin_install_status( $plugin );2851 2852 switch ( $status['status'] ) {2853 case 'install':2854 if ( $status['url'] )2855 $action_links[] = '<a class="install-now" href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Install %s' ), $name ) ) . '">' . __( 'Install Now' ) . '</a>';2856 break;2857 case 'update_available':2858 if ( $status['url'] )2859 $action_links[] = '<a href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Update to version %s' ), $status['version'] ) ) . '">' . sprintf( __( 'Update Now' ), $status['version'] ) . '</a>';2860 break;2861 case 'latest_installed':2862 case 'newer_installed':2863 $action_links[] = '<span title="' . esc_attr__( 'This plugin is already installed and is up to date' ) . ' ">' . __( 'Installed' ) . '</span>';2864 break;2865 }2866 }2867 2868 $action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin );2869 ?>2870 <tr>2871 <td class="name"><strong><?php echo $title; ?></strong>2872 <div class="action-links"><?php if ( !empty( $action_links ) ) echo implode( ' | ', $action_links ); ?></div>2873 </td>2874 <td class="vers"><?php echo $version; ?></td>2875 <td class="vers">2876 <div class="star-holder" title="<?php printf( _n( '( based on %s rating )', '( based on %s ratings )', $plugin['num_ratings'] ), number_format_i18n( $plugin['num_ratings'] ) ) ?>">2877 <div class="star star-rating" style="width: <?php echo esc_attr( $plugin['rating'] ) ?>px"></div>2878 <div class="star star5"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '5 stars' ) ?>" /></div>2879 <div class="star star4"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '4 stars' ) ?>" /></div>2880 <div class="star star3"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '3 stars' ) ?>" /></div>2881 <div class="star star2"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '2 stars' ) ?>" /></div>2882 <div class="star star1"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '1 star' ) ?>" /></div>2883 </div>2884 </td>2885 <td class="desc"><?php echo $description, $author; ?></td>2886 </tr>2887 <?php2888 }2889 }2890 }2891 2892 class WP_Themes_Table extends WP_List_Table {2893 2894 var $search = array();2895 var $features = array();2896 2897 function WP_Themes_Table() {2898 parent::__construct( array(2899 'screen' => 'themes',2900 ) );2901 }2902 2903 function check_permissions() {2904 if ( !current_user_can('switch_themes') && !current_user_can('edit_theme_options') )2905 wp_die( __( 'Cheatin’ uh?' ) );2906 }2907 2908 function prepare_items() {2909 global $ct;2910 2911 $ct = current_theme_info();2912 2913 $themes = get_allowed_themes();2914 2915 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';2916 2917 if ( '' !== $search ) {2918 $this->search = array_merge( $this->search, array_filter( array_map( 'trim', explode( ',', $search ) ) ) );2919 $this->search = array_unique( $this->search );2920 }2921 2922 if ( !empty( $_REQUEST['features'] ) ) {2923 $this->features = $_REQUEST['features'];2924 $this->features = array_map( 'trim', $this->features );2925 $this->features = array_map( 'sanitize_title_with_dashes', $this->features );2926 $this->features = array_unique( $this->features );2927 }2928 2929 if ( $this->search || $this->features ) {2930 foreach ( $themes as $key => $theme ) {2931 if ( !$this->search_theme( $theme ) )2932 unset( $themes[ $key ] );2933 }2934 }2935 2936 unset( $themes[$ct->name] );2937 uksort( $themes, "strnatcasecmp" );2938 2939 $per_page = 15;2940 $page = $this->get_pagenum();2941 2942 $start = ( $page - 1 ) * $per_page;2943 2944 $this->items = array_slice( $themes, $start, $per_page );2945 2946 $this->set_pagination_args( array(2947 'query_var' => 'pagenum',2948 'total_items' => count( $themes ),2949 'per_page' => $per_page,2950 ) );2951 }2952 2953 function no_items() {2954 if ( current_user_can( 'install_themes' ) )2955 printf( __( 'You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress.org Theme Directory at any time: just click on the <em><a href="%s">Install Themes</a></em> tab above.' ), 'theme-install.php' );2956 else2957 printf( __( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ), get_site_option( 'site_name' ) );2958 }2959 2960 function display_table() {2961 300 ?> 2962 <div class="tablenav"> 2963 <?php $this->pagination( 'top' ); ?> 2964 <br class="clear" /> 2965 </div> 2966 2967 <table id="availablethemes" cellspacing="0" cellpadding="0"> 2968 <tbody id="the-list" class="list:themes"> 2969 <?php $this->display_rows(); ?> 2970 </tbody> 2971 </table> 2972 2973 <div class="tablenav"> 2974 <?php $this->pagination( 'bottom' ); ?> 2975 <br class="clear" /> 2976 </div> 2977 <?php 2978 } 2979 2980 function get_columns() { 2981 return array(); 2982 } 2983 2984 function display_rows() { 2985 $themes = $this->items; 2986 $theme_names = array_keys( $themes ); 2987 natcasesort( $theme_names ); 2988 2989 $table = array(); 2990 $rows = ceil( count( $theme_names ) / 3 ); 2991 for ( $row = 1; $row <= $rows; $row++ ) 2992 for ( $col = 1; $col <= 3; $col++ ) 2993 $table[$row][$col] = array_shift( $theme_names ); 2994 2995 foreach ( $table as $row => $cols ) { 2996 ?> 2997 <tr> 2998 <?php 2999 foreach ( $cols as $col => $theme_name ) { 3000 $class = array( 'available-theme' ); 3001 if ( $row == 1 ) $class[] = 'top'; 3002 if ( $col == 1 ) $class[] = 'left'; 3003 if ( $row == $rows ) $class[] = 'bottom'; 3004 if ( $col == 3 ) $class[] = 'right'; 3005 ?> 3006 <td class="<?php echo join( ' ', $class ); ?>"> 3007 <?php if ( !empty( $theme_name ) ) : 3008 $template = $themes[$theme_name]['Template']; 3009 $stylesheet = $themes[$theme_name]['Stylesheet']; 3010 $title = $themes[$theme_name]['Title']; 3011 $version = $themes[$theme_name]['Version']; 3012 $description = $themes[$theme_name]['Description']; 3013 $author = $themes[$theme_name]['Author']; 3014 $screenshot = $themes[$theme_name]['Screenshot']; 3015 $stylesheet_dir = $themes[$theme_name]['Stylesheet Dir']; 3016 $template_dir = $themes[$theme_name]['Template Dir']; 3017 $parent_theme = $themes[$theme_name]['Parent Theme']; 3018 $theme_root = $themes[$theme_name]['Theme Root']; 3019 $theme_root_uri = $themes[$theme_name]['Theme Root URI']; 3020 $preview_link = esc_url( get_option( 'home' ) . '/' ); 3021 if ( is_ssl() ) 3022 $preview_link = str_replace( 'http://', 'https://', $preview_link ); 3023 $preview_link = htmlspecialchars( add_query_arg( array( 'preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'TB_iframe' => 'true' ), $preview_link ) ); 3024 $preview_text = esc_attr( sprintf( __( 'Preview of “%s”' ), $title ) ); 3025 $tags = $themes[$theme_name]['Tags']; 3026 $thickbox_class = 'thickbox thickbox-preview'; 3027 $activate_link = wp_nonce_url( "themes.php?action=activate&template=".urlencode( $template )."&stylesheet=".urlencode( $stylesheet ), 'switch-theme_' . $template ); 3028 $activate_text = esc_attr( sprintf( __( 'Activate “%s”' ), $title ) ); 3029 $actions = array(); 3030 $actions[] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __( 'Activate' ) . '</a>'; 3031 $actions[] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr( sprintf( __( 'Preview “%s”' ), $theme_name ) ) . '">' . __( 'Preview' ) . '</a>'; 3032 if ( current_user_can( 'delete_themes' ) ) 3033 $actions[] = '<a class="submitdelete deletion" href="' . wp_nonce_url( "themes.php?action=delete&template=$stylesheet", 'delete-theme_' . $stylesheet ) . '" onclick="' . "return confirm( '" . esc_js( sprintf( __( "You are about to delete this theme '%s'\n 'Cancel' to stop, 'OK' to delete." ), $theme_name ) ) . "' );" . '">' . __( 'Delete' ) . '</a>'; 3034 $actions = apply_filters( 'theme_action_links', $actions, $themes[$theme_name] ); 3035 3036 $actions = implode ( ' | ', $actions ); 3037 ?> 3038 <a href="<?php echo $preview_link; ?>" class="<?php echo $thickbox_class; ?> screenshot"> 3039 <?php if ( $screenshot ) : ?> 3040 <img src="<?php echo $theme_root_uri . '/' . $stylesheet . '/' . $screenshot; ?>" alt="" /> 3041 <?php endif; ?> 3042 </a> 3043 <h3><?php 3044 /* translators: 1: theme title, 2: theme version, 3: theme author */ 3045 printf( __( '%1$s %2$s by %3$s' ), $title, $version, $author ) ; ?></h3> 3046 <p class="description"><?php echo $description; ?></p> 3047 <span class='action-links'><?php echo $actions ?></span> 3048 <?php if ( current_user_can( 'edit_themes' ) && $parent_theme ) { 3049 /* translators: 1: theme title, 2: template dir, 3: stylesheet_dir, 4: theme title, 5: parent_theme */ ?> 3050 <p><?php printf( __( 'The template files are located in <code>%2$s</code>. The stylesheet files are located in <code>%3$s</code>. <strong>%4$s</strong> uses templates from <strong>%5$s</strong>. Changes made to the templates will affect both themes.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ), $title, $parent_theme ); ?></p> 3051 <?php } else { ?> 3052 <p><?php printf( __( 'All of this theme’s files are located in <code>%2$s</code>.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ) ); ?></p> 3053 <?php } ?> 3054 <?php if ( $tags ) : ?> 3055 <p><?php _e( 'Tags:' ); ?> <?php echo join( ', ', $tags ); ?></p> 3056 <?php endif; ?> 3057 <?php theme_update_available( $themes[$theme_name] ); ?> 3058 <?php endif; // end if not empty theme_name ?> 3059 </td> 3060 <?php } // end foreach $cols ?> 3061 </tr> 3062 <?php } // end foreach $table 3063 } 3064 3065 function search_theme( $theme ) { 3066 $matched = 0; 3067 3068 // Match all phrases 3069 if ( count( $this->search ) > 0 ) { 3070 foreach ( $this->search as $word ) { 3071 $matched = 0; 3072 3073 // In a tag? 3074 if ( in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) ) 3075 $matched = 1; 3076 3077 // In one of the fields? 3078 foreach ( array( 'Name', 'Title', 'Description', 'Author', 'Template', 'Stylesheet' ) AS $field ) { 3079 if ( stripos( $theme[$field], $word ) !== false ) 3080 $matched++; 3081 } 3082 3083 if ( $matched == 0 ) 3084 return false; 3085 } 3086 } 3087 3088 // Now search the features 3089 if ( count( $this->features ) > 0 ) { 3090 foreach ( $this->features as $word ) { 3091 // In a tag? 3092 if ( !in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) ) 3093 return false; 3094 } 3095 } 3096 3097 // Only get here if each word exists in the tags or one of the fields 3098 return true; 3099 } 3100 } 3101 3102 class WP_Theme_Install_Table extends WP_List_Table { 3103 3104 function WP_Theme_Install_Table() { 3105 parent::WP_List_Table( array( 3106 'screen' => 'theme-install', 3107 ) ); 3108 } 3109 3110 function check_permissions() { 3111 if ( ! current_user_can('install_themes') ) 3112 wp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) ); 3113 } 3114 3115 function prepare_items() { 3116 include( ABSPATH . 'wp-admin/includes/theme-install.php' ); 3117 3118 global $tabs, $tab, $paged, $type, $term, $theme_field_defaults; 3119 3120 wp_reset_vars( array( 'tab' ) ); 3121 3122 $paged = $this->get_pagenum(); 3123 3124 $per_page = 30; 3125 3126 // These are the tabs which are shown on the page, 3127 $tabs = array(); 3128 $tabs['dashboard'] = __( 'Search' ); 3129 if ( 'search' == $tab ) 3130 $tabs['search'] = __( 'Search Results' ); 3131 $tabs['upload'] = __( 'Upload' ); 3132 $tabs['featured'] = _x( 'Featured','Theme Installer' ); 3133 //$tabs['popular'] = _x( 'Popular','Theme Installer' ); 3134 $tabs['new'] = _x( 'Newest','Theme Installer' ); 3135 $tabs['updated'] = _x( 'Recently Updated','Theme Installer' ); 3136 3137 $nonmenu_tabs = array( 'theme-information' ); // Valid actions to perform which do not have a Menu item. 3138 3139 $tabs = apply_filters( 'install_themes_tabs', $tabs ); 3140 $nonmenu_tabs = apply_filters( 'install_themes_nonmenu_tabs', $nonmenu_tabs ); 3141 3142 // If a non-valid menu tab has been selected, And its not a non-menu action. 3143 if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs ) ) ) 3144 $tab = key( $tabs ); 3145 3146 $args = array( 'page' => $paged, 'per_page' => $per_page, 'fields' => $theme_field_defaults ); 3147 3148 switch ( $tab ) { 3149 case 'search': 3150 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : ''; 3151 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : ''; 3152 3153 switch ( $type ) { 3154 case 'tag': 3155 $terms = explode( ',', $term ); 3156 $terms = array_map( 'trim', $terms ); 3157 $terms = array_map( 'sanitize_title_with_dashes', $terms ); 3158 $args['tag'] = $terms; 3159 break; 3160 case 'term': 3161 $args['search'] = $term; 3162 break; 3163 case 'author': 3164 $args['author'] = $term; 3165 break; 3166 } 3167 3168 if ( !empty( $_POST['features'] ) ) { 3169 $terms = $_POST['features']; 3170 $terms = array_map( 'trim', $terms ); 3171 $terms = array_map( 'sanitize_title_with_dashes', $terms ); 3172 $args['tag'] = $terms; 3173 $_REQUEST['s'] = implode( ',', $terms ); 3174 $_REQUEST['type'] = 'tag'; 3175 } 3176 3177 add_action( 'install_themes_table_header', 'install_theme_search_form' ); 3178 break; 3179 3180 case 'featured': 3181 //case 'popular': 3182 case 'new': 3183 case 'updated': 3184 $args['browse'] = $tab; 3185 break; 3186 3187 default: 3188 $args = false; 3189 } 3190 3191 if ( !$args ) 3192 return; 3193 3194 $api = themes_api( 'query_themes', $args ); 3195 3196 if ( is_wp_error( $api ) ) 3197 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' ); 3198 3199 $this->items = $api->themes; 3200 3201 $this->set_pagination_args( array( 3202 'total_items' => $api->info['results'], 3203 'per_page' => $per_page, 3204 ) ); 3205 } 3206 3207 function no_items() { 3208 _e( 'No themes match your request.' ); 3209 } 3210 3211 function get_views() { 3212 global $tabs, $tab; 3213 3214 $display_tabs = array(); 3215 foreach ( (array) $tabs as $action => $text ) { 3216 $class = ( $action == $tab ) ? ' class="current"' : ''; 3217 $href = self_admin_url('theme-install.php?tab=' . $action); 3218 $display_tabs[$action] = "<a href='$href'$class>$text</a>"; 3219 } 3220 3221 return $display_tabs; 3222 } 3223 3224 function get_columns() { 3225 return array(); 3226 } 3227 3228 function display_table() { 3229 ?> 3230 <div class="tablenav"> 3231 <div class="alignleft actions"> 3232 <?php do_action( 'install_themes_table_header' ); ?> 3233 </div> 3234 <?php $this->pagination( 'top' ); ?> 3235 <br class="clear" /> 3236 </div> 3237 3238 <table id="availablethemes" cellspacing="0" cellpadding="0"> 3239 <tbody id="the-list" class="list:themes"> 3240 <?php $this->display_rows(); ?> 3241 </tbody> 3242 </table> 3243 3244 <div class="tablenav"> 3245 <?php $this->pagination( 'bottom' ); ?> 3246 <br class="clear" /> 3247 </div> 3248 <?php 3249 } 3250 3251 function display_rows() { 3252 $themes = $this->items; 3253 3254 $rows = ceil( count( $themes ) / 3 ); 3255 $table = array(); 3256 $theme_keys = array_keys( $themes ); 3257 for ( $row = 1; $row <= $rows; $row++ ) 3258 for ( $col = 1; $col <= 3; $col++ ) 3259 $table[$row][$col] = array_shift( $theme_keys ); 3260 3261 foreach ( $table as $row => $cols ) { 3262 echo "\t<tr>\n"; 3263 foreach ( $cols as $col => $theme_index ) { 3264 $class = array( 'available-theme' ); 3265 if ( $row == 1 ) $class[] = 'top'; 3266 if ( $col == 1 ) $class[] = 'left'; 3267 if ( $row == $rows ) $class[] = 'bottom'; 3268 if ( $col == 3 ) $class[] = 'right'; 3269 ?> 3270 <td class="<?php echo join( ' ', $class ); ?>"><?php 3271 if ( isset( $themes[$theme_index] ) ) 3272 display_theme( $themes[$theme_index] ); 3273 ?></td> 3274 <?php } // end foreach $cols 3275 echo "\t</tr>\n"; 3276 } // end foreach $table 3277 } 3278 } 3279 301 -
trunk/wp-admin/includes/list-table-terms.php
r15954 r15955 9 9 * @subpackage Administration 10 10 */ 11 12 class WP_Media_Table extends WP_List_Table {13 14 function WP_Media_Table() {15 global $detached;16 17 $detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );18 19 parent::WP_List_Table( array(20 'screen' => $detached ? 'upload-detached' : 'upload',21 'plural' => 'media'22 ) );23 }24 25 function check_permissions() {26 if ( !current_user_can('upload_files') )27 wp_die( __( 'You do not have permission to upload files.' ) );28 }29 30 function prepare_items() {31 global $lost, $wpdb, $wp_query, $post_mime_types, $avail_post_mime_types;32 33 $q = $_REQUEST;34 35 if ( !empty( $lost ) )36 $q['post__in'] = implode( ',', $lost );37 38 list( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $q );39 40 $this->is_trash = isset( $_REQUEST['status'] ) && 'trash' == $_REQUEST['status'];41 42 $this->set_pagination_args( array(43 'total_items' => $wp_query->found_posts,44 'total_pages' => $wp_query->max_num_pages,45 'per_page' => $wp_query->query_vars['posts_per_page'],46 ) );47 }48 49 function get_views() {50 global $wpdb, $post_mime_types, $detached, $avail_post_mime_types;51 52 $type_links = array();53 $_num_posts = (array) wp_count_attachments();54 $_total_posts = array_sum($_num_posts) - $_num_posts['trash'];55 if ( !isset( $total_orphans ) )56 $total_orphans = $wpdb->get_var( "SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent < 1" );57 $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));58 foreach ( $matches as $type => $reals )59 foreach ( $reals as $real )60 $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];61 62 $class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : '';63 $type_links['all'] = "<li><a href='upload.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $_total_posts, 'uploaded files' ), number_format_i18n( $_total_posts ) ) . '</a>';64 foreach ( $post_mime_types as $mime_type => $label ) {65 $class = '';66 67 if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )68 continue;69 70 if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )71 $class = ' class="current"';72 if ( !empty( $num_posts[$mime_type] ) )73 $type_links[$mime_type] = "<li><a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( _n( $label[2][0], $label[2][1], $num_posts[$mime_type] ), number_format_i18n( $num_posts[$mime_type] )) . '</a>';74 }75 $type_links['detached'] = '<li><a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( _nx( 'Unattached <span class="count">(%s)</span>', 'Unattached <span class="count">(%s)</span>', $total_orphans, 'detached files' ), number_format_i18n( $total_orphans ) ) . '</a>';76 77 if ( !empty($_num_posts['trash']) )78 $type_links['trash'] = '<li><a href="upload.php?status=trash"' . ( (isset($_GET['status']) && $_GET['status'] == 'trash' ) ? ' class="current"' : '') . '>' . sprintf( _nx( 'Trash <span class="count">(%s)</span>', 'Trash <span class="count">(%s)</span>', $_num_posts['trash'], 'uploaded files' ), number_format_i18n( $_num_posts['trash'] ) ) . '</a>';79 80 return $type_links;81 }82 83 function get_bulk_actions() {84 global $detached;85 86 $actions = array();87 $actions['delete'] = __( 'Delete Permanently' );88 if ( $detached )89 $actions['attach'] = __( 'Attach to a post' );90 91 return $actions;92 }93 94 function extra_tablenav( $which ) {95 global $post_type, $detached;96 ?>97 <div class="alignleft actions">98 <?php99 if ( 'top' == $which && !is_singular() && !$detached && !$this->is_trash ) {100 $this->months_dropdown( $post_type );101 102 do_action( 'restrict_manage_posts' );103 ?>104 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />105 <?php106 }107 108 if ( $detached ) { ?>109 <input type="submit" id="find_detached" name="find_detached" value="<?php esc_attr_e( 'Scan for lost attachments' ); ?>" class="button-secondary" />110 <?php } elseif ( $this->is_trash && current_user_can( 'edit_others_posts' ) ) { ?>111 <input type="submit" id="delete_all" name="delete_all" value="<?php esc_attr_e( 'Empty Trash' ); ?>" class="button-secondary apply" />112 <?php } ?>113 </div>114 <?php115 }116 117 function current_action() {118 if ( isset( $_REQUEST['find_detached'] ) )119 return 'find_detached';120 121 if ( isset( $_REQUEST['found_post_id'] ) && isset( $_REQUEST['media'] ) )122 return 'attach';123 124 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )125 return 'delete_all';126 127 return parent::current_action();128 }129 130 function has_items() {131 return have_posts();132 }133 134 function no_items() {135 _e( 'No media attachments found.' );136 }137 138 function get_columns() {139 $posts_columns = array();140 $posts_columns['cb'] = '<input type="checkbox" />';141 $posts_columns['icon'] = '';142 /* translators: column name */143 $posts_columns['title'] = _x( 'File', 'column name' );144 $posts_columns['author'] = __( 'Author' );145 //$posts_columns['tags'] = _x( 'Tags', 'column name' );146 /* translators: column name */147 if ( 'upload' == $this->_screen->id ) {148 $posts_columns['parent'] = _x( 'Attached to', 'column name' );149 $posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="' . esc_url( admin_url( 'images/comment-grey-bubble.png' ) ) . '" /></div>';150 }151 /* translators: column name */152 $posts_columns['date'] = _x( 'Date', 'column name' );153 $posts_columns = apply_filters( 'manage_media_columns', $posts_columns, 'upload' != $this->_screen->id );154 155 return $posts_columns;156 }157 158 function get_sortable_columns() {159 return array(160 'title' => 'title',161 'author' => 'author',162 'parent' => 'parent',163 'comments' => 'comment_count',164 'date' => 'date',165 );166 }167 168 function display_rows() {169 global $detached, $post, $id;170 171 if ( $detached ) {172 $this->display_orphans();173 return;174 }175 176 add_filter( 'the_title','esc_html' );177 $alt = '';178 179 while ( have_posts() ) : the_post();180 181 if ( $this->is_trash && $post->post_status != 'trash'182 || !$this->is_trash && $post->post_status == 'trash' )183 continue;184 185 $alt = ( 'alternate' == $alt ) ? '' : 'alternate';186 $post_owner = ( get_current_user_id() == $post->post_author ) ? 'self' : 'other';187 $att_title = _draft_or_post_title();188 ?>189 <tr id='post-<?php echo $id; ?>' class='<?php echo trim( $alt . ' author-' . $post_owner . ' status-' . $post->post_status ); ?>' valign="top">190 <?php191 192 list( $columns, $hidden ) = $this->get_column_info();193 foreach ( $columns as $column_name => $column_display_name ) {194 $class = "class='$column_name column-$column_name'";195 196 $style = '';197 if ( in_array( $column_name, $hidden ) )198 $style = ' style="display:none;"';199 200 $attributes = $class . $style;201 202 switch ( $column_name ) {203 204 case 'cb':205 ?>206 <th scope="row" class="check-column"><?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?><input type="checkbox" name="media[]" value="<?php the_ID(); ?>" /><?php } ?></th>207 <?php208 break;209 210 case 'icon':211 $attributes = 'class="column-icon media-icon"' . $style;212 ?>213 <td <?php echo $attributes ?>><?php214 if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {215 if ( $this->is_trash ) {216 echo $thumb;217 } else {218 ?>219 <a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>">220 <?php echo $thumb; ?>221 </a>222 223 <?php }224 }225 ?>226 </td>227 <?php228 break;229 230 case 'title':231 ?>232 <td <?php echo $attributes ?>><strong><?php if ( $this->is_trash ) echo $att_title; else { ?><a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php echo $att_title; ?></a><?php } ?></strong>233 <p>234 <?php235 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )236 echo esc_html( strtoupper( $matches[1] ) );237 else238 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );239 ?>240 </p>241 <?php242 $actions = array();243 if ( current_user_can( 'edit_post', $post->ID ) && !$this->is_trash )244 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';245 if ( current_user_can( 'delete_post', $post->ID ) ) {246 if ( $this->is_trash )247 $actions['untrash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=untrash&post=$post->ID", 'untrash-attachment_' . $post->ID ) . "'>" . __( 'Restore' ) . "</a>";248 elseif ( EMPTY_TRASH_DAYS && MEDIA_TRASH )249 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";250 if ( $this->is_trash || !EMPTY_TRASH_DAYS || !MEDIA_TRASH ) {251 $delete_ays = ( !$this->is_trash && !MEDIA_TRASH ) ? " onclick='return showNotice.warn();'" : '';252 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";253 }254 }255 if ( !$this->is_trash ) {256 $title =_draft_or_post_title( $post->post_parent );257 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';258 }259 $actions = apply_filters( 'media_row_actions', $actions, $post );260 echo $this->row_actions( $actions );261 ?>262 </td>263 <?php264 break;265 266 case 'author':267 ?>268 <td <?php echo $attributes ?>><?php the_author() ?></td>269 <?php270 break;271 272 case 'tags':273 ?>274 <td <?php echo $attributes ?>><?php275 $tags = get_the_tags();276 if ( !empty( $tags ) ) {277 $out = array();278 foreach ( $tags as $c )279 $out[] = "<a href='edit.php?tag=$c->slug'> " . esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'post_tag', 'display' ) ) . "</a>";280 echo join( ', ', $out );281 } else {282 _e( 'No Tags' );283 }284 ?>285 </td>286 <?php287 break;288 289 case 'desc':290 ?>291 <td <?php echo $attributes ?>><?php echo has_excerpt() ? $post->post_excerpt : ''; ?></td>292 <?php293 break;294 295 case 'date':296 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {297 $t_time = $h_time = __( 'Unpublished' );298 } else {299 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );300 $m_time = $post->post_date;301 $time = get_post_time( 'G', true, $post, false );302 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {303 if ( $t_diff < 0 )304 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );305 else306 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );307 } else {308 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );309 }310 }311 ?>312 <td <?php echo $attributes ?>><?php echo $h_time ?></td>313 <?php314 break;315 316 case 'parent':317 if ( $post->post_parent > 0 ) {318 if ( get_post( $post->post_parent ) ) {319 $title =_draft_or_post_title( $post->post_parent );320 }321 ?>322 <td <?php echo $attributes ?>>323 <strong><a href="<?php echo get_edit_post_link( $post->post_parent ); ?>"><?php echo $title ?></a></strong>,324 <?php echo get_the_time( __( 'Y/m/d' ) ); ?>325 </td>326 <?php327 } else {328 ?>329 <td <?php echo $attributes ?>><?php _e( '(Unattached)' ); ?><br />330 <a class="hide-if-no-js" onclick="findPosts.open( 'media[]','<?php echo $post->ID ?>' );return false;" href="#the-list"><?php _e( 'Attach' ); ?></a></td>331 <?php332 }333 break;334 335 case 'comments':336 $attributes = 'class="comments column-comments num"' . $style;337 ?>338 <td <?php echo $attributes ?>>339 <div class="post-com-count-wrapper">340 <?php341 $pending_comments = get_pending_comments_num( $post->ID );342 343 $this->comments_bubble( $post->ID, $pending_comments );344 ?>345 </div>346 </td>347 <?php348 break;349 350 case 'actions':351 ?>352 <td <?php echo $attributes ?>>353 <a href="media.php?action=edit&attachment_id=<?php the_ID(); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php _e( 'Edit' ); ?></a> |354 <a href="<?php the_permalink(); ?>"><?php _e( 'Get permalink' ); ?></a>355 </td>356 <?php357 break;358 359 default:360 ?>361 <td <?php echo $attributes ?>>362 <?php do_action( 'manage_media_custom_column', $column_name, $id ); ?>363 </td>364 <?php365 break;366 }367 }368 ?>369 </tr>370 <?php endwhile;371 }372 373 function display_orphans() {374 global $post;375 376 $class = '';377 378 while ( have_posts() ) : the_post();379 380 $class = ( 'alternate' == $class ) ? '' : 'alternate';381 $att_title = esc_html( _draft_or_post_title( $post->ID ) );382 383 $edit_link = '<a href="' . get_edit_post_link( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ) . '">%s</a>';384 ?>385 <tr id='post-<?php echo $post->ID; ?>' class='<?php echo $class; ?>' valign="top">386 <th scope="row" class="check-column">387 <?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?>388 <input type="checkbox" name="media[]" value="<?php echo esc_attr( $post->ID ); ?>" />389 <?php } ?>390 </th>391 392 <td class="media-icon">393 <?php if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {394 printf( $edit_link, $thumb );395 } ?>396 </td>397 398 <td class="media column-media">399 <strong><?php printf( $edit_link, $att_title ); ?></strong><br />400 <?php401 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )402 echo esc_html( strtoupper( $matches[1] ) );403 else404 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );405 ?>406 <?php407 $actions = array();408 if ( current_user_can( 'edit_post', $post->ID ) )409 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';410 if ( current_user_can( 'delete_post', $post->ID ) )411 if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) {412 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";413 } else {414 $delete_ays = !MEDIA_TRASH ? " onclick='return showNotice.warn();'" : '';415 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";416 }417 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $att_title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';418 if ( current_user_can( 'edit_post', $post->ID ) )419 $actions['attach'] = '<a href="#the-list" onclick="findPosts.open( \'media[]\',\''.$post->ID.'\' );return false;" class="hide-if-no-js">'.__( 'Attach' ).'</a>';420 $actions = apply_filters( 'media_row_actions', $actions, $post );421 422 echo $this->row_actions( $actions );423 ?>424 </td>425 <td class="author column-author">426 <?php $author = get_userdata( $post->post_author ); echo $author->display_name; ?>427 </td>428 <?php429 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {430 $t_time = $h_time = __( 'Unpublished' );431 } else {432 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );433 $m_time = $post->post_date;434 $time = get_post_time( 'G', true );435 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {436 if ( $t_diff < 0 )437 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );438 else439 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );440 } else {441 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );442 }443 }444 ?>445 <td class="date column-date"><?php echo $h_time ?></td>446 </tr>447 <?php448 endwhile;449 }450 }451 11 452 12 class WP_Terms_Table extends WP_List_Table { … … 806 366 } 807 367 808 class WP_Users_Table extends WP_List_Table {809 810 function WP_Users_Table() {811 parent::WP_List_Table( array(812 'screen' => 'users',813 'plural' => 'users'814 ) );815 }816 817 function check_permissions() {818 if ( !current_user_can('list_users') )819 wp_die(__('Cheatin’ uh?'));820 }821 822 function prepare_items() {823 global $role, $usersearch;824 825 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';826 827 $role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : '';828 829 $users_per_page = $this->get_items_per_page( 'users_per_page' );830 831 $paged = $this->get_pagenum();832 833 $args = array(834 'number' => $users_per_page,835 'offset' => ( $paged-1 ) * $users_per_page,836 'role' => $role,837 'search' => $usersearch838 );839 840 if ( isset( $_REQUEST['orderby'] ) )841 $args['orderby'] = $_REQUEST['orderby'];842 843 if ( isset( $_REQUEST['order'] ) )844 $args['order'] = $_REQUEST['order'];845 846 // Query the user IDs for this page847 $wp_user_search = new WP_User_Query( $args );848 849 $this->items = $wp_user_search->get_results();850 851 $this->set_pagination_args( array(852 'total_items' => $wp_user_search->get_total(),853 'per_page' => $users_per_page,854 ) );855 }856 857 function no_items() {858 _e( 'No matching users were found.' );859 }860 861 function get_views() {862 global $wp_roles, $role;863 864 $users_of_blog = count_users();865 $total_users = $users_of_blog['total_users'];866 $avail_roles =& $users_of_blog['avail_roles'];867 unset($users_of_blog);868 869 $current_role = false;870 $class = empty($role) ? ' class="current"' : '';871 $role_links = array();872 $role_links['all'] = "<li><a href='users.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>';873 foreach ( $wp_roles->get_names() as $this_role => $name ) {874 if ( !isset($avail_roles[$this_role]) )875 continue;876 877 $class = '';878 879 if ( $this_role == $role ) {880 $current_role = $role;881 $class = ' class="current"';882 }883 884 $name = translate_user_role( $name );885 /* translators: User role name with count */886 $name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, $avail_roles[$this_role] );887 $role_links[$this_role] = "<li><a href='users.php?role=$this_role'$class>$name</a>";888 }889 890 return $role_links;891 }892 893 function get_bulk_actions() {894 $actions = array();895 896 if ( !is_multisite() && current_user_can( 'delete_users' ) )897 $actions['delete'] = __( 'Delete' );898 else899 $actions['remove'] = __( 'Remove' );900 901 return $actions;902 }903 904 function extra_tablenav( $which ) {905 if ( 'top' != $which )906 return;907 368 ?> 908 <div class="alignleft actions"> 909 <label class="screen-reader-text" for="new_role"><?php _e( 'Change role to…' ) ?></label> 910 <select name="new_role" id="new_role"> 911 <option value=''><?php _e( 'Change role to…' ) ?></option> 912 <?php wp_dropdown_roles(); ?> 913 </select> 914 <input type="submit" value="<?php esc_attr_e( 'Change' ); ?>" name="changeit" class="button-secondary" /> 915 </div> 916 <?php 917 } 918 919 function current_action() { 920 if ( isset($_REQUEST['changeit']) && !empty($_REQUEST['new_role']) ) 921 return 'promote'; 922 923 return parent::current_action(); 924 } 925 926 function get_columns() { 927 return array( 928 'cb' => '<input type="checkbox" />', 929 'username' => __( 'Login' ), 930 'name' => __( 'Name' ), 931 'email' => __( 'E-mail' ), 932 'role' => __( 'Role' ), 933 'posts' => __( 'Posts' ) 934 ); 935 } 936 937 function get_sortable_columns() { 938 return array( 939 'username' => 'login', 940 'name' => 'name', 941 'email' => 'email', 942 'posts' => 'post_count', 943 ); 944 } 945 946 function display_rows() { 947 // Query the post counts for this page 948 $post_counts = count_many_users_posts( array_keys( $this->items ) ); 949 950 $style = ''; 951 foreach ( $this->items as $userid => $user_object ) { 952 $role = reset( $user_object->roles ); 953 954 if ( is_multisite() && empty( $role ) ) 955 continue; 956 957 $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"'; 958 echo "\n\t", $this->single_row( $user_object, $style, $role, $post_counts[ $userid ] ); 959 } 960 } 961 962 /** 963 * Generate HTML for a single row on the users.php admin panel. 964 * 965 * @since 2.1.0 966 * 967 * @param object $user_object 968 * @param string $style Optional. Attributes added to the TR element. Must be sanitized. 969 * @param string $role Key for the $wp_roles array. 970 * @param int $numposts Optional. Post count to display for this user. Defaults to zero, as in, a new user has made zero posts. 971 * @return string 972 */ 973 function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) { 974 global $wp_roles; 975 976 if ( !( is_object( $user_object ) && is_a( $user_object, 'WP_User' ) ) ) 977 $user_object = new WP_User( (int) $user_object ); 978 $user_object = sanitize_user_object( $user_object, 'display' ); 979 $email = $user_object->user_email; 980 $url = $user_object->user_url; 981 $short_url = str_replace( 'http://', '', $url ); 982 $short_url = str_replace( 'www.', '', $short_url ); 983 if ( '/' == substr( $short_url, -1 ) ) 984 $short_url = substr( $short_url, 0, -1 ); 985 if ( strlen( $short_url ) > 35 ) 986 $short_url = substr( $short_url, 0, 32 ).'...'; 987 $checkbox = ''; 988 // Check if the user for this row is editable 989 if ( current_user_can( 'list_users' ) ) { 990 // Set up the user editing link 991 // TODO: make profile/user-edit determination a separate function 992 if ( get_current_user_id() == $user_object->ID ) { 993 $edit_link = 'profile.php'; 994 } else { 995 $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( esc_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" ) ); 996 } 997 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />"; 998 999 // Set up the hover actions for this user 1000 $actions = array(); 1001 1002 if ( current_user_can( 'edit_user', $user_object->ID ) ) { 1003 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />"; 1004 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>'; 1005 } else { 1006 $edit = "<strong>$user_object->user_login</strong><br />"; 1007 } 1008 1009 if ( !is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) ) 1010 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=delete&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Delete' ) . "</a>"; 1011 if ( is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'remove_user', $user_object->ID ) ) 1012 $actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=remove&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . "</a>"; 1013 $actions = apply_filters( 'user_row_actions', $actions, $user_object ); 1014 $edit .= $this->row_actions( $actions ); 1015 1016 // Set up the checkbox ( because the user is editable, otherwise its empty ) 1017 $checkbox = "<input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='$role' value='{$user_object->ID}' />"; 1018 1019 } else { 1020 $edit = '<strong>' . $user_object->user_login . '</strong>'; 1021 } 1022 $role_name = isset( $wp_roles->role_names[$role] ) ? translate_user_role( $wp_roles->role_names[$role] ) : __( 'None' ); 1023 $r = "<tr id='user-$user_object->ID'$style>"; 1024 $avatar = get_avatar( $user_object->ID, 32 ); 1025 1026 list( $columns, $hidden ) = $this->get_column_info(); 1027 1028 foreach ( $columns as $column_name => $column_display_name ) { 1029 $class = "class=\"$column_name column-$column_name\""; 1030 1031 $style = ''; 1032 if ( in_array( $column_name, $hidden ) ) 1033 $style = ' style="display:none;"'; 1034 1035 $attributes = "$class$style"; 1036 1037 switch ( $column_name ) { 1038 case 'cb': 1039 $r .= "<th scope='row' class='check-column'>$checkbox</th>"; 1040 break; 1041 case 'username': 1042 $r .= "<td $attributes>$avatar $edit</td>"; 1043 break; 1044 case 'name': 1045 $r .= "<td $attributes>$user_object->first_name $user_object->last_name</td>"; 1046 break; 1047 case 'email': 1048 $r .= "<td $attributes><a href='mailto:$email' title='" . sprintf( __( 'E-mail: %s' ), $email ) . "'>$email</a></td>"; 1049 break; 1050 case 'role': 1051 $r .= "<td $attributes>$role_name</td>"; 1052 break; 1053 case 'posts': 1054 $attributes = 'class="posts column-posts num"' . $style; 1055 $r .= "<td $attributes>"; 1056 if ( $numposts > 0 ) { 1057 $r .= "<a href='edit.php?author=$user_object->ID' title='" . __( 'View posts by this author' ) . "' class='edit'>"; 1058 $r .= $numposts; 1059 $r .= '</a>'; 1060 } else { 1061 $r .= 0; 1062 } 1063 $r .= "</td>"; 1064 break; 1065 default: 1066 $r .= "<td $attributes>"; 1067 $r .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID ); 1068 $r .= "</td>"; 1069 } 1070 } 1071 $r .= '</tr>'; 1072 1073 return $r; 1074 } 1075 } 1076 1077 class WP_Comments_Table extends WP_List_Table { 1078 1079 var $checkbox = true; 1080 var $from_ajax = false; 1081 1082 var $pending_count = array(); 1083 1084 function WP_Comments_Table() { 1085 global $mode; 1086 1087 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'detail' : $_REQUEST['mode']; 1088 1089 if ( get_option('show_avatars') && 'single' != $mode ) 1090 add_filter( 'comment_author', 'floated_admin_avatar' ); 1091 1092 parent::WP_List_Table( array( 1093 'screen' => 'edit-comments', 1094 'plural' => 'comments' 1095 ) ); 1096 } 1097 1098 function check_permissions() { 1099 if ( !current_user_can('edit_posts') ) 1100 wp_die(__('Cheatin’ uh?')); 1101 } 1102 1103 function prepare_items() { 1104 global $post_id, $comment_status, $search; 1105 1106 if ( isset( $_REQUEST['p'] ) ) 1107 $post_id = absint( $_REQUEST['p'] ); 1108 elseif ( isset( $_REQUEST['post'] ) ) 1109 $post_id = absint( $_REQUEST['post'] ); 1110 elseif ( isset( $_REQUEST['post_ID'] ) ) 1111 $post_id = absint( $_REQUEST['post_ID'] ); 1112 else 1113 $post_id = 0; 1114 1115 $comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all'; 1116 if ( !in_array( $comment_status, array( 'all', 'moderated', 'approved', 'spam', 'trash' ) ) ) 1117 $comment_status = 'all'; 1118 1119 $comment_type = !empty( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : ''; 1120 1121 $search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : ''; 1122 1123 $user_id = ( isset( $_REQUEST['user_id'] ) ) ? $_REQUEST['user_id'] : ''; 1124 1125 $comments_per_page = $this->get_items_per_page( 'edit_comments_per_page' ); 1126 $comments_per_page = apply_filters( 'comments_per_page', $comments_per_page, $comment_status ); 1127 1128 if ( isset( $_POST['number'] ) ) 1129 $number = (int) $_POST['number']; 1130 else 1131 $number = $comments_per_page + min( 8, $comments_per_page ); // Grab a few extra 1132 1133 $page = $this->get_pagenum(); 1134 1135 $start = $offset = ( $page - 1 ) * $comments_per_page; 1136 1137 $status_map = array( 1138 'moderated' => 'hold', 1139 'approved' => 'approve' 1140 ); 1141 1142 $args = array( 1143 'status' => isset( $status_map[$comment_status] ) ? $status_map[$comment_status] : $comment_status, 1144 'search' => $search, 1145 'user_id' => $user_id, 1146 'offset' => $start, 1147 'number' => $number, 1148 'post_id' => $post_id, 1149 'type' => $comment_type, 1150 'orderby' => @$_REQUEST['orderby'], 1151 'order' => @$_REQUEST['order'], 1152 ); 1153 1154 $_comments = get_comments( $args ); 1155 1156 update_comment_cache( $_comments ); 1157 1158 $this->items = array_slice( $_comments, 0, $comments_per_page ); 1159 $this->extra_items = array_slice( $_comments, $comments_per_page ); 1160 1161 $total_comments = get_comments( array_merge( $args, array('count' => true, 'offset' => 0, 'number' => 0) ) ); 1162 1163 $_comment_post_ids = array(); 1164 foreach ( $_comments as $_c ) { 1165 $_comment_post_ids[] = $_c->comment_post_ID; 1166 } 1167 1168 $this->pending_count = get_pending_comments_num( $_comment_post_ids ); 1169 1170 $this->set_pagination_args( array( 1171 'total_items' => $total_comments, 1172 'per_page' => $comments_per_page, 1173 ) ); 1174 } 1175 1176 function get_views() { 1177 global $post_id, $comment_status; 1178 1179 $status_links = array(); 1180 $num_comments = ( $post_id ) ? wp_count_comments( $post_id ) : wp_count_comments(); 1181 //, number_format_i18n($num_comments->moderated) ), "<span class='comment-count'>" . number_format_i18n($num_comments->moderated) . "</span>"), 1182 //, number_format_i18n($num_comments->spam) ), "<span class='spam-comment-count'>" . number_format_i18n($num_comments->spam) . "</span>") 1183 $stati = array( 1184 'all' => _nx_noop('All', 'All', 'comments'), // singular not used 1185 'moderated' => _n_noop('Pending <span class="count">(<span class="pending-count">%s</span>)</span>', 'Pending <span class="count">(<span class="pending-count">%s</span>)</span>'), 1186 'approved' => _n_noop('Approved', 'Approved'), // singular not used 1187 'spam' => _n_noop('Spam <span class="count">(<span class="spam-count">%s</span>)</span>', 'Spam <span class="count">(<span class="spam-count">%s</span>)</span>'), 1188 'trash' => _n_noop('Trash <span class="count">(<span class="trash-count">%s</span>)</span>', 'Trash <span class="count">(<span class="trash-count">%s</span>)</span>') 1189 ); 1190 1191 if ( !EMPTY_TRASH_DAYS ) 1192 unset($stati['trash']); 1193 1194 $link = 'edit-comments.php'; 1195 if ( !empty($comment_type) && 'all' != $comment_type ) 1196 $link = add_query_arg( 'comment_type', $comment_type, $link ); 1197 1198 foreach ( $stati as $status => $label ) { 1199 $class = ( $status == $comment_status ) ? ' class="current"' : ''; 1200 1201 if ( !isset( $num_comments->$status ) ) 1202 $num_comments->$status = 10; 1203 $link = add_query_arg( 'comment_status', $status, $link ); 1204 if ( $post_id ) 1205 $link = add_query_arg( 'p', absint( $post_id ), $link ); 1206 /* 1207 // I toyed with this, but decided against it. Leaving it in here in case anyone thinks it is a good idea. ~ Mark 1208 if ( !empty( $_REQUEST['s'] ) ) 1209 $link = add_query_arg( 's', esc_attr( stripslashes( $_REQUEST['s'] ) ), $link ); 1210 */ 1211 $status_links[$status] = "<li class='$status'><a href='$link'$class>" . sprintf( 1212 _n( $label[0], $label[1], $num_comments->$status ), 1213 number_format_i18n( $num_comments->$status ) 1214 ) . '</a>'; 1215 } 1216 1217 $status_links = apply_filters( 'comment_status_links', $status_links ); 1218 return $status_links; 1219 } 1220 1221 function get_bulk_actions() { 1222 global $comment_status; 1223 1224 $actions = array(); 1225 if ( in_array( $comment_status, array( 'all', 'approved' ) ) ) 1226 $actions['unapprove'] = __( 'Unapprove' ); 1227 if ( in_array( $comment_status, array( 'all', 'moderated', 'spam' ) ) ) 1228 $actions['approve'] = __( 'Approve' ); 1229 if ( in_array( $comment_status, array( 'all', 'moderated', 'approved' ) ) ) 1230 $actions['spam'] = _x( 'Mark as Spam', 'comment' ); 1231 1232 if ( 'trash' == $comment_status ) 1233 $actions['untrash'] = __( 'Restore' ); 1234 elseif ( 'spam' == $comment_status ) 1235 $actions['unspam'] = _x( 'Not Spam', 'comment' ); 1236 1237 if ( in_array( $comment_status, array( 'trash', 'spam' ) ) || !EMPTY_TRASH_DAYS ) 1238 $actions['delete'] = __( 'Delete Permanently' ); 1239 else 1240 $actions['trash'] = __( 'Move to Trash' ); 1241 1242 return $actions; 1243 } 1244 1245 function extra_tablenav( $which ) { 1246 global $comment_status, $comment_type; 1247 ?> 1248 <div class="alignleft actions"> 1249 <?php 1250 if ( 'top' == $which ) { 1251 ?> 1252 <select name="comment_type"> 1253 <option value=""><?php _e( 'Show all comment types' ); ?></option> 1254 <?php 1255 $comment_types = apply_filters( 'admin_comment_types_dropdown', array( 1256 'comment' => __( 'Comments' ), 1257 'pings' => __( 'Pings' ), 1258 ) ); 1259 1260 foreach ( $comment_types as $type => $label ) 1261 echo "\t<option value='" . esc_attr( $type ) . "'" . selected( $comment_type, $type, false ) . ">$label</option>\n"; 1262 ?> 1263 </select> 1264 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" /> 1265 <?php 1266 } 1267 1268 if ( ( 'spam' == $comment_status || 'trash' == $comment_status ) && current_user_can( 'moderate_comments' ) ) { 1269 wp_nonce_field( 'bulk-destroy', '_destroy_nonce' ); 1270 $title = ( 'spam' == $comment_status ) ? esc_attr__( 'Empty Spam' ) : esc_attr__( 'Empty Trash' ); 1271 ?> 1272 <input type="submit" name="delete_all" id="delete_all" value="<?php echo $title ?>" class="button-secondary apply" /> 1273 <?php 1274 } 1275 ?> 1276 <?php 1277 do_action( 'manage_comments_nav', $comment_status ); 1278 echo '</div>'; 1279 } 1280 1281 function current_action() { 1282 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) ) 1283 return 'delete_all'; 1284 1285 return parent::current_action(); 1286 } 1287 1288 function get_columns() { 1289 global $mode; 1290 1291 $columns = array(); 1292 1293 if ( $this->checkbox ) 1294 $columns['cb'] = '<input type="checkbox" />'; 1295 1296 $columns['author'] = __( 'Author' ); 1297 $columns['comment'] = _x( 'Comment', 'column name' ); 1298 1299 if ( 'single' !== $mode ) 1300 $columns['response'] = _x( 'Comment', 'column name' ); 1301 1302 return $columns; 1303 } 1304 1305 function get_sortable_columns() { 1306 return array( 1307 'author' => 'comment_author', 1308 'comment' => 'comment_content', 1309 'response' => 'comment_post_ID' 1310 ); 1311 } 1312 1313 function display_table() { 1314 extract( $this->_args ); 1315 1316 $this->display_tablenav( 'top' ); 1317 1318 ?> 1319 <table class="<?php echo implode( ' ', $this->get_table_classes() ); ?>" cellspacing="0"> 1320 <thead> 1321 <tr> 1322 <?php $this->print_column_headers(); ?> 1323 </tr> 1324 </thead> 1325 1326 <tfoot> 1327 <tr> 1328 <?php $this->print_column_headers( false ); ?> 1329 </tr> 1330 </tfoot> 1331 1332 <tbody id="the-comment-list" class="list:comment"> 1333 <?php $this->display_rows(); ?> 1334 </tbody> 1335 1336 <tbody id="the-extra-comment-list" class="list:comment" style="display: none;"> 1337 <?php $this->items = $this->extra_items; $this->display_rows(); ?> 1338 </tbody> 1339 </table> 1340 <?php 1341 1342 $this->display_tablenav( 'bottom' ); 1343 } 1344 1345 function single_row( $a_comment ) { 1346 global $post, $comment, $the_comment_status; 1347 1348 $comment = $a_comment; 1349 $the_comment_status = wp_get_comment_status( $comment->comment_ID ); 1350 1351 $post = get_post( $comment->comment_post_ID ); 1352 1353 $this->user_can = current_user_can( 'edit_comment', $comment->comment_ID ); 1354 1355 echo "<tr id='comment-$comment->comment_ID' class='$the_comment_status'>"; 1356 echo $this->single_row_columns( $comment ); 1357 echo "</tr>\n"; 1358 } 1359 1360 function column_cb( $comment ) { 1361 if ( $this->user_can ) 1362 echo "<input type='checkbox' name='delete_comments[]' value='$comment->comment_ID' />"; 1363 } 1364 1365 function column_comment( $comment ) { 1366 global $post, $comment_status, $the_comment_status; 1367 1368 $user_can = $this->user_can; 1369 1370 $comment_url = esc_url( get_comment_link( $comment->comment_ID ) ); 1371 1372 $ptime = date( 'G', strtotime( $comment->comment_date ) ); 1373 if ( ( abs( time() - $ptime ) ) < 86400 ) 1374 $ptime = sprintf( __( '%s ago' ), human_time_diff( $ptime ) ); 1375 else 1376 $ptime = mysql2date( __( 'Y/m/d \a\t g:i A' ), $comment->comment_date ); 1377 1378 if ( $user_can ) { 1379 $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) ); 1380 $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) ); 1381 1382 $url = "comment.php?c=$comment->comment_ID"; 1383 1384 $approve_url = esc_url( $url . "&action=approvecomment&$approve_nonce" ); 1385 $unapprove_url = esc_url( $url . "&action=unapprovecomment&$approve_nonce" ); 1386 $spam_url = esc_url( $url . "&action=spamcomment&$del_nonce" ); 1387 $unspam_url = esc_url( $url . "&action=unspamcomment&$del_nonce" ); 1388 $trash_url = esc_url( $url . "&action=trashcomment&$del_nonce" ); 1389 $untrash_url = esc_url( $url . "&action=untrashcomment&$del_nonce" ); 1390 $delete_url = esc_url( $url . "&action=deletecomment&$del_nonce" ); 1391 } 1392 1393 echo '<div id="submitted-on">'; 1394 /* translators: 2: comment date, 3: comment time */ 1395 printf( __( '<a href="%1$s">%2$s at %3$s</a>' ), $comment_url, 1396 /* translators: comment date format. See http://php.net/date */ get_comment_date( __( 'Y/m/d' ) ), 1397 /* translators: comment time format. See http://php.net/date */ get_comment_date( get_option( 'time_format' ) ) ); 1398 1399 if ( $comment->comment_parent ) { 1400 $parent = get_comment( $comment->comment_parent ); 1401 $parent_link = esc_url( get_comment_link( $comment->comment_parent ) ); 1402 $name = get_comment_author( $parent->comment_ID ); 1403 printf( ' | '.__( 'In reply to <a href="%1$s">%2$s</a>.' ), $parent_link, $name ); 1404 } 1405 1406 echo '</div>'; 1407 comment_text(); 1408 if ( $user_can ) { ?> 1409 <div id="inline-<?php echo $comment->comment_ID; ?>" class="hidden"> 1410 <textarea class="comment" rows="1" cols="1"><?php echo esc_html( apply_filters( 'comment_edit_pre', $comment->comment_content ) ); ?></textarea> 1411 <div class="author-email"><?php echo esc_attr( $comment->comment_author_email ); ?></div> 1412 <div class="author"><?php echo esc_attr( $comment->comment_author ); ?></div> 1413 <div class="author-url"><?php echo esc_attr( $comment->comment_author_url ); ?></div> 1414 <div class="comment_status"><?php echo $comment->comment_approved; ?></div> 1415 </div> 1416 <?php 1417 } 1418 1419 if ( $user_can ) { 1420 // preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash 1421 $actions = array( 1422 'approve' => '', 'unapprove' => '', 1423 'reply' => '', 1424 'quickedit' => '', 1425 'edit' => '', 1426 'spam' => '', 'unspam' => '', 1427 'trash' => '', 'untrash' => '', 'delete' => '' 1428 ); 1429 1430 if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments 1431 if ( 'approved' == $the_comment_status ) 1432 $actions['unapprove'] = "<a href='$unapprove_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=unapproved vim-u vim-destructive' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>'; 1433 else if ( 'unapproved' == $the_comment_status ) 1434 $actions['approve'] = "<a href='$approve_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=approved vim-a vim-destructive' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>'; 1435 } else { 1436 $actions['approve'] = "<a href='$approve_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved vim-a' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>'; 1437 $actions['unapprove'] = "<a href='$unapprove_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved vim-u' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>'; 1438 } 1439 1440 if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) { 1441 $actions['spam'] = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1 vim-s vim-destructive' title='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>'; 1442 } elseif ( 'spam' == $the_comment_status ) { 1443 $actions['unspam'] = "<a href='$unspam_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:unspam=1 vim-z vim-destructive'>" . _x( 'Not Spam', 'comment' ) . '</a>'; 1444 } elseif ( 'trash' == $the_comment_status ) { 1445 $actions['untrash'] = "<a href='$untrash_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:untrash=1 vim-z vim-destructive'>" . __( 'Restore' ) . '</a>'; 1446 } 1447 1448 if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) { 1449 $actions['delete'] = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID::delete=1 delete vim-d vim-destructive'>" . __( 'Delete Permanently' ) . '</a>'; 1450 } else { 1451 $actions['trash'] = "<a href='$trash_url' class='delete:the-comment-list:comment-$comment->comment_ID::trash=1 delete vim-d vim-destructive' title='" . esc_attr__( 'Move this comment to the trash' ) . "'>" . _x( 'Trash', 'verb' ) . '</a>'; 1452 } 1453 1454 if ( 'trash' != $the_comment_status ) { 1455 $actions['edit'] = "<a href='comment.php?action=editcomment&c={$comment->comment_ID}' title='" . esc_attr__( 'Edit comment' ) . "'>". __( 'Edit' ) . '</a>'; 1456 $actions['quickedit'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\',\'edit\' );return false;" class="vim-q" title="'.esc_attr__( 'Quick Edit' ).'" href="#">' . __( 'Quick Edit' ) . '</a>'; 1457 if ( 'spam' != $the_comment_status ) 1458 $actions['reply'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\' );return false;" class="vim-r" title="'.esc_attr__( 'Reply to this comment' ).'" href="#">' . __( 'Reply' ) . '</a>'; 1459 } 1460 1461 $actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment ); 1462 1463 $i = 0; 1464 echo '<div class="row-actions">'; 1465 foreach ( $actions as $action => $link ) { 1466 ++$i; 1467 ( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | '; 1468 1469 // Reply and quickedit need a hide-if-no-js span when not added with ajax 1470 if ( ( 'reply' == $action || 'quickedit' == $action ) && ! $this->from_ajax ) 1471 $action .= ' hide-if-no-js'; 1472 elseif ( ( $action == 'untrash' && $the_comment_status == 'trash' ) || ( $action == 'unspam' && $the_comment_status == 'spam' ) ) { 1473 if ( '1' == get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) ) 1474 $action .= ' approve'; 1475 else 1476 $action .= ' unapprove'; 1477 } 1478 1479 echo "<span class='$action'>$sep$link</span>"; 1480 } 1481 echo '</div>'; 1482 } 1483 } 1484 1485 function column_author( $comment ) { 1486 global $comment_status; 1487 1488 $author_url = get_comment_author_url(); 1489 if ( 'http://' == $author_url ) 1490 $author_url = ''; 1491 $author_url_display = preg_replace( '|http://(www\.)?|i', '', $author_url ); 1492 if ( strlen( $author_url_display ) > 50 ) 1493 $author_url_display = substr( $author_url_display, 0, 49 ) . '...'; 1494 1495 echo "<strong>"; comment_author(); echo '</strong><br />'; 1496 if ( !empty( $author_url ) ) 1497 echo "<a title='$author_url' href='$author_url'>$author_url_display</a><br />"; 1498 1499 if ( $this->user_can ) { 1500 if ( !empty( $comment->comment_author_email ) ) { 1501 comment_author_email_link(); 1502 echo '<br />'; 1503 } 1504 echo '<a href="edit-comments.php?s='; 1505 comment_author_IP(); 1506 echo '&mode=detail'; 1507 if ( 'spam' == $comment_status ) 1508 echo '&comment_status=spam'; 1509 echo '">'; 1510 comment_author_IP(); 1511 echo '</a>'; 1512 } 1513 } 1514 1515 function column_date( $comment ) { 1516 return get_comment_date( __( 'Y/m/d \a\t g:ia' ) ); 1517 } 1518 1519 function column_response( $comment ) { 1520 global $post; 1521 1522 if ( isset( $this->pending_count[$post->ID] ) ) { 1523 $pending_comments = $this->pending_count[$post->ID]; 1524 } else { 1525 $_pending_count_temp = get_pending_comments_num( array( $post->ID ) ); 1526 $pending_comments = $this->pending_count[$post->ID] = $_pending_count_temp[$post->ID]; 1527 } 1528 1529 if ( current_user_can( 'edit_post', $post->ID ) ) { 1530 $post_link = "<a href='" . get_edit_post_link( $post->ID ) . "'>"; 1531 $post_link .= get_the_title( $post->ID ) . '</a>'; 1532 } else { 1533 $post_link = get_the_title( $post->ID ); 1534 } 1535 1536 echo '<div class="response-links"><span class="post-com-count-wrapper">'; 1537 echo $post_link . '<br />'; 1538 $this->comments_bubble( $post->ID, $pending_comments ); 1539 echo '</span> '; 1540 echo "<a href='" . get_permalink( $post->ID ) . "'>#</a>"; 1541 echo '</div>'; 1542 if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) ) 1543 echo $thumb; 1544 } 1545 1546 function column_default( $comment, $column_name ) { 1547 do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID ); 1548 } 1549 } 1550 1551 class WP_Post_Comments_Table extends WP_Comments_Table { 1552 1553 function get_columns() { 1554 return array( 1555 'author' => __( 'Author' ), 1556 'comment' => _x( 'Comment', 'column name' ), 1557 ); 1558 } 1559 1560 function get_sortable_columns() { 1561 return array(); 1562 } 1563 } 1564 1565 class WP_Links_Table extends WP_List_Table { 1566 1567 function WP_Links_Table() { 1568 parent::WP_List_Table( array( 1569 'screen' => 'link-manager', 1570 'plural' => 'bookmarks', 1571 ) ); 1572 } 1573 1574 function check_permissions() { 1575 if ( ! current_user_can( 'manage_links' ) ) 1576 wp_die( __( 'You do not have sufficient permissions to edit the links for this site.' ) ); 1577 } 1578 1579 function prepare_items() { 1580 global $cat_id, $s, $orderby, $order; 1581 1582 wp_reset_vars( array( 'action', 'cat_id', 'linkurl', 'name', 'image', 'description', 'visible', 'target', 'category', 'link_id', 'submit', 'orderby', 'order', 'links_show_cat_id', 'rating', 'rel', 'notes', 'linkcheck[]', 's' ) ); 1583 1584 $args = array( 'hide_invisible' => 0, 'hide_empty' => 0 ); 1585 1586 if ( 'all' != $cat_id ) 1587 $args['category'] = $cat_id; 1588 if ( !empty( $s ) ) 1589 $args['search'] = $s; 1590 if ( !empty( $orderby ) ) 1591 $args['orderby'] = $orderby; 1592 if ( !empty( $order ) ) 1593 $args['order'] = $order; 1594 1595 $this->items = get_bookmarks( $args ); 1596 } 1597 1598 function no_items() { 1599 _e( 'No links found.' ); 1600 } 1601 1602 function get_bulk_actions() { 1603 $actions = array(); 1604 $actions['delete'] = __( 'Delete' ); 1605 1606 return $actions; 1607 } 1608 1609 function extra_tablenav( $which ) { 1610 global $cat_id; 1611 1612 if ( 'top' != $which ) 1613 return; 1614 ?> 1615 <div class="alignleft actions"> 1616 <?php 1617 $dropdown_options = array( 1618 'selected' => $cat_id, 1619 'name' => 'cat_id', 1620 'taxonomy' => 'link_category', 1621 'show_option_all' => __( 'View all categories' ), 1622 'hide_empty' => true, 1623 'hierarchical' => 1, 1624 'show_count' => 0, 1625 'orderby' => 'name', 1626 ); 1627 wp_dropdown_categories( $dropdown_options ); 1628 ?> 1629 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" /> 1630 </div> 1631 <?php 1632 } 1633 1634 function get_columns() { 1635 return array( 1636 'cb' => '<input type="checkbox" />', 1637 'name' => __( 'Name' ), 1638 'url' => __( 'URL' ), 1639 'categories' => __( 'Categories' ), 1640 'rel' => __( 'Relationship' ), 1641 'visible' => __( 'Visible' ), 1642 'rating' => __( 'Rating' ) 1643 ); 1644 } 1645 1646 function get_sortable_columns() { 1647 return array( 1648 'name' => 'name', 1649 'url' => 'url', 1650 'visible' => 'visible', 1651 'rating' => 'rating' 1652 ); 1653 } 1654 1655 function display_rows() { 1656 global $cat_id; 1657 1658 $alt = 0; 1659 1660 foreach ( $this->items as $link ) { 1661 $link = sanitize_bookmark( $link ); 1662 $link->link_name = esc_attr( $link->link_name ); 1663 $link->link_category = wp_get_link_cats( $link->link_id ); 1664 1665 $short_url = str_replace( 'http://', '', $link->link_url ); 1666 $short_url = preg_replace( '/^www\./i', '', $short_url ); 1667 if ( '/' == substr( $short_url, -1 ) ) 1668 $short_url = substr( $short_url, 0, -1 ); 1669 if ( strlen( $short_url ) > 35 ) 1670 $short_url = substr( $short_url, 0, 32 ).'...'; 1671 1672 $visible = ( $link->link_visible == 'Y' ) ? __( 'Yes' ) : __( 'No' ); 1673 $rating = $link->link_rating; 1674 $style = ( $alt++ % 2 ) ? '' : ' class="alternate"'; 1675 1676 $edit_link = get_edit_bookmark_link( $link ); 1677 ?> 1678 <tr id="link-<?php echo $link->link_id; ?>" valign="middle" <?php echo $style; ?>> 1679 <?php 1680 1681 list( $columns, $hidden ) = $this->get_column_info(); 1682 1683 foreach ( $columns as $column_name => $column_display_name ) { 1684 $class = "class='column-$column_name'"; 1685 1686 $style = ''; 1687 if ( in_array( $column_name, $hidden ) ) 1688 $style = ' style="display:none;"'; 1689 1690 $attributes = $class . $style; 1691 1692 switch ( $column_name ) { 1693 case 'cb': 1694 echo '<th scope="row" class="check-column"><input type="checkbox" name="linkcheck[]" value="'. esc_attr( $link->link_id ) .'" /></th>'; 1695 break; 1696 1697 case 'name': 1698 echo "<td $attributes><strong><a class='row-title' href='$edit_link' title='" . esc_attr( sprintf( __( 'Edit “%s”' ), $link->link_name ) ) . "'>$link->link_name</a></strong><br />"; 1699 1700 $actions = array(); 1701 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>'; 1702 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "link.php?action=delete&link_id=$link->link_id", 'delete-bookmark_' . $link->link_id ) . "' onclick=\"if ( confirm( '" . esc_js( sprintf( __( "You are about to delete this link '%s'\n 'Cancel' to stop, 'OK' to delete." ), $link->link_name ) ) . "' ) ) { return true;}return false;\">" . __( 'Delete' ) . "</a>"; 1703 echo $this->row_actions( $actions ); 1704 1705 echo '</td>'; 1706 break; 1707 case 'url': 1708 echo "<td $attributes><a href='$link->link_url' title='".sprintf( __( 'Visit %s' ), $link->link_name )."'>$short_url</a></td>"; 1709 break; 1710 case 'categories': 1711 ?><td <?php echo $attributes ?>><?php 1712 $cat_names = array(); 1713 foreach ( $link->link_category as $category ) { 1714 $cat = get_term( $category, 'link_category', OBJECT, 'display' ); 1715 if ( is_wp_error( $cat ) ) 1716 echo $cat->get_error_message(); 1717 $cat_name = $cat->name; 1718 if ( $cat_id != $category ) 1719 $cat_name = "<a href='link-manager.php?cat_id=$category'>$cat_name</a>"; 1720 $cat_names[] = $cat_name; 1721 } 1722 echo implode( ', ', $cat_names ); 1723 ?></td><?php 1724 break; 1725 case 'rel': 1726 ?><td <?php echo $attributes ?>><?php echo empty( $link->link_rel ) ? '<br />' : $link->link_rel; ?></td><?php 1727 break; 1728 case 'visible': 1729 ?><td <?php echo $attributes ?>><?php echo $visible; ?></td><?php 1730 break; 1731 case 'rating': 1732 ?><td <?php echo $attributes ?>><?php echo $rating; ?></td><?php 1733 break; 1734 default: 1735 ?> 1736 <td <?php echo $attributes ?>><?php do_action( 'manage_link_custom_column', $column_name, $link->link_id ); ?></td> 1737 <?php 1738 break; 1739 } 1740 } 1741 ?> 1742 </tr> 1743 <?php 1744 } 1745 } 1746 } 1747 1748 class WP_Sites_Table extends WP_List_Table { 1749 1750 function WP_Sites_Table() { 1751 parent::WP_List_Table( array( 1752 'screen' => 'sites-network', 1753 'plural' => 'sites', 1754 ) ); 1755 } 1756 1757 function check_permissions() { 1758 if ( ! current_user_can( 'manage_sites' ) ) 1759 wp_die( __( 'You do not have permission to access this page.' ) ); 1760 } 1761 1762 function prepare_items() { 1763 global $s, $mode, $wpdb; 1764 1765 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'list' : $_REQUEST['mode']; 1766 1767 $per_page = $this->get_items_per_page( 'sites_network_per_page' ); 1768 1769 $pagenum = $this->get_pagenum(); 1770 1771 $s = isset( $_REQUEST['s'] ) ? stripslashes( trim( $_REQUEST[ 's' ] ) ) : ''; 1772 $like_s = esc_sql( like_escape( $s ) ); 1773 1774 $query = "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' "; 1775 1776 if ( isset( $_REQUEST['searchaction'] ) ) { 1777 if ( 'name' == $_REQUEST['searchaction'] ) { 1778 $query .= " AND ( {$wpdb->blogs}.domain LIKE '%{$like_s}%' OR {$wpdb->blogs}.path LIKE '%{$like_s}%' ) "; 1779 } elseif ( 'id' == $_REQUEST['searchaction'] ) { 1780 $query .= " AND {$wpdb->blogs}.blog_id = '{$like_s}' "; 1781 } elseif ( 'ip' == $_REQUEST['searchaction'] ) { 1782 $query = "SELECT * 1783 FROM {$wpdb->blogs}, {$wpdb->registration_log} 1784 WHERE site_id = '{$wpdb->siteid}' 1785 AND {$wpdb->blogs}.blog_id = {$wpdb->registration_log}.blog_id 1786 AND {$wpdb->registration_log}.IP LIKE ( '%{$like_s}%' )"; 1787 } 1788 } 1789 1790 $order_by = isset( $_REQUEST['orderby'] ) ? $_REQUEST['orderby'] : 'id'; 1791 if ( $order_by == 'registered' ) { 1792 $query .= ' ORDER BY registered '; 1793 } elseif ( $order_by == 'lastupdated' ) { 1794 $query .= ' ORDER BY last_updated '; 1795 } elseif ( $order_by == 'blogname' ) { 1796 $query .= ' ORDER BY domain '; 1797 } else { 1798 $order_by = 'id'; 1799 $query .= " ORDER BY {$wpdb->blogs}.blog_id "; 1800 } 1801 1802 $order = ( isset( $_REQUEST['order'] ) && 'DESC' == strtoupper( $_REQUEST['order'] ) ) ? "DESC" : "ASC"; 1803 $query .= $order; 1804 1805 $total = $wpdb->get_var( str_replace( 'SELECT *', 'SELECT COUNT( blog_id )', $query ) ); 1806 1807 $query .= " LIMIT " . intval( ( $pagenum - 1 ) * $per_page ) . ", " . intval( $per_page ); 1808 $this->items = $wpdb->get_results( $query, ARRAY_A ); 1809 1810 $this->set_pagination_args( array( 1811 'total_items' => $total, 1812 'per_page' => $per_page, 1813 ) ); 1814 } 1815 1816 function no_items() { 1817 _e( 'No sites found.' ); 1818 } 1819 1820 function get_bulk_actions() { 1821 $actions = array(); 1822 $actions['delete'] = __( 'Delete' ); 1823 $actions['spam'] = _x( 'Mark as Spam', 'site' ); 1824 $actions['notspam'] = _x( 'Not Spam', 'site' ); 1825 1826 return $actions; 1827 } 1828 1829 function pagination( $which ) { 1830 global $mode; 1831 1832 parent::pagination( $which ); 1833 1834 if ( 'top' == $which ) 1835 $this->view_switcher( $mode ); 1836 } 1837 1838 function get_columns() { 1839 $blogname_columns = ( is_subdomain_install() ) ? __( 'Domain' ) : __( 'Path' ); 1840 $sites_columns = array( 1841 'cb' => '<input type="checkbox" />', 1842 'blogname' => $blogname_columns, 1843 'lastupdated' => __( 'Last Updated' ), 1844 'registered' => _x( 'Registered', 'site' ), 1845 'users' => __( 'Users' ) 1846 ); 1847 1848 if ( has_filter( 'wpmublogsaction' ) ) 1849 $sites_columns['plugins'] = __( 'Actions' ); 1850 1851 $sites_columns = apply_filters( 'wpmu_blogs_columns', $sites_columns ); 1852 1853 return $sites_columns; 1854 } 1855 1856 function get_sortable_columns() { 1857 return array( 1858 'id' => 'id', 1859 'blogname' => 'blogname', 1860 'lastupdated' => 'lastupdated', 1861 'registered' => 'registered', 1862 ); 1863 } 1864 1865 function display_rows() { 1866 global $current_site, $mode; 1867 1868 $status_list = array( 1869 'archived' => array( 'site-archived', __( 'Archived' ) ), 1870 'spam' => array( 'site-spammed', _x( 'Spam', 'site' ) ), 1871 'deleted' => array( 'site-deleted', __( 'Deleted' ) ), 1872 'mature' => array( 'site-mature', __( 'Mature' ) ) 1873 ); 1874 1875 $class = ''; 1876 foreach ( $this->items as $blog ) { 1877 $class = ( 'alternate' == $class ) ? '' : 'alternate'; 1878 reset( $status_list ); 1879 1880 $blog_states = array(); 1881 foreach ( $status_list as $status => $col ) { 1882 if ( get_blog_status( $blog['blog_id'], $status ) == 1 ) { 1883 $class = $col[0]; 1884 $blog_states[] = $col[1]; 1885 } 1886 } 1887 $blog_state = ''; 1888 if ( ! empty( $blog_states ) ) { 1889 $state_count = count( $blog_states ); 1890 $i = 0; 1891 $blog_state .= ' - '; 1892 foreach ( $blog_states as $state ) { 1893 ++$i; 1894 ( $i == $state_count ) ? $sep = '' : $sep = ', '; 1895 $blog_state .= "<span class='post-state'>$state$sep</span>"; 1896 } 1897 } 1898 echo "<tr class='$class'>"; 1899 1900 $blogname = ( is_subdomain_install() ) ? str_replace( '.'.$current_site->domain, '', $blog['domain'] ) : $blog['path']; 1901 1902 list( $columns, $hidden ) = $this->get_column_info(); 1903 1904 foreach ( $columns as $column_name => $column_display_name ) { 1905 switch ( $column_name ) { 1906 case 'cb': ?> 1907 <th scope="row" class="check-column"> 1908 <input type="checkbox" id="blog_<?php echo $blog['blog_id'] ?>" name="allblogs[]" value="<?php echo esc_attr( $blog['blog_id'] ) ?>" /> 1909 </th> 1910 <?php 1911 break; 1912 1913 case 'id': ?> 1914 <th valign="top" scope="row"> 1915 <?php echo $blog['blog_id'] ?> 1916 </th> 1917 <?php 1918 break; 1919 1920 case 'blogname': ?> 1921 <td class="column-title"> 1922 <a href="<?php echo esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ); ?>" class="edit"><?php echo $blogname . $blog_state; ?></a> 1923 <?php 1924 if ( 'list' != $mode ) 1925 echo '<p>' . sprintf( _x( '%1$s – <em>%2$s</em>', '%1$s: site name. %2$s: site tagline.' ), get_blog_option( $blog['blog_id'], 'blogname' ), get_blog_option( $blog['blog_id'], 'blogdescription ' ) ) . '</p>'; 1926 1927 // Preordered. 1928 $actions = array( 1929 'edit' => '', 'backend' => '', 1930 'activate' => '', 'deactivate' => '', 1931 'archive' => '', 'unarchive' => '', 1932 'spam' => '', 'unspam' => '', 1933 'delete' => '', 1934 'visit' => '', 1935 ); 1936 1937 $actions['edit'] = '<span class="edit"><a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ) . '">' . __( 'Edit' ) . '</a></span>'; 1938 $actions['backend'] = "<span class='backend'><a href='" . esc_url( get_admin_url( $blog['blog_id'] ) ) . "' class='edit'>" . __( 'Dashboard' ) . '</a></span>'; 1939 if ( $current_site->blog_id != $blog['blog_id'] ) { 1940 if ( get_blog_status( $blog['blog_id'], 'deleted' ) == '1' ) 1941 $actions['activate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=activateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to activate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Activate' ) . '</a></span>'; 1942 else 1943 $actions['deactivate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deactivateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to deactivate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Deactivate' ) . '</a></span>'; 1944 1945 if ( get_blog_status( $blog['blog_id'], 'archived' ) == '1' ) 1946 $actions['unarchive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unarchiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unarchive the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Unarchive' ) . '</a></span>'; 1947 else 1948 $actions['archive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=archiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to archive the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Archive', 'verb; site' ) . '</a></span>'; 1949 1950 if ( get_blog_status( $blog['blog_id'], 'spam' ) == '1' ) 1951 $actions['unspam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unspamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unspam the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Not Spam', 'site' ) . '</a></span>'; 1952 else 1953 $actions['spam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=spamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to mark the site %s as spam.' ), $blogname ) ) ) ) . '">' . _x( 'Spam', 'site' ) . '</a></span>'; 1954 1955 $actions['delete'] = '<span class="delete"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deleteblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to delete the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Delete' ) . '</a></span>'; 1956 } 1957 1958 $actions['visit'] = "<span class='view'><a href='" . esc_url( get_home_url( $blog['blog_id'] ) ) . "' rel='permalink'>" . __( 'Visit' ) . '</a></span>'; 1959 $actions = array_filter( $actions ); 1960 echo $this->row_actions( $actions ); 1961 ?> 1962 </td> 1963 <?php 1964 break; 1965 1966 case 'lastupdated': ?> 1967 <td valign="top"> 1968 <?php 1969 if ( 'list' == $mode ) 1970 $date = 'Y/m/d'; 1971 else 1972 $date = 'Y/m/d \<\b\r \/\> g:i:s a'; 1973 echo ( $blog['last_updated'] == '0000-00-00 00:00:00' ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] ); ?> 1974 </td> 1975 <?php 1976 break; 1977 case 'registered': ?> 1978 <td valign="top"> 1979 <?php 1980 if ( $blog['registered'] == '0000-00-00 00:00:00' ) 1981 echo '—'; 1982 else 1983 echo mysql2date( $date, $blog['registered'] ); 1984 ?> 1985 </td> 1986 <?php 1987 break; 1988 case 'users': ?> 1989 <td valign="top"> 1990 <?php 1991 $blogusers = get_users( array( 'blog_id' => $blog['blog_id'], 'number' => 6) ); 1992 if ( is_array( $blogusers ) ) { 1993 $blogusers_warning = ''; 1994 if ( count( $blogusers ) > 5 ) { 1995 $blogusers = array_slice( $blogusers, 0, 5 ); 1996 $blogusers_warning = __( 'Only showing first 5 users.' ) . ' <a href="' . esc_url( get_admin_url( $blog['blog_id'], 'users.php' ) ) . '">' . __( 'More' ) . '</a>'; 1997 } 1998 foreach ( $blogusers as $user_object ) { 1999 echo '<a href="' . esc_url( admin_url( 'user-edit.php?user_id=' . $user_object->ID ) ) . '">' . esc_html( $user_object->user_login ) . '</a> '; 2000 if ( 'list' != $mode ) 2001 echo '( ' . $user_object->user_email . ' )'; 2002 echo '<br />'; 2003 } 2004 if ( $blogusers_warning != '' ) 2005 echo '<strong>' . $blogusers_warning . '</strong><br />'; 2006 } 2007 ?> 2008 </td> 2009 <?php 2010 break; 2011 2012 case 'plugins': ?> 2013 <?php if ( has_filter( 'wpmublogsaction' ) ) { ?> 2014 <td valign="top"> 2015 <?php do_action( 'wpmublogsaction', $blog['blog_id'] ); ?> 2016 </td> 2017 <?php } ?> 2018 <?php break; 2019 2020 default: ?> 2021 <?php if ( has_filter( 'manage_blogs_custom_column' ) ) { ?> 2022 <td valign="top"> 2023 <?php do_action( 'manage_blogs_custom_column', $column_name, $blog['blog_id'] ); ?> 2024 </td> 2025 <?php } ?> 2026 <?php break; 2027 } 2028 } 2029 ?> 2030 </tr> 2031 <?php 2032 } 2033 } 2034 } 2035 2036 class WP_MS_Users_Table extends WP_List_Table { 2037 2038 function WP_MS_Users_Table() { 2039 parent::WP_List_Table( array( 2040 'screen' => 'users-network', 2041 ) ); 2042 } 2043 2044 function check_permissions() { 2045 if ( !is_multisite() ) 2046 wp_die( __( 'Multisite support is not enabled.' ) ); 2047 2048 if ( ! current_user_can( 'manage_network_users' ) ) 2049 wp_die( __( 'You do not have permission to access this page.' ) ); 2050 } 2051 2052 function prepare_items() { 2053 global $usersearch; 2054 2055 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : ''; 2056 2057 $users_per_page = $this->get_items_per_page( 'users_network_per_page' ); 2058 2059 $paged = $this->get_pagenum(); 2060 2061 $args = array( 2062 'number' => $users_per_page, 2063 'offset' => ( $paged-1 ) * $users_per_page, 2064 'search' => $usersearch, 2065 'blog_id' => 0 2066 ); 2067 2068 if ( isset( $_REQUEST['orderby'] ) ) 2069 $args['orderby'] = $_REQUEST['orderby']; 2070 2071 if ( isset( $_REQUEST['order'] ) ) 2072 $args['order'] = $_REQUEST['order']; 2073 2074 // Query the user IDs for this page 2075 $wp_user_search = new WP_User_Query( $args ); 2076 2077 $this->items = $wp_user_search->get_results(); 2078 2079 $this->set_pagination_args( array( 2080 'total_items' => $wp_user_search->get_total(), 2081 'per_page' => $users_per_page, 2082 ) ); 2083 } 2084 2085 function get_bulk_actions() { 2086 $actions = array(); 2087 $actions['delete'] = __( 'Delete' ); 2088 $actions['spam'] = _x( 'Mark as Spam', 'user' ); 2089 $actions['notspam'] = _x( 'Not Spam', 'user' ); 2090 2091 return $actions; 2092 } 2093 2094 function no_items() { 2095 _e( 'No users found.' ); 2096 } 2097 2098 function pagination( $which ) { 2099 global $mode; 2100 2101 parent::pagination ( $which ); 2102 2103 if ( 'top' == $which ) 2104 $this->view_switcher( $mode ); 2105 } 2106 2107 function get_columns() { 2108 $users_columns = array( 2109 'cb' => '<input type="checkbox" />', 2110 'login' => __( 'Login' ), 2111 'name' => __( 'Name' ), 2112 'email' => __( 'E-mail' ), 2113 'registered' => _x( 'Registered', 'user' ), 2114 'blogs' => __( 'Sites' ) 2115 ); 2116 $users_columns = apply_filters( 'wpmu_users_columns', $users_columns ); 2117 2118 return $users_columns; 2119 } 2120 2121 function get_sortable_columns() { 2122 return array( 2123 'id' => 'id', 2124 'login' => 'login', 2125 'name' => 'name', 2126 'email' => 'email', 2127 'registered' => 'registered', 2128 ); 2129 } 2130 2131 function display_rows() { 2132 global $current_site, $mode; 2133 2134 $class = ''; 2135 $super_admins = get_super_admins(); 2136 foreach ( $this->items as $user ) { 2137 $class = ( 'alternate' == $class ) ? '' : 'alternate'; 2138 2139 $status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' ); 2140 2141 foreach ( $status_list as $status => $col ) { 2142 if ( $user->$status ) 2143 $class = $col; 2144 } 2145 2146 ?> 2147 <tr class="<?php echo $class; ?>"> 2148 <?php 2149 2150 list( $columns, $hidden ) = $this->get_column_info(); 2151 2152 foreach ( $columns as $column_name => $column_display_name ) : 2153 switch ( $column_name ) { 2154 case 'cb': ?> 2155 <th scope="row" class="check-column"> 2156 <input type="checkbox" id="blog_<?php echo $user->ID ?>" name="allusers[]" value="<?php echo esc_attr( $user->ID ) ?>" /> 2157 </th> 2158 <?php 2159 break; 2160 2161 case 'id': ?> 2162 <th valign="top" scope="row"> 2163 <?php echo $user->ID ?> 2164 </th> 2165 <?php 2166 break; 2167 2168 case 'login': 2169 $avatar = get_avatar( $user->user_email, 32 ); 2170 $edit_link = ( get_current_user_id() == $user->ID ) ? 'profile.php' : 'user-edit.php?user_id=' . $user->ID; 2171 ?> 2172 <td class="username column-username"> 2173 <?php echo $avatar; ?><strong><a href="<?php echo esc_url( self_admin_url( $edit_link ) ); ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a><?php 2174 if ( in_array( $user->user_login, $super_admins ) ) 2175 echo ' - ' . __( 'Super admin' ); 2176 ?></strong> 2177 <br/> 2178 <?php 2179 $actions = array(); 2180 $actions['edit'] = '<a href="' . esc_url( self_admin_url( $edit_link ) ) . '">' . __( 'Edit' ) . '</a>'; 2181 2182 if ( ! in_array( $user->user_login, $super_admins ) ) { 2183 $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deleteuser' ) . '&action=deleteuser&id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>'; 2184 } 2185 2186 echo $this->row_actions( $actions ); 2187 ?> 2188 </div> 2189 </td> 2190 <?php 2191 break; 2192 2193 case 'name': ?> 2194 <td class="name column-name"><?php echo $user->display_name ?></td> 2195 <?php 2196 break; 2197 2198 case 'email': ?> 2199 <td class="email column-email"><a href="mailto:<?php echo $user->user_email ?>"><?php echo $user->user_email ?></a></td> 2200 <?php 2201 break; 2202 2203 case 'registered': 2204 if ( 'list' == $mode ) 2205 $date = 'Y/m/d'; 2206 else 2207 $date = 'Y/m/d \<\b\r \/\> g:i:s a'; 2208 ?> 2209 <td><?php echo mysql2date( $date, $user->user_registered ); ?></td> 2210 <?php 2211 break; 2212 2213 case 'blogs': 2214 $blogs = get_blogs_of_user( $user->ID, true ); 2215 ?> 2216 <td> 2217 <?php 2218 if ( is_array( $blogs ) ) { 2219 foreach ( (array) $blogs as $key => $val ) { 2220 $path = ( $val->path == '/' ) ? '' : $val->path; 2221 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . str_replace( '.' . $current_site->domain, '', $val->domain . $path ) . '</a>'; 2222 echo ' <small class="row-actions">'; 2223 2224 // Edit 2225 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . __( 'Edit' ) . '</a> | '; 2226 2227 // View 2228 echo '<a '; 2229 if ( get_blog_status( $val->userblog_id, 'spam' ) == 1 ) 2230 echo 'style="background-color: #faa" '; 2231 echo 'href="' . esc_url( get_home_url( $val->userblog_id ) ) . '">' . __( 'View' ) . '</a>'; 2232 2233 echo '</small><br />'; 2234 } 2235 } 2236 ?> 2237 </td> 2238 <?php 2239 break; 2240 2241 default: ?> 2242 <td><?php do_action( 'manage_users_custom_column', $column_name, $user->ID ); ?></td> 2243 <?php 2244 break; 2245 } 2246 endforeach 2247 ?> 2248 </tr> 2249 <?php 2250 } 2251 } 2252 } 2253 2254 class WP_Plugins_Table extends WP_List_Table { 2255 2256 function WP_Plugins_Table() { 2257 global $status, $page; 2258 2259 $default_status = get_user_option( 'plugins_last_view' ); 2260 if ( empty( $default_status ) ) 2261 $default_status = 'all'; 2262 $status = isset( $_REQUEST['plugin_status'] ) ? $_REQUEST['plugin_status'] : $default_status; 2263 if ( !in_array( $status, array( 'all', 'active', 'inactive', 'recently_activated', 'upgrade', 'network', 'mustuse', 'dropins', 'search' ) ) ) 2264 $status = 'all'; 2265 if ( $status != $default_status && 'search' != $status ) 2266 update_user_meta( get_current_user_id(), 'plugins_last_view', $status ); 2267 2268 $page = $this->get_pagenum(); 2269 2270 parent::WP_List_Table( array( 2271 'screen' => 'plugins', 2272 'plural' => 'plugins', 2273 ) ); 2274 } 2275 2276 function check_permissions() { 2277 if ( is_multisite() ) { 2278 $menu_perms = get_site_option( 'menu_items', array() ); 2279 2280 if ( empty( $menu_perms['plugins'] ) ) { 2281 if ( !is_super_admin() ) 2282 wp_die( __( 'Cheatin’ uh?' ) ); 2283 } 2284 } 2285 2286 if ( !current_user_can('activate_plugins') ) 2287 wp_die( __( 'You do not have sufficient permissions to manage plugins for this site.' ) ); 2288 } 2289 2290 function prepare_items() { 2291 global $status, $plugins, $totals, $page, $orderby, $order, $s; 2292 2293 wp_reset_vars( array( 'orderby', 'order', 's' ) ); 2294 2295 $plugins = array( 2296 'all' => apply_filters( 'all_plugins', get_plugins() ), 2297 'search' => array(), 2298 'active' => array(), 2299 'inactive' => array(), 2300 'recently_activated' => array(), 2301 'upgrade' => array(), 2302 'mustuse' => array(), 2303 'dropins' => array() 2304 ); 2305 2306 if ( ! is_multisite() || ( is_network_admin() && current_user_can('manage_network_plugins') ) ) { 2307 if ( apply_filters( 'show_advanced_plugins', true, 'mustuse' ) ) 2308 $plugins['mustuse'] = get_mu_plugins(); 2309 if ( apply_filters( 'show_advanced_plugins', true, 'dropins' ) ) 2310 $plugins['dropins'] = get_dropins(); 2311 } 2312 2313 set_transient( 'plugin_slugs', array_keys( $plugins['all'] ), 86400 ); 2314 2315 $recently_activated = get_option( 'recently_activated', array() ); 2316 2317 $one_week = 7*24*60*60; 2318 foreach ( $recently_activated as $key => $time ) 2319 if ( $time + $one_week < time() ) 2320 unset( $recently_activated[$key] ); 2321 update_option( 'recently_activated', $recently_activated ); 2322 2323 $current = get_site_transient( 'update_plugins' ); 2324 2325 foreach ( array( 'all', 'mustuse', 'dropins' ) as $type ) { 2326 foreach ( (array) $plugins[$type] as $plugin_file => $plugin_data ) { 2327 // Translate, Apply Markup, Sanitize HTML 2328 $plugins[$type][$plugin_file] = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, false, true ); 2329 } 2330 } 2331 2332 foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) { 2333 // Filter into individual sections 2334 if ( is_plugin_active_for_network($plugin_file) && !is_network_admin() ) { 2335 unset( $plugins['all'][ $plugin_file ] ); 2336 continue; 2337 } elseif ( is_multisite() && is_network_only_plugin( $plugin_file ) && !current_user_can( 'manage_network_plugins' ) ) { 2338 $plugins['network'][ $plugin_file ] = $plugin_data; 2339 } elseif ( ( !is_network_admin() && is_plugin_active( $plugin_file ) ) 2340 || ( is_network_admin() && is_plugin_active_for_network( $plugin_file ) ) ) { 2341 $plugins['active'][ $plugin_file ] = $plugin_data; 2342 } else { 2343 if ( !is_network_admin() && isset( $recently_activated[ $plugin_file ] ) ) // Was the plugin recently activated? 2344 $plugins['recently_activated'][ $plugin_file ] = $plugin_data; 2345 $plugins['inactive'][ $plugin_file ] = $plugin_data; 2346 } 2347 2348 if ( isset( $current->response[ $plugin_file ] ) ) 2349 $plugins['upgrade'][ $plugin_file ] = $plugin_data; 2350 } 2351 2352 if ( !current_user_can( 'update_plugins' ) ) 2353 $plugins['upgrade'] = array(); 2354 2355 if ( $s ) { 2356 $status = 'search'; 2357 $plugins['search'] = array_filter( $plugins['all'], array( $this, '_search_callback' ) ); 2358 } 2359 2360 $totals = array(); 2361 foreach ( $plugins as $type => $list ) 2362 $totals[ $type ] = count( $list ); 2363 2364 if ( empty( $plugins[ $status ] ) && !in_array( $status, array( 'all', 'search' ) ) ) 2365 $status = 'all'; 2366 2367 $this->items = $plugins[ $status ]; 2368 $total_this_page = $totals[ $status ]; 2369 2370 if ( $orderby ) { 2371 $orderby = ucfirst( $orderby ); 2372 $order = strtoupper( $order ); 2373 2374 uasort( $this->items, array( $this, '_order_callback' ) ); 2375 } 2376 2377 $plugins_per_page = $this->get_items_per_page( 'plugins_per_page', 999 ); 2378 2379 $start = ( $page - 1 ) * $plugins_per_page; 2380 2381 if ( $total_this_page > $plugins_per_page ) 2382 $this->items = array_slice( $this->items, $start, $plugins_per_page ); 2383 2384 $this->set_pagination_args( array( 2385 'total_items' => $total_this_page, 2386 'per_page' => $plugins_per_page, 2387 ) ); 2388 } 2389 2390 function _search_callback( $plugin ) { 2391 static $term; 2392 if ( is_null( $term ) ) 2393 $term = stripslashes( $_REQUEST['s'] ); 2394 2395 foreach ( $plugin as $value ) 2396 if ( stripos( $value, $term ) !== false ) 2397 return true; 2398 2399 return false; 2400 } 2401 2402 function _order_callback( $plugin_a, $plugin_b ) { 2403 global $orderby, $order; 2404 2405 $a = $plugin_a[$orderby]; 2406 $b = $plugin_b[$orderby]; 2407 2408 if ( $a == $b ) 2409 return 0; 2410 2411 if ( 'DESC' == $order ) 2412 return ( $a < $b ) ? 1 : -1; 2413 else 2414 return ( $a < $b ) ? -1 : 1; 2415 } 2416 2417 function no_items() { 2418 global $plugins; 2419 2420 if ( !empty( $plugins['all'] ) ) 2421 _e( 'No plugins found.' ); 2422 else 2423 _e( 'You do not appear to have any plugins available at this time.' ); 2424 } 2425 2426 function get_columns() { 2427 global $status; 2428 2429 return array( 2430 'cb' => !in_array( $status, array( 'mustuse', 'dropins' ) ) ? '<input type="checkbox" />' : '', 2431 'name' => __( 'Plugin' ), 2432 'description' => __( 'Description' ), 2433 ); 2434 } 2435 2436 function get_sortable_columns() { 2437 return array( 2438 'name' => 'name', 2439 'description' => 'description', 2440 ); 2441 } 2442 2443 function display_tablenav( $which ) { 2444 global $status; 2445 2446 if ( !in_array( $status, array( 'mustuse', 'dropins' ) ) ) 2447 parent::display_tablenav( $which ); 2448 } 2449 2450 function get_views() { 2451 global $totals, $status; 2452 2453 $status_links = array(); 2454 foreach ( $totals as $type => $count ) { 2455 if ( !$count ) 2456 continue; 2457 2458 switch ( $type ) { 2459 case 'all': 2460 $text = _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $count, 'plugins' ); 2461 break; 2462 case 'active': 2463 $text = _n( 'Active <span class="count">(%s)</span>', 'Active <span class="count">(%s)</span>', $count ); 2464 break; 2465 case 'recently_activated': 2466 $text = _n( 'Recently Active <span class="count">(%s)</span>', 'Recently Active <span class="count">(%s)</span>', $count ); 2467 break; 2468 case 'inactive': 2469 $text = _n( 'Inactive <span class="count">(%s)</span>', 'Inactive <span class="count">(%s)</span>', $count ); 2470 break; 2471 case 'network': 2472 $text = _n( 'Network <span class="count">(%s)</span>', 'Network <span class="count">(%s)</span>', $count ); 2473 break; 2474 case 'mustuse': 2475 $text = _n( 'Must-Use <span class="count">(%s)</span>', 'Must-Use <span class="count">(%s)</span>', $count ); 2476 break; 2477 case 'dropins': 2478 $text = _n( 'Drop-ins <span class="count">(%s)</span>', 'Drop-ins <span class="count">(%s)</span>', $count ); 2479 break; 2480 case 'upgrade': 2481 $text = _n( 'Upgrade Available <span class="count">(%s)</span>', 'Upgrade Available <span class="count">(%s)</span>', $count ); 2482 break; 2483 case 'search': 2484 $text = _n( 'Search Results <span class="count">(%s)</span>', 'Search Results <span class="count">(%s)</span>', $count ); 2485 break; 2486 } 2487 2488 $status_links[$type] = sprintf( "<li><a href='%s' %s>%s</a>", 2489 add_query_arg('plugin_status', $type, 'plugins.php'), 2490 ( $type == $status ) ? ' class="current"' : '', 2491 sprintf( $text, number_format_i18n( $count ) ) 2492 ); 2493 } 2494 2495 return $status_links; 2496 } 2497 2498 function get_bulk_actions() { 2499 global $status; 2500 2501 $actions = array(); 2502 if ( 'active' != $status ) 2503 $actions['activate-selected'] = __( 'Activate' ); 2504 if ( is_multisite() && 'network' != $status ) 2505 $actions['network-activate-selected'] = __( 'Network Activate' ); 2506 if ( 'inactive' != $status && 'recent' != $status ) 2507 $actions['deactivate-selected'] = __( 'Deactivate' ); 2508 if ( current_user_can( 'update_plugins' ) ) 2509 $actions['update-selected'] = __( 'Update' ); 2510 if ( current_user_can( 'delete_plugins' ) && ( 'active' != $status ) ) 2511 $actions['delete-selected'] = __( 'Delete' ); 2512 2513 return $actions; 2514 } 2515 2516 function bulk_actions( $which ) { 2517 global $status; 2518 2519 if ( in_array( $status, array( 'mustuse', 'dropins' ) ) ) 2520 return; 2521 2522 parent::bulk_actions( $which ); 2523 } 2524 2525 function extra_tablenav( $which ) { 2526 global $status; 2527 2528 if ( 'recently_activated' == $status ) { ?> 2529 <div class="alignleft actions"> 2530 <input type="submit" name="clear-recent-list" value="<?php esc_attr_e( 'Clear List' ) ?>" class="button-secondary" /> 2531 </div> 2532 <?php } 2533 } 2534 2535 function current_action() { 2536 if ( isset($_POST['clear-recent-list']) ) 2537 return 'clear-recent-list'; 2538 2539 return parent::current_action(); 2540 } 2541 2542 function display_rows() { 2543 global $status, $page, $s; 2544 2545 $context = $status; 2546 2547 foreach ( $this->items as $plugin_file => $plugin_data ) { 2548 // preorder 2549 $actions = array( 2550 'network_deactivate' => '', 'deactivate' => '', 2551 'network_only' => '', 'activate' => '', 2552 'network_activate' => '', 2553 'edit' => '', 2554 'delete' => '', 2555 ); 2556 2557 if ( 'mustuse' == $context ) { 2558 if ( is_multisite() && !is_network_admin() ) 2559 continue; 2560 $is_active = true; 2561 } elseif ( 'dropins' == $context ) { 2562 if ( is_multisite() && !is_network_admin() ) 2563 continue; 2564 $dropins = _get_dropins(); 2565 $plugin_name = $plugin_file; 2566 if ( $plugin_file != $plugin_data['Name'] ) 2567 $plugin_name .= '<br/>' . $plugin_data['Name']; 2568 if ( true === ( $dropins[ $plugin_file ][1] ) ) { // Doesn't require a constant 2569 $is_active = true; 2570 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>'; 2571 } elseif ( constant( $dropins[ $plugin_file ][1] ) ) { // Constant is true 2572 $is_active = true; 2573 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>'; 2574 } else { 2575 $is_active = false; 2576 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . ' <span class="attention">' . __('Inactive:') . '</span></strong> ' . sprintf( __( 'Requires <code>%s</code> in <code>wp-config.php</code>.' ), "define('" . $dropins[ $plugin_file ][1] . "', true);" ) . '</p>'; 2577 } 2578 if ( $plugin_data['Description'] ) 2579 $description .= '<p>' . $plugin_data['Description'] . '</p>'; 2580 } else { 2581 $is_active_for_network = is_plugin_active_for_network($plugin_file); 2582 if ( is_network_admin() ) 2583 $is_active = $is_active_for_network; 2584 else 2585 $is_active = is_plugin_active( $plugin_file ); 2586 2587 if ( $is_active_for_network && !is_super_admin() && !is_network_admin() ) 2588 continue; 2589 2590 if ( is_network_admin() ) { 2591 if ( $is_active_for_network ) { 2592 if ( current_user_can( 'manage_network_plugins' ) ) 2593 $actions['network_deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Network Deactivate') . '</a>'; 2594 } else { 2595 if ( current_user_can( 'manage_network_plugins' ) ) 2596 $actions['network_activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin for all sites in this network') . '" class="edit">' . __('Network Activate') . '</a>'; 2597 if ( current_user_can('delete_plugins') ) 2598 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>'; 2599 } 2600 } else { 2601 if ( $is_active ) { 2602 $actions['deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Deactivate') . '</a>'; 2603 } else { 2604 if ( is_network_only_plugin( $plugin_file ) && !is_network_admin() ) 2605 continue; 2606 2607 $actions['activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin') . '" class="edit">' . __('Activate') . '</a>'; 2608 2609 if ( current_user_can('delete_plugins') ) 2610 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>'; 2611 } // end if $is_active 2612 } // end if is_network_admin() 2613 2614 if ( current_user_can('edit_plugins') && is_writable(WP_PLUGIN_DIR . '/' . $plugin_file) ) 2615 $actions['edit'] = '<a href="plugin-editor.php?file=' . $plugin_file . '" title="' . __('Open this file in the Plugin Editor') . '" class="edit">' . __('Edit') . '</a>'; 2616 } // end if $context 2617 2618 $actions = apply_filters( 'plugin_action_links', array_filter( $actions ), $plugin_file, $plugin_data, $context ); 2619 $actions = apply_filters( "plugin_action_links_$plugin_file", $actions, $plugin_file, $plugin_data, $context ); 2620 2621 $class = $is_active ? 'active' : 'inactive'; 2622 $checkbox = in_array( $status, array( 'mustuse', 'dropins' ) ) ? '' : "<input type='checkbox' name='checked[]' value='" . esc_attr( $plugin_file ) . "' />"; 2623 if ( 'dropins' != $status ) { 2624 $description = '<p>' . $plugin_data['Description'] . '</p>'; 2625 $plugin_name = $plugin_data['Name']; 2626 } 2627 2628 $id = sanitize_title( $plugin_name ); 2629 2630 echo " 2631 <tr id='$id' class='$class'> 2632 <th scope='row' class='check-column'>$checkbox</th> 2633 <td class='plugin-title'><strong>$plugin_name</strong></td> 2634 <td class='desc'>$description</td> 2635 </tr> 2636 <tr class='$class second'> 2637 <td></td> 2638 <td class='plugin-title'>"; 2639 2640 echo $this->row_actions( $actions, true ); 2641 2642 echo "</td> 2643 <td class='desc'>"; 2644 $plugin_meta = array(); 2645 if ( !empty( $plugin_data['Version'] ) ) 2646 $plugin_meta[] = sprintf( __( 'Version %s' ), $plugin_data['Version'] ); 2647 if ( !empty( $plugin_data['Author'] ) ) { 2648 $author = $plugin_data['Author']; 2649 if ( !empty( $plugin_data['AuthorURI'] ) ) 2650 $author = '<a href="' . $plugin_data['AuthorURI'] . '" title="' . __( 'Visit author homepage' ) . '">' . $plugin_data['Author'] . '</a>'; 2651 $plugin_meta[] = sprintf( __( 'By %s' ), $author ); 2652 } 2653 if ( ! empty( $plugin_data['PluginURI'] ) ) 2654 $plugin_meta[] = '<a href="' . $plugin_data['PluginURI'] . '" title="' . __( 'Visit plugin site' ) . '">' . __( 'Visit plugin site' ) . '</a>'; 2655 2656 $plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status ); 2657 echo implode( ' | ', $plugin_meta ); 2658 echo "</td> 2659 </tr>\n"; 2660 2661 do_action( 'after_plugin_row', $plugin_file, $plugin_data, $status ); 2662 do_action( "after_plugin_row_$plugin_file", $plugin_file, $plugin_data, $status ); 2663 } 2664 } 2665 } 2666 2667 class WP_Plugin_Install_Table extends WP_List_Table { 2668 2669 function WP_Plugin_Install_Table() { 2670 parent::WP_List_Table( array( 2671 'screen' => 'plugin-install', 2672 ) ); 2673 } 2674 2675 function check_permissions() { 2676 if ( ! current_user_can('install_plugins') ) 2677 wp_die(__('You do not have sufficient permissions to install plugins on this site.')); 2678 } 2679 2680 function prepare_items() { 2681 include( ABSPATH . 'wp-admin/includes/plugin-install.php' ); 2682 2683 global $tabs, $tab, $paged, $type, $term; 2684 2685 wp_reset_vars( array( 'tab' ) ); 2686 2687 $paged = $this->get_pagenum(); 2688 2689 $per_page = 30; 2690 2691 // These are the tabs which are shown on the page 2692 $tabs = array(); 2693 $tabs['dashboard'] = __( 'Search' ); 2694 if ( 'search' == $tab ) 2695 $tabs['search'] = __( 'Search Results' ); 2696 $tabs['upload'] = __( 'Upload' ); 2697 $tabs['featured'] = _x( 'Featured','Plugin Installer' ); 2698 $tabs['popular'] = _x( 'Popular','Plugin Installer' ); 2699 $tabs['new'] = _x( 'Newest','Plugin Installer' ); 2700 $tabs['updated'] = _x( 'Recently Updated','Plugin Installer' ); 2701 2702 $nonmenu_tabs = array( 'plugin-information' ); //Valid actions to perform which do not have a Menu item. 2703 2704 $tabs = apply_filters( 'install_plugins_tabs', $tabs ); 2705 $nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs ); 2706 2707 // If a non-valid menu tab has been selected, And its not a non-menu action. 2708 if ( empty( $tab ) || ( !isset( $tabs[ $tab ] ) && !in_array( $tab, (array) $nonmenu_tabs ) ) ) 2709 $tab = key( $tabs ); 2710 2711 $args = array( 'page' => $paged, 'per_page' => $per_page ); 2712 2713 switch ( $tab ) { 2714 case 'search': 2715 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : ''; 2716 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : ''; 2717 2718 switch ( $type ) { 2719 case 'tag': 2720 $args['tag'] = sanitize_title_with_dashes( $term ); 2721 break; 2722 case 'term': 2723 $args['search'] = $term; 2724 break; 2725 case 'author': 2726 $args['author'] = $term; 2727 break; 2728 } 2729 2730 add_action( 'install_plugins_table_header', 'install_search_form' ); 2731 break; 2732 2733 case 'featured': 2734 case 'popular': 2735 case 'new': 2736 case 'updated': 2737 $args['browse'] = $tab; 2738 break; 2739 2740 default: 2741 $args = false; 2742 } 2743 2744 if ( !$args ) 2745 return; 2746 2747 $api = plugins_api( 'query_plugins', $args ); 2748 2749 if ( is_wp_error( $api ) ) 2750 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' ); 2751 2752 $this->items = $api->plugins; 2753 2754 $this->set_pagination_args( array( 2755 'total_items' => $api->info['results'], 2756 'per_page' => $per_page, 2757 ) ); 2758 } 2759 2760 function no_items() { 2761 _e( 'No plugins match your request.' ); 2762 } 2763 2764 function get_views() { 2765 global $tabs, $tab; 2766 2767 $display_tabs = array(); 2768 foreach ( (array) $tabs as $action => $text ) { 2769 $class = ( $action == $tab ) ? ' class="current"' : ''; 2770 $href = admin_url('plugin-install.php?tab=' . $action); 2771 $display_tabs[$action] = "<a href='$href'$class>$text</a>"; 2772 } 2773 2774 return $display_tabs; 2775 } 2776 2777 function display_tablenav( $which ) { 2778 if ( 'top' == $which ) { ?> 2779 <div class="tablenav"> 2780 <div class="alignleft actions"> 2781 <?php do_action( 'install_plugins_table_header' ); ?> 2782 </div> 2783 <?php $this->pagination( $which ); ?> 2784 <br class="clear" /> 2785 </div> 2786 <?php } else { ?> 2787 <div class="tablenav"> 2788 <?php $this->pagination( $which ); ?> 2789 <br class="clear" /> 2790 </div> 2791 <?php 2792 } 2793 } 2794 2795 function get_table_classes() { 2796 extract( $this->_args ); 2797 2798 return array( 'widefat', $plural ); 2799 } 2800 2801 function get_columns() { 2802 return array( 2803 'name' => __( 'Name' ), 2804 'version' => __( 'Version' ), 2805 'rating' => __( 'Rating' ), 2806 'description' => __( 'Description' ), 2807 ); 2808 } 2809 2810 function display_rows() { 2811 $plugins_allowedtags = array( 2812 'a' => array( 'href' => array(),'title' => array(), 'target' => array() ), 2813 'abbr' => array( 'title' => array() ),'acronym' => array( 'title' => array() ), 2814 'code' => array(), 'pre' => array(), 'em' => array(),'strong' => array(), 2815 'ul' => array(), 'ol' => array(), 'li' => array(), 'p' => array(), 'br' => array() 2816 ); 2817 2818 foreach ( (array) $this->items as $plugin ) { 2819 if ( is_object( $plugin ) ) 2820 $plugin = (array) $plugin; 2821 2822 $title = wp_kses( $plugin['name'], $plugins_allowedtags ); 2823 //Limit description to 400char, and remove any HTML. 2824 $description = strip_tags( $plugin['description'] ); 2825 if ( strlen( $description ) > 400 ) 2826 $description = mb_substr( $description, 0, 400 ) . '…'; 2827 //remove any trailing entities 2828 $description = preg_replace( '/&[^;\s]{0,6}$/', '', $description ); 2829 //strip leading/trailing & multiple consecutive lines 2830 $description = trim( $description ); 2831 $description = preg_replace( "|(\r?\n)+|", "\n", $description ); 2832 //\n => <br> 2833 $description = nl2br( $description ); 2834 $version = wp_kses( $plugin['version'], $plugins_allowedtags ); 2835 2836 $name = strip_tags( $title . ' ' . $version ); 2837 2838 $author = $plugin['author']; 2839 if ( ! empty( $plugin['author'] ) ) 2840 $author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '.</cite>'; 2841 2842 $author = wp_kses( $author, $plugins_allowedtags ); 2843 2844 $action_links = array(); 2845 $action_links[] = '<a href="' . admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin['slug'] . 2846 '&TB_iframe=true&width=600&height=550' ) . '" class="thickbox" title="' . 2847 esc_attr( sprintf( __( 'More information about %s' ), $name ) ) . '">' . __( 'Details' ) . '</a>'; 2848 2849 if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) { 2850 $status = install_plugin_install_status( $plugin ); 2851 2852 switch ( $status['status'] ) { 2853 case 'install': 2854 if ( $status['url'] ) 2855 $action_links[] = '<a class="install-now" href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Install %s' ), $name ) ) . '">' . __( 'Install Now' ) . '</a>'; 2856 break; 2857 case 'update_available': 2858 if ( $status['url'] ) 2859 $action_links[] = '<a href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Update to version %s' ), $status['version'] ) ) . '">' . sprintf( __( 'Update Now' ), $status['version'] ) . '</a>'; 2860 break; 2861 case 'latest_installed': 2862 case 'newer_installed': 2863 $action_links[] = '<span title="' . esc_attr__( 'This plugin is already installed and is up to date' ) . ' ">' . __( 'Installed' ) . '</span>'; 2864 break; 2865 } 2866 } 2867 2868 $action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin ); 2869 ?> 2870 <tr> 2871 <td class="name"><strong><?php echo $title; ?></strong> 2872 <div class="action-links"><?php if ( !empty( $action_links ) ) echo implode( ' | ', $action_links ); ?></div> 2873 </td> 2874 <td class="vers"><?php echo $version; ?></td> 2875 <td class="vers"> 2876 <div class="star-holder" title="<?php printf( _n( '( based on %s rating )', '( based on %s ratings )', $plugin['num_ratings'] ), number_format_i18n( $plugin['num_ratings'] ) ) ?>"> 2877 <div class="star star-rating" style="width: <?php echo esc_attr( $plugin['rating'] ) ?>px"></div> 2878 <div class="star star5"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '5 stars' ) ?>" /></div> 2879 <div class="star star4"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '4 stars' ) ?>" /></div> 2880 <div class="star star3"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '3 stars' ) ?>" /></div> 2881 <div class="star star2"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '2 stars' ) ?>" /></div> 2882 <div class="star star1"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '1 star' ) ?>" /></div> 2883 </div> 2884 </td> 2885 <td class="desc"><?php echo $description, $author; ?></td> 2886 </tr> 2887 <?php 2888 } 2889 } 2890 } 2891 2892 class WP_Themes_Table extends WP_List_Table { 2893 2894 var $search = array(); 2895 var $features = array(); 2896 2897 function WP_Themes_Table() { 2898 parent::__construct( array( 2899 'screen' => 'themes', 2900 ) ); 2901 } 2902 2903 function check_permissions() { 2904 if ( !current_user_can('switch_themes') && !current_user_can('edit_theme_options') ) 2905 wp_die( __( 'Cheatin’ uh?' ) ); 2906 } 2907 2908 function prepare_items() { 2909 global $ct; 2910 2911 $ct = current_theme_info(); 2912 2913 $themes = get_allowed_themes(); 2914 2915 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : ''; 2916 2917 if ( '' !== $search ) { 2918 $this->search = array_merge( $this->search, array_filter( array_map( 'trim', explode( ',', $search ) ) ) ); 2919 $this->search = array_unique( $this->search ); 2920 } 2921 2922 if ( !empty( $_REQUEST['features'] ) ) { 2923 $this->features = $_REQUEST['features']; 2924 $this->features = array_map( 'trim', $this->features ); 2925 $this->features = array_map( 'sanitize_title_with_dashes', $this->features ); 2926 $this->features = array_unique( $this->features ); 2927 } 2928 2929 if ( $this->search || $this->features ) { 2930 foreach ( $themes as $key => $theme ) { 2931 if ( !$this->search_theme( $theme ) ) 2932 unset( $themes[ $key ] ); 2933 } 2934 } 2935 2936 unset( $themes[$ct->name] ); 2937 uksort( $themes, "strnatcasecmp" ); 2938 2939 $per_page = 15; 2940 $page = $this->get_pagenum(); 2941 2942 $start = ( $page - 1 ) * $per_page; 2943 2944 $this->items = array_slice( $themes, $start, $per_page ); 2945 2946 $this->set_pagination_args( array( 2947 'query_var' => 'pagenum', 2948 'total_items' => count( $themes ), 2949 'per_page' => $per_page, 2950 ) ); 2951 } 2952 2953 function no_items() { 2954 if ( current_user_can( 'install_themes' ) ) 2955 printf( __( 'You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress.org Theme Directory at any time: just click on the <em><a href="%s">Install Themes</a></em> tab above.' ), 'theme-install.php' ); 2956 else 2957 printf( __( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ), get_site_option( 'site_name' ) ); 2958 } 2959 2960 function display_table() { 2961 ?> 2962 <div class="tablenav"> 2963 <?php $this->pagination( 'top' ); ?> 2964 <br class="clear" /> 2965 </div> 2966 2967 <table id="availablethemes" cellspacing="0" cellpadding="0"> 2968 <tbody id="the-list" class="list:themes"> 2969 <?php $this->display_rows(); ?> 2970 </tbody> 2971 </table> 2972 2973 <div class="tablenav"> 2974 <?php $this->pagination( 'bottom' ); ?> 2975 <br class="clear" /> 2976 </div> 2977 <?php 2978 } 2979 2980 function get_columns() { 2981 return array(); 2982 } 2983 2984 function display_rows() { 2985 $themes = $this->items; 2986 $theme_names = array_keys( $themes ); 2987 natcasesort( $theme_names ); 2988 2989 $table = array(); 2990 $rows = ceil( count( $theme_names ) / 3 ); 2991 for ( $row = 1; $row <= $rows; $row++ ) 2992 for ( $col = 1; $col <= 3; $col++ ) 2993 $table[$row][$col] = array_shift( $theme_names ); 2994 2995 foreach ( $table as $row => $cols ) { 2996 ?> 2997 <tr> 2998 <?php 2999 foreach ( $cols as $col => $theme_name ) { 3000 $class = array( 'available-theme' ); 3001 if ( $row == 1 ) $class[] = 'top'; 3002 if ( $col == 1 ) $class[] = 'left'; 3003 if ( $row == $rows ) $class[] = 'bottom'; 3004 if ( $col == 3 ) $class[] = 'right'; 3005 ?> 3006 <td class="<?php echo join( ' ', $class ); ?>"> 3007 <?php if ( !empty( $theme_name ) ) : 3008 $template = $themes[$theme_name]['Template']; 3009 $stylesheet = $themes[$theme_name]['Stylesheet']; 3010 $title = $themes[$theme_name]['Title']; 3011 $version = $themes[$theme_name]['Version']; 3012 $description = $themes[$theme_name]['Description']; 3013 $author = $themes[$theme_name]['Author']; 3014 $screenshot = $themes[$theme_name]['Screenshot']; 3015 $stylesheet_dir = $themes[$theme_name]['Stylesheet Dir']; 3016 $template_dir = $themes[$theme_name]['Template Dir']; 3017 $parent_theme = $themes[$theme_name]['Parent Theme']; 3018 $theme_root = $themes[$theme_name]['Theme Root']; 3019 $theme_root_uri = $themes[$theme_name]['Theme Root URI']; 3020 $preview_link = esc_url( get_option( 'home' ) . '/' ); 3021 if ( is_ssl() ) 3022 $preview_link = str_replace( 'http://', 'https://', $preview_link ); 3023 $preview_link = htmlspecialchars( add_query_arg( array( 'preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'TB_iframe' => 'true' ), $preview_link ) ); 3024 $preview_text = esc_attr( sprintf( __( 'Preview of “%s”' ), $title ) ); 3025 $tags = $themes[$theme_name]['Tags']; 3026 $thickbox_class = 'thickbox thickbox-preview'; 3027 $activate_link = wp_nonce_url( "themes.php?action=activate&template=".urlencode( $template )."&stylesheet=".urlencode( $stylesheet ), 'switch-theme_' . $template ); 3028 $activate_text = esc_attr( sprintf( __( 'Activate “%s”' ), $title ) ); 3029 $actions = array(); 3030 $actions[] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __( 'Activate' ) . '</a>'; 3031 $actions[] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr( sprintf( __( 'Preview “%s”' ), $theme_name ) ) . '">' . __( 'Preview' ) . '</a>'; 3032 if ( current_user_can( 'delete_themes' ) ) 3033 $actions[] = '<a class="submitdelete deletion" href="' . wp_nonce_url( "themes.php?action=delete&template=$stylesheet", 'delete-theme_' . $stylesheet ) . '" onclick="' . "return confirm( '" . esc_js( sprintf( __( "You are about to delete this theme '%s'\n 'Cancel' to stop, 'OK' to delete." ), $theme_name ) ) . "' );" . '">' . __( 'Delete' ) . '</a>'; 3034 $actions = apply_filters( 'theme_action_links', $actions, $themes[$theme_name] ); 3035 3036 $actions = implode ( ' | ', $actions ); 3037 ?> 3038 <a href="<?php echo $preview_link; ?>" class="<?php echo $thickbox_class; ?> screenshot"> 3039 <?php if ( $screenshot ) : ?> 3040 <img src="<?php echo $theme_root_uri . '/' . $stylesheet . '/' . $screenshot; ?>" alt="" /> 3041 <?php endif; ?> 3042 </a> 3043 <h3><?php 3044 /* translators: 1: theme title, 2: theme version, 3: theme author */ 3045 printf( __( '%1$s %2$s by %3$s' ), $title, $version, $author ) ; ?></h3> 3046 <p class="description"><?php echo $description; ?></p> 3047 <span class='action-links'><?php echo $actions ?></span> 3048 <?php if ( current_user_can( 'edit_themes' ) && $parent_theme ) { 3049 /* translators: 1: theme title, 2: template dir, 3: stylesheet_dir, 4: theme title, 5: parent_theme */ ?> 3050 <p><?php printf( __( 'The template files are located in <code>%2$s</code>. The stylesheet files are located in <code>%3$s</code>. <strong>%4$s</strong> uses templates from <strong>%5$s</strong>. Changes made to the templates will affect both themes.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ), $title, $parent_theme ); ?></p> 3051 <?php } else { ?> 3052 <p><?php printf( __( 'All of this theme’s files are located in <code>%2$s</code>.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ) ); ?></p> 3053 <?php } ?> 3054 <?php if ( $tags ) : ?> 3055 <p><?php _e( 'Tags:' ); ?> <?php echo join( ', ', $tags ); ?></p> 3056 <?php endif; ?> 3057 <?php theme_update_available( $themes[$theme_name] ); ?> 3058 <?php endif; // end if not empty theme_name ?> 3059 </td> 3060 <?php } // end foreach $cols ?> 3061 </tr> 3062 <?php } // end foreach $table 3063 } 3064 3065 function search_theme( $theme ) { 3066 $matched = 0; 3067 3068 // Match all phrases 3069 if ( count( $this->search ) > 0 ) { 3070 foreach ( $this->search as $word ) { 3071 $matched = 0; 3072 3073 // In a tag? 3074 if ( in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) ) 3075 $matched = 1; 3076 3077 // In one of the fields? 3078 foreach ( array( 'Name', 'Title', 'Description', 'Author', 'Template', 'Stylesheet' ) AS $field ) { 3079 if ( stripos( $theme[$field], $word ) !== false ) 3080 $matched++; 3081 } 3082 3083 if ( $matched == 0 ) 3084 return false; 3085 } 3086 } 3087 3088 // Now search the features 3089 if ( count( $this->features ) > 0 ) { 3090 foreach ( $this->features as $word ) { 3091 // In a tag? 3092 if ( !in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) ) 3093 return false; 3094 } 3095 } 3096 3097 // Only get here if each word exists in the tags or one of the fields 3098 return true; 3099 } 3100 } 3101 3102 class WP_Theme_Install_Table extends WP_List_Table { 3103 3104 function WP_Theme_Install_Table() { 3105 parent::WP_List_Table( array( 3106 'screen' => 'theme-install', 3107 ) ); 3108 } 3109 3110 function check_permissions() { 3111 if ( ! current_user_can('install_themes') ) 3112 wp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) ); 3113 } 3114 3115 function prepare_items() { 3116 include( ABSPATH . 'wp-admin/includes/theme-install.php' ); 3117 3118 global $tabs, $tab, $paged, $type, $term, $theme_field_defaults; 3119 3120 wp_reset_vars( array( 'tab' ) ); 3121 3122 $paged = $this->get_pagenum(); 3123 3124 $per_page = 30; 3125 3126 // These are the tabs which are shown on the page, 3127 $tabs = array(); 3128 $tabs['dashboard'] = __( 'Search' ); 3129 if ( 'search' == $tab ) 3130 $tabs['search'] = __( 'Search Results' ); 3131 $tabs['upload'] = __( 'Upload' ); 3132 $tabs['featured'] = _x( 'Featured','Theme Installer' ); 3133 //$tabs['popular'] = _x( 'Popular','Theme Installer' ); 3134 $tabs['new'] = _x( 'Newest','Theme Installer' ); 3135 $tabs['updated'] = _x( 'Recently Updated','Theme Installer' ); 3136 3137 $nonmenu_tabs = array( 'theme-information' ); // Valid actions to perform which do not have a Menu item. 3138 3139 $tabs = apply_filters( 'install_themes_tabs', $tabs ); 3140 $nonmenu_tabs = apply_filters( 'install_themes_nonmenu_tabs', $nonmenu_tabs ); 3141 3142 // If a non-valid menu tab has been selected, And its not a non-menu action. 3143 if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs ) ) ) 3144 $tab = key( $tabs ); 3145 3146 $args = array( 'page' => $paged, 'per_page' => $per_page, 'fields' => $theme_field_defaults ); 3147 3148 switch ( $tab ) { 3149 case 'search': 3150 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : ''; 3151 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : ''; 3152 3153 switch ( $type ) { 3154 case 'tag': 3155 $terms = explode( ',', $term ); 3156 $terms = array_map( 'trim', $terms ); 3157 $terms = array_map( 'sanitize_title_with_dashes', $terms ); 3158 $args['tag'] = $terms; 3159 break; 3160 case 'term': 3161 $args['search'] = $term; 3162 break; 3163 case 'author': 3164 $args['author'] = $term; 3165 break; 3166 } 3167 3168 if ( !empty( $_POST['features'] ) ) { 3169 $terms = $_POST['features']; 3170 $terms = array_map( 'trim', $terms ); 3171 $terms = array_map( 'sanitize_title_with_dashes', $terms ); 3172 $args['tag'] = $terms; 3173 $_REQUEST['s'] = implode( ',', $terms ); 3174 $_REQUEST['type'] = 'tag'; 3175 } 3176 3177 add_action( 'install_themes_table_header', 'install_theme_search_form' ); 3178 break; 3179 3180 case 'featured': 3181 //case 'popular': 3182 case 'new': 3183 case 'updated': 3184 $args['browse'] = $tab; 3185 break; 3186 3187 default: 3188 $args = false; 3189 } 3190 3191 if ( !$args ) 3192 return; 3193 3194 $api = themes_api( 'query_themes', $args ); 3195 3196 if ( is_wp_error( $api ) ) 3197 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' ); 3198 3199 $this->items = $api->themes; 3200 3201 $this->set_pagination_args( array( 3202 'total_items' => $api->info['results'], 3203 'per_page' => $per_page, 3204 ) ); 3205 } 3206 3207 function no_items() { 3208 _e( 'No themes match your request.' ); 3209 } 3210 3211 function get_views() { 3212 global $tabs, $tab; 3213 3214 $display_tabs = array(); 3215 foreach ( (array) $tabs as $action => $text ) { 3216 $class = ( $action == $tab ) ? ' class="current"' : ''; 3217 $href = self_admin_url('theme-install.php?tab=' . $action); 3218 $display_tabs[$action] = "<a href='$href'$class>$text</a>"; 3219 } 3220 3221 return $display_tabs; 3222 } 3223 3224 function get_columns() { 3225 return array(); 3226 } 3227 3228 function display_table() { 3229 ?> 3230 <div class="tablenav"> 3231 <div class="alignleft actions"> 3232 <?php do_action( 'install_themes_table_header' ); ?> 3233 </div> 3234 <?php $this->pagination( 'top' ); ?> 3235 <br class="clear" /> 3236 </div> 3237 3238 <table id="availablethemes" cellspacing="0" cellpadding="0"> 3239 <tbody id="the-list" class="list:themes"> 3240 <?php $this->display_rows(); ?> 3241 </tbody> 3242 </table> 3243 3244 <div class="tablenav"> 3245 <?php $this->pagination( 'bottom' ); ?> 3246 <br class="clear" /> 3247 </div> 3248 <?php 3249 } 3250 3251 function display_rows() { 3252 $themes = $this->items; 3253 3254 $rows = ceil( count( $themes ) / 3 ); 3255 $table = array(); 3256 $theme_keys = array_keys( $themes ); 3257 for ( $row = 1; $row <= $rows; $row++ ) 3258 for ( $col = 1; $col <= 3; $col++ ) 3259 $table[$row][$col] = array_shift( $theme_keys ); 3260 3261 foreach ( $table as $row => $cols ) { 3262 echo "\t<tr>\n"; 3263 foreach ( $cols as $col => $theme_index ) { 3264 $class = array( 'available-theme' ); 3265 if ( $row == 1 ) $class[] = 'top'; 3266 if ( $col == 1 ) $class[] = 'left'; 3267 if ( $row == $rows ) $class[] = 'bottom'; 3268 if ( $col == 3 ) $class[] = 'right'; 3269 ?> 3270 <td class="<?php echo join( ' ', $class ); ?>"><?php 3271 if ( isset( $themes[$theme_index] ) ) 3272 display_theme( $themes[$theme_index] ); 3273 ?></td> 3274 <?php } // end foreach $cols 3275 echo "\t</tr>\n"; 3276 } // end foreach $table 3277 } 3278 } 3279 369 -
trunk/wp-admin/includes/list-table-theme-install.php
r15954 r15955 9 9 * @subpackage Administration 10 10 */ 11 12 class WP_Media_Table extends WP_List_Table {13 14 function WP_Media_Table() {15 global $detached;16 17 $detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );18 19 parent::WP_List_Table( array(20 'screen' => $detached ? 'upload-detached' : 'upload',21 'plural' => 'media'22 ) );23 }24 25 function check_permissions() {26 if ( !current_user_can('upload_files') )27 wp_die( __( 'You do not have permission to upload files.' ) );28 }29 30 function prepare_items() {31 global $lost, $wpdb, $wp_query, $post_mime_types, $avail_post_mime_types;32 33 $q = $_REQUEST;34 35 if ( !empty( $lost ) )36 $q['post__in'] = implode( ',', $lost );37 38 list( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $q );39 40 $this->is_trash = isset( $_REQUEST['status'] ) && 'trash' == $_REQUEST['status'];41 42 $this->set_pagination_args( array(43 'total_items' => $wp_query->found_posts,44 'total_pages' => $wp_query->max_num_pages,45 'per_page' => $wp_query->query_vars['posts_per_page'],46 ) );47 }48 49 function get_views() {50 global $wpdb, $post_mime_types, $detached, $avail_post_mime_types;51 52 $type_links = array();53 $_num_posts = (array) wp_count_attachments();54 $_total_posts = array_sum($_num_posts) - $_num_posts['trash'];55 if ( !isset( $total_orphans ) )56 $total_orphans = $wpdb->get_var( "SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent < 1" );57 $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));58 foreach ( $matches as $type => $reals )59 foreach ( $reals as $real )60 $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];61 62 $class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : '';63 $type_links['all'] = "<li><a href='upload.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $_total_posts, 'uploaded files' ), number_format_i18n( $_total_posts ) ) . '</a>';64 foreach ( $post_mime_types as $mime_type => $label ) {65 $class = '';66 67 if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )68 continue;69 70 if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )71 $class = ' class="current"';72 if ( !empty( $num_posts[$mime_type] ) )73 $type_links[$mime_type] = "<li><a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( _n( $label[2][0], $label[2][1], $num_posts[$mime_type] ), number_format_i18n( $num_posts[$mime_type] )) . '</a>';74 }75 $type_links['detached'] = '<li><a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( _nx( 'Unattached <span class="count">(%s)</span>', 'Unattached <span class="count">(%s)</span>', $total_orphans, 'detached files' ), number_format_i18n( $total_orphans ) ) . '</a>';76 77 if ( !empty($_num_posts['trash']) )78 $type_links['trash'] = '<li><a href="upload.php?status=trash"' . ( (isset($_GET['status']) && $_GET['status'] == 'trash' ) ? ' class="current"' : '') . '>' . sprintf( _nx( 'Trash <span class="count">(%s)</span>', 'Trash <span class="count">(%s)</span>', $_num_posts['trash'], 'uploaded files' ), number_format_i18n( $_num_posts['trash'] ) ) . '</a>';79 80 return $type_links;81 }82 83 function get_bulk_actions() {84 global $detached;85 86 $actions = array();87 $actions['delete'] = __( 'Delete Permanently' );88 if ( $detached )89 $actions['attach'] = __( 'Attach to a post' );90 91 return $actions;92 }93 94 function extra_tablenav( $which ) {95 global $post_type, $detached;96 ?>97 <div class="alignleft actions">98 <?php99 if ( 'top' == $which && !is_singular() && !$detached && !$this->is_trash ) {100 $this->months_dropdown( $post_type );101 102 do_action( 'restrict_manage_posts' );103 ?>104 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />105 <?php106 }107 108 if ( $detached ) { ?>109 <input type="submit" id="find_detached" name="find_detached" value="<?php esc_attr_e( 'Scan for lost attachments' ); ?>" class="button-secondary" />110 <?php } elseif ( $this->is_trash && current_user_can( 'edit_others_posts' ) ) { ?>111 <input type="submit" id="delete_all" name="delete_all" value="<?php esc_attr_e( 'Empty Trash' ); ?>" class="button-secondary apply" />112 <?php } ?>113 </div>114 <?php115 }116 117 function current_action() {118 if ( isset( $_REQUEST['find_detached'] ) )119 return 'find_detached';120 121 if ( isset( $_REQUEST['found_post_id'] ) && isset( $_REQUEST['media'] ) )122 return 'attach';123 124 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )125 return 'delete_all';126 127 return parent::current_action();128 }129 130 function has_items() {131 return have_posts();132 }133 134 function no_items() {135 _e( 'No media attachments found.' );136 }137 138 function get_columns() {139 $posts_columns = array();140 $posts_columns['cb'] = '<input type="checkbox" />';141 $posts_columns['icon'] = '';142 /* translators: column name */143 $posts_columns['title'] = _x( 'File', 'column name' );144 $posts_columns['author'] = __( 'Author' );145 //$posts_columns['tags'] = _x( 'Tags', 'column name' );146 /* translators: column name */147 if ( 'upload' == $this->_screen->id ) {148 $posts_columns['parent'] = _x( 'Attached to', 'column name' );149 $posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="' . esc_url( admin_url( 'images/comment-grey-bubble.png' ) ) . '" /></div>';150 }151 /* translators: column name */152 $posts_columns['date'] = _x( 'Date', 'column name' );153 $posts_columns = apply_filters( 'manage_media_columns', $posts_columns, 'upload' != $this->_screen->id );154 155 return $posts_columns;156 }157 158 function get_sortable_columns() {159 return array(160 'title' => 'title',161 'author' => 'author',162 'parent' => 'parent',163 'comments' => 'comment_count',164 'date' => 'date',165 );166 }167 168 function display_rows() {169 global $detached, $post, $id;170 171 if ( $detached ) {172 $this->display_orphans();173 return;174 }175 176 add_filter( 'the_title','esc_html' );177 $alt = '';178 179 while ( have_posts() ) : the_post();180 181 if ( $this->is_trash && $post->post_status != 'trash'182 || !$this->is_trash && $post->post_status == 'trash' )183 continue;184 185 $alt = ( 'alternate' == $alt ) ? '' : 'alternate';186 $post_owner = ( get_current_user_id() == $post->post_author ) ? 'self' : 'other';187 $att_title = _draft_or_post_title();188 ?>189 <tr id='post-<?php echo $id; ?>' class='<?php echo trim( $alt . ' author-' . $post_owner . ' status-' . $post->post_status ); ?>' valign="top">190 <?php191 192 list( $columns, $hidden ) = $this->get_column_info();193 foreach ( $columns as $column_name => $column_display_name ) {194 $class = "class='$column_name column-$column_name'";195 196 $style = '';197 if ( in_array( $column_name, $hidden ) )198 $style = ' style="display:none;"';199 200 $attributes = $class . $style;201 202 switch ( $column_name ) {203 204 case 'cb':205 ?>206 <th scope="row" class="check-column"><?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?><input type="checkbox" name="media[]" value="<?php the_ID(); ?>" /><?php } ?></th>207 <?php208 break;209 210 case 'icon':211 $attributes = 'class="column-icon media-icon"' . $style;212 ?>213 <td <?php echo $attributes ?>><?php214 if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {215 if ( $this->is_trash ) {216 echo $thumb;217 } else {218 ?>219 <a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>">220 <?php echo $thumb; ?>221 </a>222 223 <?php }224 }225 ?>226 </td>227 <?php228 break;229 230 case 'title':231 ?>232 <td <?php echo $attributes ?>><strong><?php if ( $this->is_trash ) echo $att_title; else { ?><a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php echo $att_title; ?></a><?php } ?></strong>233 <p>234 <?php235 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )236 echo esc_html( strtoupper( $matches[1] ) );237 else238 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );239 ?>240 </p>241 <?php242 $actions = array();243 if ( current_user_can( 'edit_post', $post->ID ) && !$this->is_trash )244 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';245 if ( current_user_can( 'delete_post', $post->ID ) ) {246 if ( $this->is_trash )247 $actions['untrash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=untrash&post=$post->ID", 'untrash-attachment_' . $post->ID ) . "'>" . __( 'Restore' ) . "</a>";248 elseif ( EMPTY_TRASH_DAYS && MEDIA_TRASH )249 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";250 if ( $this->is_trash || !EMPTY_TRASH_DAYS || !MEDIA_TRASH ) {251 $delete_ays = ( !$this->is_trash && !MEDIA_TRASH ) ? " onclick='return showNotice.warn();'" : '';252 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";253 }254 }255 if ( !$this->is_trash ) {256 $title =_draft_or_post_title( $post->post_parent );257 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';258 }259 $actions = apply_filters( 'media_row_actions', $actions, $post );260 echo $this->row_actions( $actions );261 ?>262 </td>263 <?php264 break;265 266 case 'author':267 ?>268 <td <?php echo $attributes ?>><?php the_author() ?></td>269 <?php270 break;271 272 case 'tags':273 ?>274 <td <?php echo $attributes ?>><?php275 $tags = get_the_tags();276 if ( !empty( $tags ) ) {277 $out = array();278 foreach ( $tags as $c )279 $out[] = "<a href='edit.php?tag=$c->slug'> " . esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'post_tag', 'display' ) ) . "</a>";280 echo join( ', ', $out );281 } else {282 _e( 'No Tags' );283 }284 ?>285 </td>286 <?php287 break;288 289 case 'desc':290 ?>291 <td <?php echo $attributes ?>><?php echo has_excerpt() ? $post->post_excerpt : ''; ?></td>292 <?php293 break;294 295 case 'date':296 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {297 $t_time = $h_time = __( 'Unpublished' );298 } else {299 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );300 $m_time = $post->post_date;301 $time = get_post_time( 'G', true, $post, false );302 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {303 if ( $t_diff < 0 )304 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );305 else306 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );307 } else {308 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );309 }310 }311 ?>312 <td <?php echo $attributes ?>><?php echo $h_time ?></td>313 <?php314 break;315 316 case 'parent':317 if ( $post->post_parent > 0 ) {318 if ( get_post( $post->post_parent ) ) {319 $title =_draft_or_post_title( $post->post_parent );320 }321 ?>322 <td <?php echo $attributes ?>>323 <strong><a href="<?php echo get_edit_post_link( $post->post_parent ); ?>"><?php echo $title ?></a></strong>,324 <?php echo get_the_time( __( 'Y/m/d' ) ); ?>325 </td>326 <?php327 } else {328 ?>329 <td <?php echo $attributes ?>><?php _e( '(Unattached)' ); ?><br />330 <a class="hide-if-no-js" onclick="findPosts.open( 'media[]','<?php echo $post->ID ?>' );return false;" href="#the-list"><?php _e( 'Attach' ); ?></a></td>331 <?php332 }333 break;334 335 case 'comments':336 $attributes = 'class="comments column-comments num"' . $style;337 ?>338 <td <?php echo $attributes ?>>339 <div class="post-com-count-wrapper">340 <?php341 $pending_comments = get_pending_comments_num( $post->ID );342 343 $this->comments_bubble( $post->ID, $pending_comments );344 ?>345 </div>346 </td>347 <?php348 break;349 350 case 'actions':351 ?>352 <td <?php echo $attributes ?>>353 <a href="media.php?action=edit&attachment_id=<?php the_ID(); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php _e( 'Edit' ); ?></a> |354 <a href="<?php the_permalink(); ?>"><?php _e( 'Get permalink' ); ?></a>355 </td>356 <?php357 break;358 359 default:360 ?>361 <td <?php echo $attributes ?>>362 <?php do_action( 'manage_media_custom_column', $column_name, $id ); ?>363 </td>364 <?php365 break;366 }367 }368 ?>369 </tr>370 <?php endwhile;371 }372 373 function display_orphans() {374 global $post;375 376 $class = '';377 378 while ( have_posts() ) : the_post();379 380 $class = ( 'alternate' == $class ) ? '' : 'alternate';381 $att_title = esc_html( _draft_or_post_title( $post->ID ) );382 383 $edit_link = '<a href="' . get_edit_post_link( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ) . '">%s</a>';384 ?>385 <tr id='post-<?php echo $post->ID; ?>' class='<?php echo $class; ?>' valign="top">386 <th scope="row" class="check-column">387 <?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?>388 <input type="checkbox" name="media[]" value="<?php echo esc_attr( $post->ID ); ?>" />389 <?php } ?>390 </th>391 392 <td class="media-icon">393 <?php if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {394 printf( $edit_link, $thumb );395 } ?>396 </td>397 398 <td class="media column-media">399 <strong><?php printf( $edit_link, $att_title ); ?></strong><br />400 <?php401 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )402 echo esc_html( strtoupper( $matches[1] ) );403 else404 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );405 ?>406 <?php407 $actions = array();408 if ( current_user_can( 'edit_post', $post->ID ) )409 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';410 if ( current_user_can( 'delete_post', $post->ID ) )411 if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) {412 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";413 } else {414 $delete_ays = !MEDIA_TRASH ? " onclick='return showNotice.warn();'" : '';415 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";416 }417 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $att_title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';418 if ( current_user_can( 'edit_post', $post->ID ) )419 $actions['attach'] = '<a href="#the-list" onclick="findPosts.open( \'media[]\',\''.$post->ID.'\' );return false;" class="hide-if-no-js">'.__( 'Attach' ).'</a>';420 $actions = apply_filters( 'media_row_actions', $actions, $post );421 422 echo $this->row_actions( $actions );423 ?>424 </td>425 <td class="author column-author">426 <?php $author = get_userdata( $post->post_author ); echo $author->display_name; ?>427 </td>428 <?php429 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {430 $t_time = $h_time = __( 'Unpublished' );431 } else {432 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );433 $m_time = $post->post_date;434 $time = get_post_time( 'G', true );435 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {436 if ( $t_diff < 0 )437 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );438 else439 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );440 } else {441 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );442 }443 }444 ?>445 <td class="date column-date"><?php echo $h_time ?></td>446 </tr>447 <?php448 endwhile;449 }450 }451 452 class WP_Terms_Table extends WP_List_Table {453 454 var $callback_args;455 456 function WP_Terms_Table() {457 global $post_type, $taxonomy, $tax, $current_screen;458 459 wp_reset_vars( array( 'action', 'taxonomy', 'post_type' ) );460 461 if ( empty( $taxonomy ) )462 $taxonomy = 'post_tag';463 464 if ( !taxonomy_exists( $taxonomy ) )465 wp_die( __( 'Invalid taxonomy' ) );466 467 $tax = get_taxonomy( $taxonomy );468 469 if ( empty( $post_type ) || !in_array( $post_type, get_post_types( array( 'public' => true ) ) ) )470 $post_type = 'post';471 472 if ( !isset( $current_screen ) )473 set_current_screen( 'edit-' . $taxonomy );474 475 parent::WP_List_Table( array(476 'screen' => $current_screen,477 'plural' => 'tags',478 'singular' => 'tag',479 ) );480 }481 482 function check_permissions( $type = 'manage' ) {483 global $tax;484 485 $cap = 'manage' == $type ? $tax->cap->manage_terms : $tax->cap->edit_terms;486 487 if ( !current_user_can( $tax->cap->manage_terms ) )488 wp_die( __( 'Cheatin’ uh?' ) );489 }490 491 function prepare_items() {492 global $taxonomy;493 494 $tags_per_page = $this->get_items_per_page( 'edit_' . $taxonomy . '_per_page' );495 496 if ( 'post_tag' == $taxonomy ) {497 $tags_per_page = apply_filters( 'edit_tags_per_page', $tags_per_page );498 $tags_per_page = apply_filters( 'tagsperpage', $tags_per_page ); // Old filter499 } elseif ( 'category' == $taxonomy ) {500 $tags_per_page = apply_filters( 'edit_categories_per_page', $tags_per_page ); // Old filter501 }502 503 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';504 505 $args = array(506 'search' => $search,507 'page' => $this->get_pagenum(),508 'number' => $tags_per_page,509 );510 511 if ( !empty( $_REQUEST['orderby'] ) )512 $args['orderby'] = trim( stripslashes( $_REQUEST['orderby'] ) );513 514 if ( !empty( $_REQUEST['order'] ) )515 $args['order'] = trim( stripslashes( $_REQUEST['order'] ) );516 517 $this->callback_args = $args;518 519 $this->set_pagination_args( array(520 'total_items' => wp_count_terms( $taxonomy, compact( 'search' ) ),521 'per_page' => $tags_per_page,522 ) );523 }524 525 function get_bulk_actions() {526 $actions = array();527 $actions['delete'] = __( 'Delete' );528 529 return $actions;530 }531 532 function current_action() {533 if ( isset( $_REQUEST['action'] ) && isset( $_REQUEST['delete_tags'] ) && ( 'delete' == $_REQUEST['action'] || 'delete' == $_REQUEST['action2'] ) )534 return 'bulk-delete';535 536 return parent::current_action();537 }538 539 function get_columns() {540 global $taxonomy;541 542 $columns = array(543 'cb' => '<input type="checkbox" />',544 'name' => __( 'Name' ),545 'description' => __( 'Description' ),546 'slug' => __( 'Slug' ),547 );548 549 if ( 'link_category' == $taxonomy )550 $columns['links'] = __( 'Links' );551 else552 $columns['posts'] = __( 'Posts' );553 554 return $columns;555 }556 557 function get_sortable_columns() {558 return array(559 'name' => 'name',560 'description' => 'description',561 'slug' => 'slug',562 'posts' => 'count',563 'links' => 'count'564 );565 }566 567 function display_rows() {568 global $taxonomy;569 570 $args = wp_parse_args( $this->callback_args, array(571 'page' => 1,572 'number' => 20,573 'search' => '',574 'hide_empty' => 0575 ) );576 577 extract( $args, EXTR_SKIP );578 579 $args['offset'] = $offset = ( $page - 1 ) * $number;580 581 // convert it to table rows582 $out = '';583 $count = 0;584 if ( is_taxonomy_hierarchical( $taxonomy ) && !isset( $orderby ) ) {585 // We'll need the full set of terms then.586 $args['number'] = $args['offset'] = 0;587 588 $terms = get_terms( $taxonomy, $args );589 if ( !empty( $search ) ) // Ignore children on searches.590 $children = array();591 else592 $children = _get_term_hierarchy( $taxonomy );593 594 // Some funky recursion to get the job done( Paging & parents mainly ) is contained within, Skip it for non-hierarchical taxonomies for performance sake595 $out .= $this->_rows( $taxonomy, $terms, $children, $offset, $number, $count );596 } else {597 $terms = get_terms( $taxonomy, $args );598 foreach ( $terms as $term )599 $out .= $this->single_row( $term, 0, $taxonomy );600 $count = $number; // Only displaying a single page.601 }602 603 echo $out;604 }605 606 function _rows( $taxonomy, $terms, &$children, $start = 0, $per_page = 20, &$count, $parent = 0, $level = 0 ) {607 608 $end = $start + $per_page;609 610 $output = '';611 foreach ( $terms as $key => $term ) {612 613 if ( $count >= $end )614 break;615 616 if ( $term->parent != $parent && empty( $_REQUEST['s'] ) )617 continue;618 619 // If the page starts in a subtree, print the parents.620 if ( $count == $start && $term->parent > 0 && empty( $_REQUEST['s'] ) ) {621 $my_parents = $parent_ids = array();622 $p = $term->parent;623 while ( $p ) {624 $my_parent = get_term( $p, $taxonomy );625 $my_parents[] = $my_parent;626 $p = $my_parent->parent;627 if ( in_array( $p, $parent_ids ) ) // Prevent parent loops.628 break;629 $parent_ids[] = $p;630 }631 unset( $parent_ids );632 633 $num_parents = count( $my_parents );634 while ( $my_parent = array_pop( $my_parents ) ) {635 $output .= "\t" . $this->single_row( $my_parent, $level - $num_parents, $taxonomy );636 $num_parents--;637 }638 }639 640 if ( $count >= $start )641 $output .= "\t" . $this->single_row( $term, $level, $taxonomy );642 643 ++$count;644 645 unset( $terms[$key] );646 647 if ( isset( $children[$term->term_id] ) && empty( $_REQUEST['s'] ) )648 $output .= $this->_rows( $taxonomy, $terms, $children, $start, $per_page, $count, $term->term_id, $level + 1 );649 }650 651 return $output;652 }653 654 function single_row( $tag, $level = 0 ) {655 static $row_class = '';656 $row_class = ( $row_class == '' ? ' class="alternate"' : '' );657 658 $this->level = $level;659 660 echo '<tr id="tag-' . $tag->term_id . '"' . $row_class . '>';661 echo $this->single_row_columns( $tag );662 echo '</tr>';663 }664 665 function column_cb( $tag ) {666 global $taxonomy, $tax;667 668 $default_term = get_option( 'default_' . $taxonomy );669 670 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )671 return '<input type="checkbox" name="delete_tags[]" value="' . $tag->term_id . '" />';672 else673 return ' ';674 }675 676 function column_name( $tag ) {677 global $taxonomy, $tax, $post_type;678 679 $default_term = get_option( 'default_' . $taxonomy );680 681 $pad = str_repeat( '— ', max( 0, $this->level ) );682 $name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag );683 $qe_data = get_term( $tag->term_id, $taxonomy, OBJECT, 'edit' );684 $edit_link = get_edit_term_link( $tag->term_id, $taxonomy, $post_type );685 686 $out = '<strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $name ) ) . '">' . $name . '</a></strong><br />';687 688 $actions = array();689 if ( current_user_can( $tax->cap->edit_terms ) ) {690 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';691 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __( 'Quick Edit' ) . '</a>';692 }693 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )694 $actions['delete'] = "<a class='delete-tag' href='" . wp_nonce_url( "edit-tags.php?action=delete&taxonomy=$taxonomy&tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id ) . "'>" . __( 'Delete' ) . "</a>";695 696 $actions = apply_filters( 'tag_row_actions', $actions, $tag );697 $actions = apply_filters( "${taxonomy}_row_actions", $actions, $tag );698 699 $out .= $this->row_actions( $actions );700 $out .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';701 $out .= '<div class="name">' . $qe_data->name . '</div>';702 $out .= '<div class="slug">' . apply_filters( 'editable_slug', $qe_data->slug ) . '</div>';703 $out .= '<div class="parent">' . $qe_data->parent . '</div></div></td>';704 705 return $out;706 }707 708 function column_description( $tag ) {709 return $tag->description;710 }711 712 function column_slug( $tag ) {713 return apply_filters( 'editable_slug', $tag->slug );714 }715 716 function column_posts( $tag ) {717 global $taxonomy, $post_type;718 719 $count = number_format_i18n( $tag->count );720 721 if ( 'post_tag' == $taxonomy ) {722 $tagsel = 'tag';723 } elseif ( 'category' == $taxonomy ) {724 $tagsel = 'category_name';725 } elseif ( ! empty( $tax->query_var ) ) {726 $tagsel = $tax->query_var;727 } else {728 $tagsel = $taxonomy;729 }730 731 return "<a href='edit.php?$tagsel=$tag->slug&post_type=$post_type'>$count</a>";732 }733 734 function column_links( $tag ) {735 $count = number_format_i18n( $tag->count );736 return $count;737 }738 739 function column_default( $tag, $column_name ) {740 global $taxonomy;741 742 return apply_filters( "manage_${taxonomy}_custom_column", '', $column_name, $tag->term_id );743 $out .= "</td>";744 }745 746 /**747 * Outputs the hidden row displayed when inline editing748 *749 * @since 3.1.0750 */751 function inline_edit() {752 global $tax;753 754 if ( ! current_user_can( $tax->cap->edit_terms ) )755 return;756 757 list( $columns, $hidden ) = $this->get_column_info();758 759 $col_count = count( $columns ) - count( $hidden );760 ?>761 762 <form method="get" action=""><table style="display: none"><tbody id="inlineedit">763 <tr id="inline-edit" class="inline-edit-row" style="display: none"><td colspan="<?php echo $col_count; ?>">764 765 <fieldset><div class="inline-edit-col">766 <h4><?php _e( 'Quick Edit' ); ?></h4>767 768 <label>769 <span class="title"><?php _e( 'Name' ); ?></span>770 <span class="input-text-wrap"><input type="text" name="name" class="ptitle" value="" /></span>771 </label>772 <?php if ( !global_terms_enabled() ) { ?>773 <label>774 <span class="title"><?php _e( 'Slug' ); ?></span>775 <span class="input-text-wrap"><input type="text" name="slug" class="ptitle" value="" /></span>776 </label>777 <?php } ?>778 779 </div></fieldset>780 <?php781 782 $core_columns = array( 'cb' => true, 'description' => true, 'name' => true, 'slug' => true, 'posts' => true );783 784 foreach ( $columns as $column_name => $column_display_name ) {785 if ( isset( $core_columns[$column_name] ) )786 continue;787 do_action( 'quick_edit_custom_box', $column_name, $type, $tax->taxonomy );788 }789 790 ?>791 792 <p class="inline-edit-save submit">793 <a accesskey="c" href="#inline-edit" title="<?php _e( 'Cancel' ); ?>" class="cancel button-secondary alignleft"><?php _e( 'Cancel' ); ?></a>794 <?php $update_text = $tax->labels->update_item; ?>795 <a accesskey="s" href="#inline-edit" title="<?php echo esc_attr( $update_text ); ?>" class="save button-primary alignright"><?php echo $update_text; ?></a>796 <img class="waiting" style="display:none;" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" />797 <span class="error" style="display:none;"></span>798 <?php wp_nonce_field( 'taxinlineeditnonce', '_inline_edit', false ); ?>799 <input type="hidden" name="taxonomy" value="<?php echo esc_attr( $tax->name ); ?>" />800 <br class="clear" />801 </p>802 </td></tr>803 </tbody></table></form>804 <?php805 }806 }807 808 class WP_Users_Table extends WP_List_Table {809 810 function WP_Users_Table() {811 parent::WP_List_Table( array(812 'screen' => 'users',813 'plural' => 'users'814 ) );815 }816 817 function check_permissions() {818 if ( !current_user_can('list_users') )819 wp_die(__('Cheatin’ uh?'));820 }821 822 function prepare_items() {823 global $role, $usersearch;824 825 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';826 827 $role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : '';828 829 $users_per_page = $this->get_items_per_page( 'users_per_page' );830 831 $paged = $this->get_pagenum();832 833 $args = array(834 'number' => $users_per_page,835 'offset' => ( $paged-1 ) * $users_per_page,836 'role' => $role,837 'search' => $usersearch838 );839 840 if ( isset( $_REQUEST['orderby'] ) )841 $args['orderby'] = $_REQUEST['orderby'];842 843 if ( isset( $_REQUEST['order'] ) )844 $args['order'] = $_REQUEST['order'];845 846 // Query the user IDs for this page847 $wp_user_search = new WP_User_Query( $args );848 849 $this->items = $wp_user_search->get_results();850 851 $this->set_pagination_args( array(852 'total_items' => $wp_user_search->get_total(),853 'per_page' => $users_per_page,854 ) );855 }856 857 function no_items() {858 _e( 'No matching users were found.' );859 }860 861 function get_views() {862 global $wp_roles, $role;863 864 $users_of_blog = count_users();865 $total_users = $users_of_blog['total_users'];866 $avail_roles =& $users_of_blog['avail_roles'];867 unset($users_of_blog);868 869 $current_role = false;870 $class = empty($role) ? ' class="current"' : '';871 $role_links = array();872 $role_links['all'] = "<li><a href='users.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>';873 foreach ( $wp_roles->get_names() as $this_role => $name ) {874 if ( !isset($avail_roles[$this_role]) )875 continue;876 877 $class = '';878 879 if ( $this_role == $role ) {880 $current_role = $role;881 $class = ' class="current"';882 }883 884 $name = translate_user_role( $name );885 /* translators: User role name with count */886 $name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, $avail_roles[$this_role] );887 $role_links[$this_role] = "<li><a href='users.php?role=$this_role'$class>$name</a>";888 }889 890 return $role_links;891 }892 893 function get_bulk_actions() {894 $actions = array();895 896 if ( !is_multisite() && current_user_can( 'delete_users' ) )897 $actions['delete'] = __( 'Delete' );898 else899 $actions['remove'] = __( 'Remove' );900 901 return $actions;902 }903 904 function extra_tablenav( $which ) {905 if ( 'top' != $which )906 return;907 ?>908 <div class="alignleft actions">909 <label class="screen-reader-text" for="new_role"><?php _e( 'Change role to…' ) ?></label>910 <select name="new_role" id="new_role">911 <option value=''><?php _e( 'Change role to…' ) ?></option>912 <?php wp_dropdown_roles(); ?>913 </select>914 <input type="submit" value="<?php esc_attr_e( 'Change' ); ?>" name="changeit" class="button-secondary" />915 </div>916 <?php917 }918 919 function current_action() {920 if ( isset($_REQUEST['changeit']) && !empty($_REQUEST['new_role']) )921 return 'promote';922 923 return parent::current_action();924 }925 926 function get_columns() {927 return array(928 'cb' => '<input type="checkbox" />',929 'username' => __( 'Login' ),930 'name' => __( 'Name' ),931 'email' => __( 'E-mail' ),932 'role' => __( 'Role' ),933 'posts' => __( 'Posts' )934 );935 }936 937 function get_sortable_columns() {938 return array(939 'username' => 'login',940 'name' => 'name',941 'email' => 'email',942 'posts' => 'post_count',943 );944 }945 946 function display_rows() {947 // Query the post counts for this page948 $post_counts = count_many_users_posts( array_keys( $this->items ) );949 950 $style = '';951 foreach ( $this->items as $userid => $user_object ) {952 $role = reset( $user_object->roles );953 954 if ( is_multisite() && empty( $role ) )955 continue;956 957 $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"';958 echo "\n\t", $this->single_row( $user_object, $style, $role, $post_counts[ $userid ] );959 }960 }961 962 /**963 * Generate HTML for a single row on the users.php admin panel.964 *965 * @since 2.1.0966 *967 * @param object $user_object968 * @param string $style Optional. Attributes added to the TR element. Must be sanitized.969 * @param string $role Key for the $wp_roles array.970 * @param int $numposts Optional. Post count to display for this user. Defaults to zero, as in, a new user has made zero posts.971 * @return string972 */973 function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) {974 global $wp_roles;975 976 if ( !( is_object( $user_object ) && is_a( $user_object, 'WP_User' ) ) )977 $user_object = new WP_User( (int) $user_object );978 $user_object = sanitize_user_object( $user_object, 'display' );979 $email = $user_object->user_email;980 $url = $user_object->user_url;981 $short_url = str_replace( 'http://', '', $url );982 $short_url = str_replace( 'www.', '', $short_url );983 if ( '/' == substr( $short_url, -1 ) )984 $short_url = substr( $short_url, 0, -1 );985 if ( strlen( $short_url ) > 35 )986 $short_url = substr( $short_url, 0, 32 ).'...';987 $checkbox = '';988 // Check if the user for this row is editable989 if ( current_user_can( 'list_users' ) ) {990 // Set up the user editing link991 // TODO: make profile/user-edit determination a separate function992 if ( get_current_user_id() == $user_object->ID ) {993 $edit_link = 'profile.php';994 } else {995 $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( esc_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" ) );996 }997 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";998 999 // Set up the hover actions for this user1000 $actions = array();1001 1002 if ( current_user_can( 'edit_user', $user_object->ID ) ) {1003 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";1004 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';1005 } else {1006 $edit = "<strong>$user_object->user_login</strong><br />";1007 }1008 1009 if ( !is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) )1010 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=delete&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Delete' ) . "</a>";1011 if ( is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'remove_user', $user_object->ID ) )1012 $actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=remove&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . "</a>";1013 $actions = apply_filters( 'user_row_actions', $actions, $user_object );1014 $edit .= $this->row_actions( $actions );1015 1016 // Set up the checkbox ( because the user is editable, otherwise its empty )1017 $checkbox = "<input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='$role' value='{$user_object->ID}' />";1018 1019 } else {1020 $edit = '<strong>' . $user_object->user_login . '</strong>';1021 }1022 $role_name = isset( $wp_roles->role_names[$role] ) ? translate_user_role( $wp_roles->role_names[$role] ) : __( 'None' );1023 $r = "<tr id='user-$user_object->ID'$style>";1024 $avatar = get_avatar( $user_object->ID, 32 );1025 1026 list( $columns, $hidden ) = $this->get_column_info();1027 1028 foreach ( $columns as $column_name => $column_display_name ) {1029 $class = "class=\"$column_name column-$column_name\"";1030 1031 $style = '';1032 if ( in_array( $column_name, $hidden ) )1033 $style = ' style="display:none;"';1034 1035 $attributes = "$class$style";1036 1037 switch ( $column_name ) {1038 case 'cb':1039 $r .= "<th scope='row' class='check-column'>$checkbox</th>";1040 break;1041 case 'username':1042 $r .= "<td $attributes>$avatar $edit</td>";1043 break;1044 case 'name':1045 $r .= "<td $attributes>$user_object->first_name $user_object->last_name</td>";1046 break;1047 case 'email':1048 $r .= "<td $attributes><a href='mailto:$email' title='" . sprintf( __( 'E-mail: %s' ), $email ) . "'>$email</a></td>";1049 break;1050 case 'role':1051 $r .= "<td $attributes>$role_name</td>";1052 break;1053 case 'posts':1054 $attributes = 'class="posts column-posts num"' . $style;1055 $r .= "<td $attributes>";1056 if ( $numposts > 0 ) {1057 $r .= "<a href='edit.php?author=$user_object->ID' title='" . __( 'View posts by this author' ) . "' class='edit'>";1058 $r .= $numposts;1059 $r .= '</a>';1060 } else {1061 $r .= 0;1062 }1063 $r .= "</td>";1064 break;1065 default:1066 $r .= "<td $attributes>";1067 $r .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID );1068 $r .= "</td>";1069 }1070 }1071 $r .= '</tr>';1072 1073 return $r;1074 }1075 }1076 1077 class WP_Comments_Table extends WP_List_Table {1078 1079 var $checkbox = true;1080 var $from_ajax = false;1081 1082 var $pending_count = array();1083 1084 function WP_Comments_Table() {1085 global $mode;1086 1087 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'detail' : $_REQUEST['mode'];1088 1089 if ( get_option('show_avatars') && 'single' != $mode )1090 add_filter( 'comment_author', 'floated_admin_avatar' );1091 1092 parent::WP_List_Table( array(1093 'screen' => 'edit-comments',1094 'plural' => 'comments'1095 ) );1096 }1097 1098 function check_permissions() {1099 if ( !current_user_can('edit_posts') )1100 wp_die(__('Cheatin’ uh?'));1101 }1102 1103 function prepare_items() {1104 global $post_id, $comment_status, $search;1105 1106 if ( isset( $_REQUEST['p'] ) )1107 $post_id = absint( $_REQUEST['p'] );1108 elseif ( isset( $_REQUEST['post'] ) )1109 $post_id = absint( $_REQUEST['post'] );1110 elseif ( isset( $_REQUEST['post_ID'] ) )1111 $post_id = absint( $_REQUEST['post_ID'] );1112 else1113 $post_id = 0;1114 1115 $comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all';1116 if ( !in_array( $comment_status, array( 'all', 'moderated', 'approved', 'spam', 'trash' ) ) )1117 $comment_status = 'all';1118 1119 $comment_type = !empty( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : '';1120 1121 $search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : '';1122 1123 $user_id = ( isset( $_REQUEST['user_id'] ) ) ? $_REQUEST['user_id'] : '';1124 1125 $comments_per_page = $this->get_items_per_page( 'edit_comments_per_page' );1126 $comments_per_page = apply_filters( 'comments_per_page', $comments_per_page, $comment_status );1127 1128 if ( isset( $_POST['number'] ) )1129 $number = (int) $_POST['number'];1130 else1131 $number = $comments_per_page + min( 8, $comments_per_page ); // Grab a few extra1132 1133 $page = $this->get_pagenum();1134 1135 $start = $offset = ( $page - 1 ) * $comments_per_page;1136 1137 $status_map = array(1138 'moderated' => 'hold',1139 'approved' => 'approve'1140 );1141 1142 $args = array(1143 'status' => isset( $status_map[$comment_status] ) ? $status_map[$comment_status] : $comment_status,1144 'search' => $search,1145 'user_id' => $user_id,1146 'offset' => $start,1147 'number' => $number,1148 'post_id' => $post_id,1149 'type' => $comment_type,1150 'orderby' => @$_REQUEST['orderby'],1151 'order' => @$_REQUEST['order'],1152 );1153 1154 $_comments = get_comments( $args );1155 1156 update_comment_cache( $_comments );1157 1158 $this->items = array_slice( $_comments, 0, $comments_per_page );1159 $this->extra_items = array_slice( $_comments, $comments_per_page );1160 1161 $total_comments = get_comments( array_merge( $args, array('count' => true, 'offset' => 0, 'number' => 0) ) );1162 1163 $_comment_post_ids = array();1164 foreach ( $_comments as $_c ) {1165 $_comment_post_ids[] = $_c->comment_post_ID;1166 }1167 1168 $this->pending_count = get_pending_comments_num( $_comment_post_ids );1169 1170 $this->set_pagination_args( array(1171 'total_items' => $total_comments,1172 'per_page' => $comments_per_page,1173 ) );1174 }1175 1176 function get_views() {1177 global $post_id, $comment_status;1178 1179 $status_links = array();1180 $num_comments = ( $post_id ) ? wp_count_comments( $post_id ) : wp_count_comments();1181 //, number_format_i18n($num_comments->moderated) ), "<span class='comment-count'>" . number_format_i18n($num_comments->moderated) . "</span>"),1182 //, number_format_i18n($num_comments->spam) ), "<span class='spam-comment-count'>" . number_format_i18n($num_comments->spam) . "</span>")1183 $stati = array(1184 'all' => _nx_noop('All', 'All', 'comments'), // singular not used1185 'moderated' => _n_noop('Pending <span class="count">(<span class="pending-count">%s</span>)</span>', 'Pending <span class="count">(<span class="pending-count">%s</span>)</span>'),1186 'approved' => _n_noop('Approved', 'Approved'), // singular not used1187 'spam' => _n_noop('Spam <span class="count">(<span class="spam-count">%s</span>)</span>', 'Spam <span class="count">(<span class="spam-count">%s</span>)</span>'),1188 'trash' => _n_noop('Trash <span class="count">(<span class="trash-count">%s</span>)</span>', 'Trash <span class="count">(<span class="trash-count">%s</span>)</span>')1189 );1190 1191 if ( !EMPTY_TRASH_DAYS )1192 unset($stati['trash']);1193 1194 $link = 'edit-comments.php';1195 if ( !empty($comment_type) && 'all' != $comment_type )1196 $link = add_query_arg( 'comment_type', $comment_type, $link );1197 1198 foreach ( $stati as $status => $label ) {1199 $class = ( $status == $comment_status ) ? ' class="current"' : '';1200 1201 if ( !isset( $num_comments->$status ) )1202 $num_comments->$status = 10;1203 $link = add_query_arg( 'comment_status', $status, $link );1204 if ( $post_id )1205 $link = add_query_arg( 'p', absint( $post_id ), $link );1206 /*1207 // I toyed with this, but decided against it. Leaving it in here in case anyone thinks it is a good idea. ~ Mark1208 if ( !empty( $_REQUEST['s'] ) )1209 $link = add_query_arg( 's', esc_attr( stripslashes( $_REQUEST['s'] ) ), $link );1210 */1211 $status_links[$status] = "<li class='$status'><a href='$link'$class>" . sprintf(1212 _n( $label[0], $label[1], $num_comments->$status ),1213 number_format_i18n( $num_comments->$status )1214 ) . '</a>';1215 }1216 1217 $status_links = apply_filters( 'comment_status_links', $status_links );1218 return $status_links;1219 }1220 1221 function get_bulk_actions() {1222 global $comment_status;1223 1224 $actions = array();1225 if ( in_array( $comment_status, array( 'all', 'approved' ) ) )1226 $actions['unapprove'] = __( 'Unapprove' );1227 if ( in_array( $comment_status, array( 'all', 'moderated', 'spam' ) ) )1228 $actions['approve'] = __( 'Approve' );1229 if ( in_array( $comment_status, array( 'all', 'moderated', 'approved' ) ) )1230 $actions['spam'] = _x( 'Mark as Spam', 'comment' );1231 1232 if ( 'trash' == $comment_status )1233 $actions['untrash'] = __( 'Restore' );1234 elseif ( 'spam' == $comment_status )1235 $actions['unspam'] = _x( 'Not Spam', 'comment' );1236 1237 if ( in_array( $comment_status, array( 'trash', 'spam' ) ) || !EMPTY_TRASH_DAYS )1238 $actions['delete'] = __( 'Delete Permanently' );1239 else1240 $actions['trash'] = __( 'Move to Trash' );1241 1242 return $actions;1243 }1244 1245 function extra_tablenav( $which ) {1246 global $comment_status, $comment_type;1247 ?>1248 <div class="alignleft actions">1249 <?php1250 if ( 'top' == $which ) {1251 ?>1252 <select name="comment_type">1253 <option value=""><?php _e( 'Show all comment types' ); ?></option>1254 <?php1255 $comment_types = apply_filters( 'admin_comment_types_dropdown', array(1256 'comment' => __( 'Comments' ),1257 'pings' => __( 'Pings' ),1258 ) );1259 1260 foreach ( $comment_types as $type => $label )1261 echo "\t<option value='" . esc_attr( $type ) . "'" . selected( $comment_type, $type, false ) . ">$label</option>\n";1262 ?>1263 </select>1264 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />1265 <?php1266 }1267 1268 if ( ( 'spam' == $comment_status || 'trash' == $comment_status ) && current_user_can( 'moderate_comments' ) ) {1269 wp_nonce_field( 'bulk-destroy', '_destroy_nonce' );1270 $title = ( 'spam' == $comment_status ) ? esc_attr__( 'Empty Spam' ) : esc_attr__( 'Empty Trash' );1271 ?>1272 <input type="submit" name="delete_all" id="delete_all" value="<?php echo $title ?>" class="button-secondary apply" />1273 <?php1274 }1275 ?>1276 <?php1277 do_action( 'manage_comments_nav', $comment_status );1278 echo '</div>';1279 }1280 1281 function current_action() {1282 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )1283 return 'delete_all';1284 1285 return parent::current_action();1286 }1287 1288 function get_columns() {1289 global $mode;1290 1291 $columns = array();1292 1293 if ( $this->checkbox )1294 $columns['cb'] = '<input type="checkbox" />';1295 1296 $columns['author'] = __( 'Author' );1297 $columns['comment'] = _x( 'Comment', 'column name' );1298 1299 if ( 'single' !== $mode )1300 $columns['response'] = _x( 'Comment', 'column name' );1301 1302 return $columns;1303 }1304 1305 function get_sortable_columns() {1306 return array(1307 'author' => 'comment_author',1308 'comment' => 'comment_content',1309 'response' => 'comment_post_ID'1310 );1311 }1312 1313 function display_table() {1314 extract( $this->_args );1315 1316 $this->display_tablenav( 'top' );1317 1318 ?>1319 <table class="<?php echo implode( ' ', $this->get_table_classes() ); ?>" cellspacing="0">1320 <thead>1321 <tr>1322 <?php $this->print_column_headers(); ?>1323 </tr>1324 </thead>1325 1326 <tfoot>1327 <tr>1328 <?php $this->print_column_headers( false ); ?>1329 </tr>1330 </tfoot>1331 1332 <tbody id="the-comment-list" class="list:comment">1333 <?php $this->display_rows(); ?>1334 </tbody>1335 1336 <tbody id="the-extra-comment-list" class="list:comment" style="display: none;">1337 <?php $this->items = $this->extra_items; $this->display_rows(); ?>1338 </tbody>1339 </table>1340 <?php1341 1342 $this->display_tablenav( 'bottom' );1343 }1344 1345 function single_row( $a_comment ) {1346 global $post, $comment, $the_comment_status;1347 1348 $comment = $a_comment;1349 $the_comment_status = wp_get_comment_status( $comment->comment_ID );1350 1351 $post = get_post( $comment->comment_post_ID );1352 1353 $this->user_can = current_user_can( 'edit_comment', $comment->comment_ID );1354 1355 echo "<tr id='comment-$comment->comment_ID' class='$the_comment_status'>";1356 echo $this->single_row_columns( $comment );1357 echo "</tr>\n";1358 }1359 1360 function column_cb( $comment ) {1361 if ( $this->user_can )1362 echo "<input type='checkbox' name='delete_comments[]' value='$comment->comment_ID' />";1363 }1364 1365 function column_comment( $comment ) {1366 global $post, $comment_status, $the_comment_status;1367 1368 $user_can = $this->user_can;1369 1370 $comment_url = esc_url( get_comment_link( $comment->comment_ID ) );1371 1372 $ptime = date( 'G', strtotime( $comment->comment_date ) );1373 if ( ( abs( time() - $ptime ) ) < 86400 )1374 $ptime = sprintf( __( '%s ago' ), human_time_diff( $ptime ) );1375 else1376 $ptime = mysql2date( __( 'Y/m/d \a\t g:i A' ), $comment->comment_date );1377 1378 if ( $user_can ) {1379 $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) );1380 $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) );1381 1382 $url = "comment.php?c=$comment->comment_ID";1383 1384 $approve_url = esc_url( $url . "&action=approvecomment&$approve_nonce" );1385 $unapprove_url = esc_url( $url . "&action=unapprovecomment&$approve_nonce" );1386 $spam_url = esc_url( $url . "&action=spamcomment&$del_nonce" );1387 $unspam_url = esc_url( $url . "&action=unspamcomment&$del_nonce" );1388 $trash_url = esc_url( $url . "&action=trashcomment&$del_nonce" );1389 $untrash_url = esc_url( $url . "&action=untrashcomment&$del_nonce" );1390 $delete_url = esc_url( $url . "&action=deletecomment&$del_nonce" );1391 }1392 1393 echo '<div id="submitted-on">';1394 /* translators: 2: comment date, 3: comment time */1395 printf( __( '<a href="%1$s">%2$s at %3$s</a>' ), $comment_url,1396 /* translators: comment date format. See http://php.net/date */ get_comment_date( __( 'Y/m/d' ) ),1397 /* translators: comment time format. See http://php.net/date */ get_comment_date( get_option( 'time_format' ) ) );1398 1399 if ( $comment->comment_parent ) {1400 $parent = get_comment( $comment->comment_parent );1401 $parent_link = esc_url( get_comment_link( $comment->comment_parent ) );1402 $name = get_comment_author( $parent->comment_ID );1403 printf( ' | '.__( 'In reply to <a href="%1$s">%2$s</a>.' ), $parent_link, $name );1404 }1405 1406 echo '</div>';1407 comment_text();1408 if ( $user_can ) { ?>1409 <div id="inline-<?php echo $comment->comment_ID; ?>" class="hidden">1410 <textarea class="comment" rows="1" cols="1"><?php echo esc_html( apply_filters( 'comment_edit_pre', $comment->comment_content ) ); ?></textarea>1411 <div class="author-email"><?php echo esc_attr( $comment->comment_author_email ); ?></div>1412 <div class="author"><?php echo esc_attr( $comment->comment_author ); ?></div>1413 <div class="author-url"><?php echo esc_attr( $comment->comment_author_url ); ?></div>1414 <div class="comment_status"><?php echo $comment->comment_approved; ?></div>1415 </div>1416 <?php1417 }1418 1419 if ( $user_can ) {1420 // preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash1421 $actions = array(1422 'approve' => '', 'unapprove' => '',1423 'reply' => '',1424 'quickedit' => '',1425 'edit' => '',1426 'spam' => '', 'unspam' => '',1427 'trash' => '', 'untrash' => '', 'delete' => ''1428 );1429 1430 if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments1431 if ( 'approved' == $the_comment_status )1432 $actions['unapprove'] = "<a href='$unapprove_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=unapproved vim-u vim-destructive' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';1433 else if ( 'unapproved' == $the_comment_status )1434 $actions['approve'] = "<a href='$approve_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=approved vim-a vim-destructive' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';1435 } else {1436 $actions['approve'] = "<a href='$approve_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved vim-a' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';1437 $actions['unapprove'] = "<a href='$unapprove_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved vim-u' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';1438 }1439 1440 if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) {1441 $actions['spam'] = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1 vim-s vim-destructive' title='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>';1442 } elseif ( 'spam' == $the_comment_status ) {1443 $actions['unspam'] = "<a href='$unspam_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:unspam=1 vim-z vim-destructive'>" . _x( 'Not Spam', 'comment' ) . '</a>';1444 } elseif ( 'trash' == $the_comment_status ) {1445 $actions['untrash'] = "<a href='$untrash_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:untrash=1 vim-z vim-destructive'>" . __( 'Restore' ) . '</a>';1446 }1447 1448 if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) {1449 $actions['delete'] = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID::delete=1 delete vim-d vim-destructive'>" . __( 'Delete Permanently' ) . '</a>';1450 } else {1451 $actions['trash'] = "<a href='$trash_url' class='delete:the-comment-list:comment-$comment->comment_ID::trash=1 delete vim-d vim-destructive' title='" . esc_attr__( 'Move this comment to the trash' ) . "'>" . _x( 'Trash', 'verb' ) . '</a>';1452 }1453 1454 if ( 'trash' != $the_comment_status ) {1455 $actions['edit'] = "<a href='comment.php?action=editcomment&c={$comment->comment_ID}' title='" . esc_attr__( 'Edit comment' ) . "'>". __( 'Edit' ) . '</a>';1456 $actions['quickedit'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\',\'edit\' );return false;" class="vim-q" title="'.esc_attr__( 'Quick Edit' ).'" href="#">' . __( 'Quick Edit' ) . '</a>';1457 if ( 'spam' != $the_comment_status )1458 $actions['reply'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\' );return false;" class="vim-r" title="'.esc_attr__( 'Reply to this comment' ).'" href="#">' . __( 'Reply' ) . '</a>';1459 }1460 1461 $actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment );1462 1463 $i = 0;1464 echo '<div class="row-actions">';1465 foreach ( $actions as $action => $link ) {1466 ++$i;1467 ( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';1468 1469 // Reply and quickedit need a hide-if-no-js span when not added with ajax1470 if ( ( 'reply' == $action || 'quickedit' == $action ) && ! $this->from_ajax )1471 $action .= ' hide-if-no-js';1472 elseif ( ( $action == 'untrash' && $the_comment_status == 'trash' ) || ( $action == 'unspam' && $the_comment_status == 'spam' ) ) {1473 if ( '1' == get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) )1474 $action .= ' approve';1475 else1476 $action .= ' unapprove';1477 }1478 1479 echo "<span class='$action'>$sep$link</span>";1480 }1481 echo '</div>';1482 }1483 }1484 1485 function column_author( $comment ) {1486 global $comment_status;1487 1488 $author_url = get_comment_author_url();1489 if ( 'http://' == $author_url )1490 $author_url = '';1491 $author_url_display = preg_replace( '|http://(www\.)?|i', '', $author_url );1492 if ( strlen( $author_url_display ) > 50 )1493 $author_url_display = substr( $author_url_display, 0, 49 ) . '...';1494 1495 echo "<strong>"; comment_author(); echo '</strong><br />';1496 if ( !empty( $author_url ) )1497 echo "<a title='$author_url' href='$author_url'>$author_url_display</a><br />";1498 1499 if ( $this->user_can ) {1500 if ( !empty( $comment->comment_author_email ) ) {1501 comment_author_email_link();1502 echo '<br />';1503 }1504 echo '<a href="edit-comments.php?s=';1505 comment_author_IP();1506 echo '&mode=detail';1507 if ( 'spam' == $comment_status )1508 echo '&comment_status=spam';1509 echo '">';1510 comment_author_IP();1511 echo '</a>';1512 }1513 }1514 1515 function column_date( $comment ) {1516 return get_comment_date( __( 'Y/m/d \a\t g:ia' ) );1517 }1518 1519 function column_response( $comment ) {1520 global $post;1521 1522 if ( isset( $this->pending_count[$post->ID] ) ) {1523 $pending_comments = $this->pending_count[$post->ID];1524 } else {1525 $_pending_count_temp = get_pending_comments_num( array( $post->ID ) );1526 $pending_comments = $this->pending_count[$post->ID] = $_pending_count_temp[$post->ID];1527 }1528 1529 if ( current_user_can( 'edit_post', $post->ID ) ) {1530 $post_link = "<a href='" . get_edit_post_link( $post->ID ) . "'>";1531 $post_link .= get_the_title( $post->ID ) . '</a>';1532 } else {1533 $post_link = get_the_title( $post->ID );1534 }1535 1536 echo '<div class="response-links"><span class="post-com-count-wrapper">';1537 echo $post_link . '<br />';1538 $this->comments_bubble( $post->ID, $pending_comments );1539 echo '</span> ';1540 echo "<a href='" . get_permalink( $post->ID ) . "'>#</a>";1541 echo '</div>';1542 if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) )1543 echo $thumb;1544 }1545 1546 function column_default( $comment, $column_name ) {1547 do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID );1548 }1549 }1550 1551 class WP_Post_Comments_Table extends WP_Comments_Table {1552 1553 function get_columns() {1554 return array(1555 'author' => __( 'Author' ),1556 'comment' => _x( 'Comment', 'column name' ),1557 );1558 }1559 1560 function get_sortable_columns() {1561 return array();1562 }1563 }1564 1565 class WP_Links_Table extends WP_List_Table {1566 1567 function WP_Links_Table() {1568 parent::WP_List_Table( array(1569 'screen' => 'link-manager',1570 'plural' => 'bookmarks',1571 ) );1572 }1573 1574 function check_permissions() {1575 if ( ! current_user_can( 'manage_links' ) )1576 wp_die( __( 'You do not have sufficient permissions to edit the links for this site.' ) );1577 }1578 1579 function prepare_items() {1580 global $cat_id, $s, $orderby, $order;1581 1582 wp_reset_vars( array( 'action', 'cat_id', 'linkurl', 'name', 'image', 'description', 'visible', 'target', 'category', 'link_id', 'submit', 'orderby', 'order', 'links_show_cat_id', 'rating', 'rel', 'notes', 'linkcheck[]', 's' ) );1583 1584 $args = array( 'hide_invisible' => 0, 'hide_empty' => 0 );1585 1586 if ( 'all' != $cat_id )1587 $args['category'] = $cat_id;1588 if ( !empty( $s ) )1589 $args['search'] = $s;1590 if ( !empty( $orderby ) )1591 $args['orderby'] = $orderby;1592 if ( !empty( $order ) )1593 $args['order'] = $order;1594 1595 $this->items = get_bookmarks( $args );1596 }1597 1598 function no_items() {1599 _e( 'No links found.' );1600 }1601 1602 function get_bulk_actions() {1603 $actions = array();1604 $actions['delete'] = __( 'Delete' );1605 1606 return $actions;1607 }1608 1609 function extra_tablenav( $which ) {1610 global $cat_id;1611 1612 if ( 'top' != $which )1613 return;1614 ?>1615 <div class="alignleft actions">1616 <?php1617 $dropdown_options = array(1618 'selected' => $cat_id,1619 'name' => 'cat_id',1620 'taxonomy' => 'link_category',1621 'show_option_all' => __( 'View all categories' ),1622 'hide_empty' => true,1623 'hierarchical' => 1,1624 'show_count' => 0,1625 'orderby' => 'name',1626 );1627 wp_dropdown_categories( $dropdown_options );1628 ?>1629 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />1630 </div>1631 <?php1632 }1633 1634 function get_columns() {1635 return array(1636 'cb' => '<input type="checkbox" />',1637 'name' => __( 'Name' ),1638 'url' => __( 'URL' ),1639 'categories' => __( 'Categories' ),1640 'rel' => __( 'Relationship' ),1641 'visible' => __( 'Visible' ),1642 'rating' => __( 'Rating' )1643 );1644 }1645 1646 function get_sortable_columns() {1647 return array(1648 'name' => 'name',1649 'url' => 'url',1650 'visible' => 'visible',1651 'rating' => 'rating'1652 );1653 }1654 1655 function display_rows() {1656 global $cat_id;1657 1658 $alt = 0;1659 1660 foreach ( $this->items as $link ) {1661 $link = sanitize_bookmark( $link );1662 $link->link_name = esc_attr( $link->link_name );1663 $link->link_category = wp_get_link_cats( $link->link_id );1664 1665 $short_url = str_replace( 'http://', '', $link->link_url );1666 $short_url = preg_replace( '/^www\./i', '', $short_url );1667 if ( '/' == substr( $short_url, -1 ) )1668 $short_url = substr( $short_url, 0, -1 );1669 if ( strlen( $short_url ) > 35 )1670 $short_url = substr( $short_url, 0, 32 ).'...';1671 1672 $visible = ( $link->link_visible == 'Y' ) ? __( 'Yes' ) : __( 'No' );1673 $rating = $link->link_rating;1674 $style = ( $alt++ % 2 ) ? '' : ' class="alternate"';1675 1676 $edit_link = get_edit_bookmark_link( $link );1677 ?>1678 <tr id="link-<?php echo $link->link_id; ?>" valign="middle" <?php echo $style; ?>>1679 <?php1680 1681 list( $columns, $hidden ) = $this->get_column_info();1682 1683 foreach ( $columns as $column_name => $column_display_name ) {1684 $class = "class='column-$column_name'";1685 1686 $style = '';1687 if ( in_array( $column_name, $hidden ) )1688 $style = ' style="display:none;"';1689 1690 $attributes = $class . $style;1691 1692 switch ( $column_name ) {1693 case 'cb':1694 echo '<th scope="row" class="check-column"><input type="checkbox" name="linkcheck[]" value="'. esc_attr( $link->link_id ) .'" /></th>';1695 break;1696 1697 case 'name':1698 echo "<td $attributes><strong><a class='row-title' href='$edit_link' title='" . esc_attr( sprintf( __( 'Edit “%s”' ), $link->link_name ) ) . "'>$link->link_name</a></strong><br />";1699 1700 $actions = array();1701 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';1702 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "link.php?action=delete&link_id=$link->link_id", 'delete-bookmark_' . $link->link_id ) . "' onclick=\"if ( confirm( '" . esc_js( sprintf( __( "You are about to delete this link '%s'\n 'Cancel' to stop, 'OK' to delete." ), $link->link_name ) ) . "' ) ) { return true;}return false;\">" . __( 'Delete' ) . "</a>";1703 echo $this->row_actions( $actions );1704 1705 echo '</td>';1706 break;1707 case 'url':1708 echo "<td $attributes><a href='$link->link_url' title='".sprintf( __( 'Visit %s' ), $link->link_name )."'>$short_url</a></td>";1709 break;1710 case 'categories':1711 ?><td <?php echo $attributes ?>><?php1712 $cat_names = array();1713 foreach ( $link->link_category as $category ) {1714 $cat = get_term( $category, 'link_category', OBJECT, 'display' );1715 if ( is_wp_error( $cat ) )1716 echo $cat->get_error_message();1717 $cat_name = $cat->name;1718 if ( $cat_id != $category )1719 $cat_name = "<a href='link-manager.php?cat_id=$category'>$cat_name</a>";1720 $cat_names[] = $cat_name;1721 }1722 echo implode( ', ', $cat_names );1723 ?></td><?php1724 break;1725 case 'rel':1726 ?><td <?php echo $attributes ?>><?php echo empty( $link->link_rel ) ? '<br />' : $link->link_rel; ?></td><?php1727 break;1728 case 'visible':1729 ?><td <?php echo $attributes ?>><?php echo $visible; ?></td><?php1730 break;1731 case 'rating':1732 ?><td <?php echo $attributes ?>><?php echo $rating; ?></td><?php1733 break;1734 default:1735 ?>1736 <td <?php echo $attributes ?>><?php do_action( 'manage_link_custom_column', $column_name, $link->link_id ); ?></td>1737 <?php1738 break;1739 }1740 }1741 ?>1742 </tr>1743 <?php1744 }1745 }1746 }1747 1748 class WP_Sites_Table extends WP_List_Table {1749 1750 function WP_Sites_Table() {1751 parent::WP_List_Table( array(1752 'screen' => 'sites-network',1753 'plural' => 'sites',1754 ) );1755 }1756 1757 function check_permissions() {1758 if ( ! current_user_can( 'manage_sites' ) )1759 wp_die( __( 'You do not have permission to access this page.' ) );1760 }1761 1762 function prepare_items() {1763 global $s, $mode, $wpdb;1764 1765 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'list' : $_REQUEST['mode'];1766 1767 $per_page = $this->get_items_per_page( 'sites_network_per_page' );1768 1769 $pagenum = $this->get_pagenum();1770 1771 $s = isset( $_REQUEST['s'] ) ? stripslashes( trim( $_REQUEST[ 's' ] ) ) : '';1772 $like_s = esc_sql( like_escape( $s ) );1773 1774 $query = "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' ";1775 1776 if ( isset( $_REQUEST['searchaction'] ) ) {1777 if ( 'name' == $_REQUEST['searchaction'] ) {1778 $query .= " AND ( {$wpdb->blogs}.domain LIKE '%{$like_s}%' OR {$wpdb->blogs}.path LIKE '%{$like_s}%' ) ";1779 } elseif ( 'id' == $_REQUEST['searchaction'] ) {1780 $query .= " AND {$wpdb->blogs}.blog_id = '{$like_s}' ";1781 } elseif ( 'ip' == $_REQUEST['searchaction'] ) {1782 $query = "SELECT *1783 FROM {$wpdb->blogs}, {$wpdb->registration_log}1784 WHERE site_id = '{$wpdb->siteid}'1785 AND {$wpdb->blogs}.blog_id = {$wpdb->registration_log}.blog_id1786 AND {$wpdb->registration_log}.IP LIKE ( '%{$like_s}%' )";1787 }1788 }1789 1790 $order_by = isset( $_REQUEST['orderby'] ) ? $_REQUEST['orderby'] : 'id';1791 if ( $order_by == 'registered' ) {1792 $query .= ' ORDER BY registered ';1793 } elseif ( $order_by == 'lastupdated' ) {1794 $query .= ' ORDER BY last_updated ';1795 } elseif ( $order_by == 'blogname' ) {1796 $query .= ' ORDER BY domain ';1797 } else {1798 $order_by = 'id';1799 $query .= " ORDER BY {$wpdb->blogs}.blog_id ";1800 }1801 1802 $order = ( isset( $_REQUEST['order'] ) && 'DESC' == strtoupper( $_REQUEST['order'] ) ) ? "DESC" : "ASC";1803 $query .= $order;1804 1805 $total = $wpdb->get_var( str_replace( 'SELECT *', 'SELECT COUNT( blog_id )', $query ) );1806 1807 $query .= " LIMIT " . intval( ( $pagenum - 1 ) * $per_page ) . ", " . intval( $per_page );1808 $this->items = $wpdb->get_results( $query, ARRAY_A );1809 1810 $this->set_pagination_args( array(1811 'total_items' => $total,1812 'per_page' => $per_page,1813 ) );1814 }1815 1816 function no_items() {1817 _e( 'No sites found.' );1818 }1819 1820 function get_bulk_actions() {1821 $actions = array();1822 $actions['delete'] = __( 'Delete' );1823 $actions['spam'] = _x( 'Mark as Spam', 'site' );1824 $actions['notspam'] = _x( 'Not Spam', 'site' );1825 1826 return $actions;1827 }1828 1829 function pagination( $which ) {1830 global $mode;1831 1832 parent::pagination( $which );1833 1834 if ( 'top' == $which )1835 $this->view_switcher( $mode );1836 }1837 1838 function get_columns() {1839 $blogname_columns = ( is_subdomain_install() ) ? __( 'Domain' ) : __( 'Path' );1840 $sites_columns = array(1841 'cb' => '<input type="checkbox" />',1842 'blogname' => $blogname_columns,1843 'lastupdated' => __( 'Last Updated' ),1844 'registered' => _x( 'Registered', 'site' ),1845 'users' => __( 'Users' )1846 );1847 1848 if ( has_filter( 'wpmublogsaction' ) )1849 $sites_columns['plugins'] = __( 'Actions' );1850 1851 $sites_columns = apply_filters( 'wpmu_blogs_columns', $sites_columns );1852 1853 return $sites_columns;1854 }1855 1856 function get_sortable_columns() {1857 return array(1858 'id' => 'id',1859 'blogname' => 'blogname',1860 'lastupdated' => 'lastupdated',1861 'registered' => 'registered',1862 );1863 }1864 1865 function display_rows() {1866 global $current_site, $mode;1867 1868 $status_list = array(1869 'archived' => array( 'site-archived', __( 'Archived' ) ),1870 'spam' => array( 'site-spammed', _x( 'Spam', 'site' ) ),1871 'deleted' => array( 'site-deleted', __( 'Deleted' ) ),1872 'mature' => array( 'site-mature', __( 'Mature' ) )1873 );1874 1875 $class = '';1876 foreach ( $this->items as $blog ) {1877 $class = ( 'alternate' == $class ) ? '' : 'alternate';1878 reset( $status_list );1879 1880 $blog_states = array();1881 foreach ( $status_list as $status => $col ) {1882 if ( get_blog_status( $blog['blog_id'], $status ) == 1 ) {1883 $class = $col[0];1884 $blog_states[] = $col[1];1885 }1886 }1887 $blog_state = '';1888 if ( ! empty( $blog_states ) ) {1889 $state_count = count( $blog_states );1890 $i = 0;1891 $blog_state .= ' - ';1892 foreach ( $blog_states as $state ) {1893 ++$i;1894 ( $i == $state_count ) ? $sep = '' : $sep = ', ';1895 $blog_state .= "<span class='post-state'>$state$sep</span>";1896 }1897 }1898 echo "<tr class='$class'>";1899 1900 $blogname = ( is_subdomain_install() ) ? str_replace( '.'.$current_site->domain, '', $blog['domain'] ) : $blog['path'];1901 1902 list( $columns, $hidden ) = $this->get_column_info();1903 1904 foreach ( $columns as $column_name => $column_display_name ) {1905 switch ( $column_name ) {1906 case 'cb': ?>1907 <th scope="row" class="check-column">1908 <input type="checkbox" id="blog_<?php echo $blog['blog_id'] ?>" name="allblogs[]" value="<?php echo esc_attr( $blog['blog_id'] ) ?>" />1909 </th>1910 <?php1911 break;1912 1913 case 'id': ?>1914 <th valign="top" scope="row">1915 <?php echo $blog['blog_id'] ?>1916 </th>1917 <?php1918 break;1919 1920 case 'blogname': ?>1921 <td class="column-title">1922 <a href="<?php echo esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ); ?>" class="edit"><?php echo $blogname . $blog_state; ?></a>1923 <?php1924 if ( 'list' != $mode )1925 echo '<p>' . sprintf( _x( '%1$s – <em>%2$s</em>', '%1$s: site name. %2$s: site tagline.' ), get_blog_option( $blog['blog_id'], 'blogname' ), get_blog_option( $blog['blog_id'], 'blogdescription ' ) ) . '</p>';1926 1927 // Preordered.1928 $actions = array(1929 'edit' => '', 'backend' => '',1930 'activate' => '', 'deactivate' => '',1931 'archive' => '', 'unarchive' => '',1932 'spam' => '', 'unspam' => '',1933 'delete' => '',1934 'visit' => '',1935 );1936 1937 $actions['edit'] = '<span class="edit"><a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ) . '">' . __( 'Edit' ) . '</a></span>';1938 $actions['backend'] = "<span class='backend'><a href='" . esc_url( get_admin_url( $blog['blog_id'] ) ) . "' class='edit'>" . __( 'Dashboard' ) . '</a></span>';1939 if ( $current_site->blog_id != $blog['blog_id'] ) {1940 if ( get_blog_status( $blog['blog_id'], 'deleted' ) == '1' )1941 $actions['activate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=activateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to activate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Activate' ) . '</a></span>';1942 else1943 $actions['deactivate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deactivateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to deactivate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Deactivate' ) . '</a></span>';1944 1945 if ( get_blog_status( $blog['blog_id'], 'archived' ) == '1' )1946 $actions['unarchive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unarchiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unarchive the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Unarchive' ) . '</a></span>';1947 else1948 $actions['archive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=archiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to archive the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Archive', 'verb; site' ) . '</a></span>';1949 1950 if ( get_blog_status( $blog['blog_id'], 'spam' ) == '1' )1951 $actions['unspam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unspamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unspam the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Not Spam', 'site' ) . '</a></span>';1952 else1953 $actions['spam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=spamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to mark the site %s as spam.' ), $blogname ) ) ) ) . '">' . _x( 'Spam', 'site' ) . '</a></span>';1954 1955 $actions['delete'] = '<span class="delete"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deleteblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to delete the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Delete' ) . '</a></span>';1956 }1957 1958 $actions['visit'] = "<span class='view'><a href='" . esc_url( get_home_url( $blog['blog_id'] ) ) . "' rel='permalink'>" . __( 'Visit' ) . '</a></span>';1959 $actions = array_filter( $actions );1960 echo $this->row_actions( $actions );1961 ?>1962 </td>1963 <?php1964 break;1965 1966 case 'lastupdated': ?>1967 <td valign="top">1968 <?php1969 if ( 'list' == $mode )1970 $date = 'Y/m/d';1971 else1972 $date = 'Y/m/d \<\b\r \/\> g:i:s a';1973 echo ( $blog['last_updated'] == '0000-00-00 00:00:00' ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] ); ?>1974 </td>1975 <?php1976 break;1977 case 'registered': ?>1978 <td valign="top">1979 <?php1980 if ( $blog['registered'] == '0000-00-00 00:00:00' )1981 echo '—';1982 else1983 echo mysql2date( $date, $blog['registered'] );1984 ?>1985 </td>1986 <?php1987 break;1988 case 'users': ?>1989 <td valign="top">1990 <?php1991 $blogusers = get_users( array( 'blog_id' => $blog['blog_id'], 'number' => 6) );1992 if ( is_array( $blogusers ) ) {1993 $blogusers_warning = '';1994 if ( count( $blogusers ) > 5 ) {1995 $blogusers = array_slice( $blogusers, 0, 5 );1996 $blogusers_warning = __( 'Only showing first 5 users.' ) . ' <a href="' . esc_url( get_admin_url( $blog['blog_id'], 'users.php' ) ) . '">' . __( 'More' ) . '</a>';1997 }1998 foreach ( $blogusers as $user_object ) {1999 echo '<a href="' . esc_url( admin_url( 'user-edit.php?user_id=' . $user_object->ID ) ) . '">' . esc_html( $user_object->user_login ) . '</a> ';2000 if ( 'list' != $mode )2001 echo '( ' . $user_object->user_email . ' )';2002 echo '<br />';2003 }2004 if ( $blogusers_warning != '' )2005 echo '<strong>' . $blogusers_warning . '</strong><br />';2006 }2007 ?>2008 </td>2009 <?php2010 break;2011 2012 case 'plugins': ?>2013 <?php if ( has_filter( 'wpmublogsaction' ) ) { ?>2014 <td valign="top">2015 <?php do_action( 'wpmublogsaction', $blog['blog_id'] ); ?>2016 </td>2017 <?php } ?>2018 <?php break;2019 2020 default: ?>2021 <?php if ( has_filter( 'manage_blogs_custom_column' ) ) { ?>2022 <td valign="top">2023 <?php do_action( 'manage_blogs_custom_column', $column_name, $blog['blog_id'] ); ?>2024 </td>2025 <?php } ?>2026 <?php break;2027 }2028 }2029 ?>2030 </tr>2031 <?php2032 }2033 }2034 }2035 2036 class WP_MS_Users_Table extends WP_List_Table {2037 2038 function WP_MS_Users_Table() {2039 parent::WP_List_Table( array(2040 'screen' => 'users-network',2041 ) );2042 }2043 2044 function check_permissions() {2045 if ( !is_multisite() )2046 wp_die( __( 'Multisite support is not enabled.' ) );2047 2048 if ( ! current_user_can( 'manage_network_users' ) )2049 wp_die( __( 'You do not have permission to access this page.' ) );2050 }2051 2052 function prepare_items() {2053 global $usersearch;2054 2055 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';2056 2057 $users_per_page = $this->get_items_per_page( 'users_network_per_page' );2058 2059 $paged = $this->get_pagenum();2060 2061 $args = array(2062 'number' => $users_per_page,2063 'offset' => ( $paged-1 ) * $users_per_page,2064 'search' => $usersearch,2065 'blog_id' => 02066 );2067 2068 if ( isset( $_REQUEST['orderby'] ) )2069 $args['orderby'] = $_REQUEST['orderby'];2070 2071 if ( isset( $_REQUEST['order'] ) )2072 $args['order'] = $_REQUEST['order'];2073 2074 // Query the user IDs for this page2075 $wp_user_search = new WP_User_Query( $args );2076 2077 $this->items = $wp_user_search->get_results();2078 2079 $this->set_pagination_args( array(2080 'total_items' => $wp_user_search->get_total(),2081 'per_page' => $users_per_page,2082 ) );2083 }2084 2085 function get_bulk_actions() {2086 $actions = array();2087 $actions['delete'] = __( 'Delete' );2088 $actions['spam'] = _x( 'Mark as Spam', 'user' );2089 $actions['notspam'] = _x( 'Not Spam', 'user' );2090 2091 return $actions;2092 }2093 2094 function no_items() {2095 _e( 'No users found.' );2096 }2097 2098 function pagination( $which ) {2099 global $mode;2100 2101 parent::pagination ( $which );2102 2103 if ( 'top' == $which )2104 $this->view_switcher( $mode );2105 }2106 2107 function get_columns() {2108 $users_columns = array(2109 'cb' => '<input type="checkbox" />',2110 'login' => __( 'Login' ),2111 'name' => __( 'Name' ),2112 'email' => __( 'E-mail' ),2113 'registered' => _x( 'Registered', 'user' ),2114 'blogs' => __( 'Sites' )2115 );2116 $users_columns = apply_filters( 'wpmu_users_columns', $users_columns );2117 2118 return $users_columns;2119 }2120 2121 function get_sortable_columns() {2122 return array(2123 'id' => 'id',2124 'login' => 'login',2125 'name' => 'name',2126 'email' => 'email',2127 'registered' => 'registered',2128 );2129 }2130 2131 function display_rows() {2132 global $current_site, $mode;2133 2134 $class = '';2135 $super_admins = get_super_admins();2136 foreach ( $this->items as $user ) {2137 $class = ( 'alternate' == $class ) ? '' : 'alternate';2138 2139 $status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' );2140 2141 foreach ( $status_list as $status => $col ) {2142 if ( $user->$status )2143 $class = $col;2144 }2145 2146 ?>2147 <tr class="<?php echo $class; ?>">2148 <?php2149 2150 list( $columns, $hidden ) = $this->get_column_info();2151 2152 foreach ( $columns as $column_name => $column_display_name ) :2153 switch ( $column_name ) {2154 case 'cb': ?>2155 <th scope="row" class="check-column">2156 <input type="checkbox" id="blog_<?php echo $user->ID ?>" name="allusers[]" value="<?php echo esc_attr( $user->ID ) ?>" />2157 </th>2158 <?php2159 break;2160 2161 case 'id': ?>2162 <th valign="top" scope="row">2163 <?php echo $user->ID ?>2164 </th>2165 <?php2166 break;2167 2168 case 'login':2169 $avatar = get_avatar( $user->user_email, 32 );2170 $edit_link = ( get_current_user_id() == $user->ID ) ? 'profile.php' : 'user-edit.php?user_id=' . $user->ID;2171 ?>2172 <td class="username column-username">2173 <?php echo $avatar; ?><strong><a href="<?php echo esc_url( self_admin_url( $edit_link ) ); ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a><?php2174 if ( in_array( $user->user_login, $super_admins ) )2175 echo ' - ' . __( 'Super admin' );2176 ?></strong>2177 <br/>2178 <?php2179 $actions = array();2180 $actions['edit'] = '<a href="' . esc_url( self_admin_url( $edit_link ) ) . '">' . __( 'Edit' ) . '</a>';2181 2182 if ( ! in_array( $user->user_login, $super_admins ) ) {2183 $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deleteuser' ) . '&action=deleteuser&id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';2184 }2185 2186 echo $this->row_actions( $actions );2187 ?>2188 </div>2189 </td>2190 <?php2191 break;2192 2193 case 'name': ?>2194 <td class="name column-name"><?php echo $user->display_name ?></td>2195 <?php2196 break;2197 2198 case 'email': ?>2199 <td class="email column-email"><a href="mailto:<?php echo $user->user_email ?>"><?php echo $user->user_email ?></a></td>2200 <?php2201 break;2202 2203 case 'registered':2204 if ( 'list' == $mode )2205 $date = 'Y/m/d';2206 else2207 $date = 'Y/m/d \<\b\r \/\> g:i:s a';2208 ?>2209 <td><?php echo mysql2date( $date, $user->user_registered ); ?></td>2210 <?php2211 break;2212 2213 case 'blogs':2214 $blogs = get_blogs_of_user( $user->ID, true );2215 ?>2216 <td>2217 <?php2218 if ( is_array( $blogs ) ) {2219 foreach ( (array) $blogs as $key => $val ) {2220 $path = ( $val->path == '/' ) ? '' : $val->path;2221 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . str_replace( '.' . $current_site->domain, '', $val->domain . $path ) . '</a>';2222 echo ' <small class="row-actions">';2223 2224 // Edit2225 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . __( 'Edit' ) . '</a> | ';2226 2227 // View2228 echo '<a ';2229 if ( get_blog_status( $val->userblog_id, 'spam' ) == 1 )2230 echo 'style="background-color: #faa" ';2231 echo 'href="' . esc_url( get_home_url( $val->userblog_id ) ) . '">' . __( 'View' ) . '</a>';2232 2233 echo '</small><br />';2234 }2235 }2236 ?>2237 </td>2238 <?php2239 break;2240 2241 default: ?>2242 <td><?php do_action( 'manage_users_custom_column', $column_name, $user->ID ); ?></td>2243 <?php2244 break;2245 }2246 endforeach2247 ?>2248 </tr>2249 <?php2250 }2251 }2252 }2253 2254 class WP_Plugins_Table extends WP_List_Table {2255 2256 function WP_Plugins_Table() {2257 global $status, $page;2258 2259 $default_status = get_user_option( 'plugins_last_view' );2260 if ( empty( $default_status ) )2261 $default_status = 'all';2262 $status = isset( $_REQUEST['plugin_status'] ) ? $_REQUEST['plugin_status'] : $default_status;2263 if ( !in_array( $status, array( 'all', 'active', 'inactive', 'recently_activated', 'upgrade', 'network', 'mustuse', 'dropins', 'search' ) ) )2264 $status = 'all';2265 if ( $status != $default_status && 'search' != $status )2266 update_user_meta( get_current_user_id(), 'plugins_last_view', $status );2267 2268 $page = $this->get_pagenum();2269 2270 parent::WP_List_Table( array(2271 'screen' => 'plugins',2272 'plural' => 'plugins',2273 ) );2274 }2275 2276 function check_permissions() {2277 if ( is_multisite() ) {2278 $menu_perms = get_site_option( 'menu_items', array() );2279 2280 if ( empty( $menu_perms['plugins'] ) ) {2281 if ( !is_super_admin() )2282 wp_die( __( 'Cheatin’ uh?' ) );2283 }2284 }2285 2286 if ( !current_user_can('activate_plugins') )2287 wp_die( __( 'You do not have sufficient permissions to manage plugins for this site.' ) );2288 }2289 2290 function prepare_items() {2291 global $status, $plugins, $totals, $page, $orderby, $order, $s;2292 2293 wp_reset_vars( array( 'orderby', 'order', 's' ) );2294 2295 $plugins = array(2296 'all' => apply_filters( 'all_plugins', get_plugins() ),2297 'search' => array(),2298 'active' => array(),2299 'inactive' => array(),2300 'recently_activated' => array(),2301 'upgrade' => array(),2302 'mustuse' => array(),2303 'dropins' => array()2304 );2305 2306 if ( ! is_multisite() || ( is_network_admin() && current_user_can('manage_network_plugins') ) ) {2307 if ( apply_filters( 'show_advanced_plugins', true, 'mustuse' ) )2308 $plugins['mustuse'] = get_mu_plugins();2309 if ( apply_filters( 'show_advanced_plugins', true, 'dropins' ) )2310 $plugins['dropins'] = get_dropins();2311 }2312 2313 set_transient( 'plugin_slugs', array_keys( $plugins['all'] ), 86400 );2314 2315 $recently_activated = get_option( 'recently_activated', array() );2316 2317 $one_week = 7*24*60*60;2318 foreach ( $recently_activated as $key => $time )2319 if ( $time + $one_week < time() )2320 unset( $recently_activated[$key] );2321 update_option( 'recently_activated', $recently_activated );2322 2323 $current = get_site_transient( 'update_plugins' );2324 2325 foreach ( array( 'all', 'mustuse', 'dropins' ) as $type ) {2326 foreach ( (array) $plugins[$type] as $plugin_file => $plugin_data ) {2327 // Translate, Apply Markup, Sanitize HTML2328 $plugins[$type][$plugin_file] = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, false, true );2329 }2330 }2331 2332 foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) {2333 // Filter into individual sections2334 if ( is_plugin_active_for_network($plugin_file) && !is_network_admin() ) {2335 unset( $plugins['all'][ $plugin_file ] );2336 continue;2337 } elseif ( is_multisite() && is_network_only_plugin( $plugin_file ) && !current_user_can( 'manage_network_plugins' ) ) {2338 $plugins['network'][ $plugin_file ] = $plugin_data;2339 } elseif ( ( !is_network_admin() && is_plugin_active( $plugin_file ) )2340 || ( is_network_admin() && is_plugin_active_for_network( $plugin_file ) ) ) {2341 $plugins['active'][ $plugin_file ] = $plugin_data;2342 } else {2343 if ( !is_network_admin() && isset( $recently_activated[ $plugin_file ] ) ) // Was the plugin recently activated?2344 $plugins['recently_activated'][ $plugin_file ] = $plugin_data;2345 $plugins['inactive'][ $plugin_file ] = $plugin_data;2346 }2347 2348 if ( isset( $current->response[ $plugin_file ] ) )2349 $plugins['upgrade'][ $plugin_file ] = $plugin_data;2350 }2351 2352 if ( !current_user_can( 'update_plugins' ) )2353 $plugins['upgrade'] = array();2354 2355 if ( $s ) {2356 $status = 'search';2357 $plugins['search'] = array_filter( $plugins['all'], array( $this, '_search_callback' ) );2358 }2359 2360 $totals = array();2361 foreach ( $plugins as $type => $list )2362 $totals[ $type ] = count( $list );2363 2364 if ( empty( $plugins[ $status ] ) && !in_array( $status, array( 'all', 'search' ) ) )2365 $status = 'all';2366 2367 $this->items = $plugins[ $status ];2368 $total_this_page = $totals[ $status ];2369 2370 if ( $orderby ) {2371 $orderby = ucfirst( $orderby );2372 $order = strtoupper( $order );2373 2374 uasort( $this->items, array( $this, '_order_callback' ) );2375 }2376 2377 $plugins_per_page = $this->get_items_per_page( 'plugins_per_page', 999 );2378 2379 $start = ( $page - 1 ) * $plugins_per_page;2380 2381 if ( $total_this_page > $plugins_per_page )2382 $this->items = array_slice( $this->items, $start, $plugins_per_page );2383 2384 $this->set_pagination_args( array(2385 'total_items' => $total_this_page,2386 'per_page' => $plugins_per_page,2387 ) );2388 }2389 2390 function _search_callback( $plugin ) {2391 static $term;2392 if ( is_null( $term ) )2393 $term = stripslashes( $_REQUEST['s'] );2394 2395 foreach ( $plugin as $value )2396 if ( stripos( $value, $term ) !== false )2397 return true;2398 2399 return false;2400 }2401 2402 function _order_callback( $plugin_a, $plugin_b ) {2403 global $orderby, $order;2404 2405 $a = $plugin_a[$orderby];2406 $b = $plugin_b[$orderby];2407 2408 if ( $a == $b )2409 return 0;2410 2411 if ( 'DESC' == $order )2412 return ( $a < $b ) ? 1 : -1;2413 else2414 return ( $a < $b ) ? -1 : 1;2415 }2416 2417 function no_items() {2418 global $plugins;2419 2420 if ( !empty( $plugins['all'] ) )2421 _e( 'No plugins found.' );2422 else2423 _e( 'You do not appear to have any plugins available at this time.' );2424 }2425 2426 function get_columns() {2427 global $status;2428 2429 return array(2430 'cb' => !in_array( $status, array( 'mustuse', 'dropins' ) ) ? '<input type="checkbox" />' : '',2431 'name' => __( 'Plugin' ),2432 'description' => __( 'Description' ),2433 );2434 }2435 2436 function get_sortable_columns() {2437 return array(2438 'name' => 'name',2439 'description' => 'description',2440 );2441 }2442 2443 function display_tablenav( $which ) {2444 global $status;2445 2446 if ( !in_array( $status, array( 'mustuse', 'dropins' ) ) )2447 parent::display_tablenav( $which );2448 }2449 2450 function get_views() {2451 global $totals, $status;2452 2453 $status_links = array();2454 foreach ( $totals as $type => $count ) {2455 if ( !$count )2456 continue;2457 2458 switch ( $type ) {2459 case 'all':2460 $text = _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $count, 'plugins' );2461 break;2462 case 'active':2463 $text = _n( 'Active <span class="count">(%s)</span>', 'Active <span class="count">(%s)</span>', $count );2464 break;2465 case 'recently_activated':2466 $text = _n( 'Recently Active <span class="count">(%s)</span>', 'Recently Active <span class="count">(%s)</span>', $count );2467 break;2468 case 'inactive':2469 $text = _n( 'Inactive <span class="count">(%s)</span>', 'Inactive <span class="count">(%s)</span>', $count );2470 break;2471 case 'network':2472 $text = _n( 'Network <span class="count">(%s)</span>', 'Network <span class="count">(%s)</span>', $count );2473 break;2474 case 'mustuse':2475 $text = _n( 'Must-Use <span class="count">(%s)</span>', 'Must-Use <span class="count">(%s)</span>', $count );2476 break;2477 case 'dropins':2478 $text = _n( 'Drop-ins <span class="count">(%s)</span>', 'Drop-ins <span class="count">(%s)</span>', $count );2479 break;2480 case 'upgrade':2481 $text = _n( 'Upgrade Available <span class="count">(%s)</span>', 'Upgrade Available <span class="count">(%s)</span>', $count );2482 break;2483 case 'search':2484 $text = _n( 'Search Results <span class="count">(%s)</span>', 'Search Results <span class="count">(%s)</span>', $count );2485 break;2486 }2487 2488 $status_links[$type] = sprintf( "<li><a href='%s' %s>%s</a>",2489 add_query_arg('plugin_status', $type, 'plugins.php'),2490 ( $type == $status ) ? ' class="current"' : '',2491 sprintf( $text, number_format_i18n( $count ) )2492 );2493 }2494 2495 return $status_links;2496 }2497 2498 function get_bulk_actions() {2499 global $status;2500 2501 $actions = array();2502 if ( 'active' != $status )2503 $actions['activate-selected'] = __( 'Activate' );2504 if ( is_multisite() && 'network' != $status )2505 $actions['network-activate-selected'] = __( 'Network Activate' );2506 if ( 'inactive' != $status && 'recent' != $status )2507 $actions['deactivate-selected'] = __( 'Deactivate' );2508 if ( current_user_can( 'update_plugins' ) )2509 $actions['update-selected'] = __( 'Update' );2510 if ( current_user_can( 'delete_plugins' ) && ( 'active' != $status ) )2511 $actions['delete-selected'] = __( 'Delete' );2512 2513 return $actions;2514 }2515 2516 function bulk_actions( $which ) {2517 global $status;2518 2519 if ( in_array( $status, array( 'mustuse', 'dropins' ) ) )2520 return;2521 2522 parent::bulk_actions( $which );2523 }2524 2525 function extra_tablenav( $which ) {2526 global $status;2527 2528 if ( 'recently_activated' == $status ) { ?>2529 <div class="alignleft actions">2530 <input type="submit" name="clear-recent-list" value="<?php esc_attr_e( 'Clear List' ) ?>" class="button-secondary" />2531 </div>2532 <?php }2533 }2534 2535 function current_action() {2536 if ( isset($_POST['clear-recent-list']) )2537 return 'clear-recent-list';2538 2539 return parent::current_action();2540 }2541 2542 function display_rows() {2543 global $status, $page, $s;2544 2545 $context = $status;2546 2547 foreach ( $this->items as $plugin_file => $plugin_data ) {2548 // preorder2549 $actions = array(2550 'network_deactivate' => '', 'deactivate' => '',2551 'network_only' => '', 'activate' => '',2552 'network_activate' => '',2553 'edit' => '',2554 'delete' => '',2555 );2556 2557 if ( 'mustuse' == $context ) {2558 if ( is_multisite() && !is_network_admin() )2559 continue;2560 $is_active = true;2561 } elseif ( 'dropins' == $context ) {2562 if ( is_multisite() && !is_network_admin() )2563 continue;2564 $dropins = _get_dropins();2565 $plugin_name = $plugin_file;2566 if ( $plugin_file != $plugin_data['Name'] )2567 $plugin_name .= '<br/>' . $plugin_data['Name'];2568 if ( true === ( $dropins[ $plugin_file ][1] ) ) { // Doesn't require a constant2569 $is_active = true;2570 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';2571 } elseif ( constant( $dropins[ $plugin_file ][1] ) ) { // Constant is true2572 $is_active = true;2573 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';2574 } else {2575 $is_active = false;2576 $description = '<p><strong>' . $dropins[ $plugin_file ][0] . ' <span class="attention">' . __('Inactive:') . '</span></strong> ' . sprintf( __( 'Requires <code>%s</code> in <code>wp-config.php</code>.' ), "define('" . $dropins[ $plugin_file ][1] . "', true);" ) . '</p>';2577 }2578 if ( $plugin_data['Description'] )2579 $description .= '<p>' . $plugin_data['Description'] . '</p>';2580 } else {2581 $is_active_for_network = is_plugin_active_for_network($plugin_file);2582 if ( is_network_admin() )2583 $is_active = $is_active_for_network;2584 else2585 $is_active = is_plugin_active( $plugin_file );2586 2587 if ( $is_active_for_network && !is_super_admin() && !is_network_admin() )2588 continue;2589 2590 if ( is_network_admin() ) {2591 if ( $is_active_for_network ) {2592 if ( current_user_can( 'manage_network_plugins' ) )2593 $actions['network_deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Network Deactivate') . '</a>';2594 } else {2595 if ( current_user_can( 'manage_network_plugins' ) )2596 $actions['network_activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&networkwide=1&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin for all sites in this network') . '" class="edit">' . __('Network Activate') . '</a>';2597 if ( current_user_can('delete_plugins') )2598 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';2599 }2600 } else {2601 if ( $is_active ) {2602 $actions['deactivate'] = '<a href="' . wp_nonce_url('plugins.php?action=deactivate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file) . '" title="' . __('Deactivate this plugin') . '">' . __('Deactivate') . '</a>';2603 } else {2604 if ( is_network_only_plugin( $plugin_file ) && !is_network_admin() )2605 continue;2606 2607 $actions['activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin') . '" class="edit">' . __('Activate') . '</a>';2608 2609 if ( current_user_can('delete_plugins') )2610 $actions['delete'] = '<a href="' . wp_nonce_url('plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins') . '" title="' . __('Delete this plugin') . '" class="delete">' . __('Delete') . '</a>';2611 } // end if $is_active2612 } // end if is_network_admin()2613 2614 if ( current_user_can('edit_plugins') && is_writable(WP_PLUGIN_DIR . '/' . $plugin_file) )2615 $actions['edit'] = '<a href="plugin-editor.php?file=' . $plugin_file . '" title="' . __('Open this file in the Plugin Editor') . '" class="edit">' . __('Edit') . '</a>';2616 } // end if $context2617 2618 $actions = apply_filters( 'plugin_action_links', array_filter( $actions ), $plugin_file, $plugin_data, $context );2619 $actions = apply_filters( "plugin_action_links_$plugin_file", $actions, $plugin_file, $plugin_data, $context );2620 2621 $class = $is_active ? 'active' : 'inactive';2622 $checkbox = in_array( $status, array( 'mustuse', 'dropins' ) ) ? '' : "<input type='checkbox' name='checked[]' value='" . esc_attr( $plugin_file ) . "' />";2623 if ( 'dropins' != $status ) {2624 $description = '<p>' . $plugin_data['Description'] . '</p>';2625 $plugin_name = $plugin_data['Name'];2626 }2627 2628 $id = sanitize_title( $plugin_name );2629 2630 echo "2631 <tr id='$id' class='$class'>2632 <th scope='row' class='check-column'>$checkbox</th>2633 <td class='plugin-title'><strong>$plugin_name</strong></td>2634 <td class='desc'>$description</td>2635 </tr>2636 <tr class='$class second'>2637 <td></td>2638 <td class='plugin-title'>";2639 2640 echo $this->row_actions( $actions, true );2641 2642 echo "</td>2643 <td class='desc'>";2644 $plugin_meta = array();2645 if ( !empty( $plugin_data['Version'] ) )2646 $plugin_meta[] = sprintf( __( 'Version %s' ), $plugin_data['Version'] );2647 if ( !empty( $plugin_data['Author'] ) ) {2648 $author = $plugin_data['Author'];2649 if ( !empty( $plugin_data['AuthorURI'] ) )2650 $author = '<a href="' . $plugin_data['AuthorURI'] . '" title="' . __( 'Visit author homepage' ) . '">' . $plugin_data['Author'] . '</a>';2651 $plugin_meta[] = sprintf( __( 'By %s' ), $author );2652 }2653 if ( ! empty( $plugin_data['PluginURI'] ) )2654 $plugin_meta[] = '<a href="' . $plugin_data['PluginURI'] . '" title="' . __( 'Visit plugin site' ) . '">' . __( 'Visit plugin site' ) . '</a>';2655 2656 $plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status );2657 echo implode( ' | ', $plugin_meta );2658 echo "</td>2659 </tr>\n";2660 2661 do_action( 'after_plugin_row', $plugin_file, $plugin_data, $status );2662 do_action( "after_plugin_row_$plugin_file", $plugin_file, $plugin_data, $status );2663 }2664 }2665 }2666 2667 class WP_Plugin_Install_Table extends WP_List_Table {2668 2669 function WP_Plugin_Install_Table() {2670 parent::WP_List_Table( array(2671 'screen' => 'plugin-install',2672 ) );2673 }2674 2675 function check_permissions() {2676 if ( ! current_user_can('install_plugins') )2677 wp_die(__('You do not have sufficient permissions to install plugins on this site.'));2678 }2679 2680 function prepare_items() {2681 include( ABSPATH . 'wp-admin/includes/plugin-install.php' );2682 2683 global $tabs, $tab, $paged, $type, $term;2684 2685 wp_reset_vars( array( 'tab' ) );2686 2687 $paged = $this->get_pagenum();2688 2689 $per_page = 30;2690 2691 // These are the tabs which are shown on the page2692 $tabs = array();2693 $tabs['dashboard'] = __( 'Search' );2694 if ( 'search' == $tab )2695 $tabs['search'] = __( 'Search Results' );2696 $tabs['upload'] = __( 'Upload' );2697 $tabs['featured'] = _x( 'Featured','Plugin Installer' );2698 $tabs['popular'] = _x( 'Popular','Plugin Installer' );2699 $tabs['new'] = _x( 'Newest','Plugin Installer' );2700 $tabs['updated'] = _x( 'Recently Updated','Plugin Installer' );2701 2702 $nonmenu_tabs = array( 'plugin-information' ); //Valid actions to perform which do not have a Menu item.2703 2704 $tabs = apply_filters( 'install_plugins_tabs', $tabs );2705 $nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs );2706 2707 // If a non-valid menu tab has been selected, And its not a non-menu action.2708 if ( empty( $tab ) || ( !isset( $tabs[ $tab ] ) && !in_array( $tab, (array) $nonmenu_tabs ) ) )2709 $tab = key( $tabs );2710 2711 $args = array( 'page' => $paged, 'per_page' => $per_page );2712 2713 switch ( $tab ) {2714 case 'search':2715 $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : '';2716 $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '';2717 2718 switch ( $type ) {2719 case 'tag':2720 $args['tag'] = sanitize_title_with_dashes( $term );2721 break;2722 case 'term':2723 $args['search'] = $term;2724 break;2725 case 'author':2726 $args['author'] = $term;2727 break;2728 }2729 2730 add_action( 'install_plugins_table_header', 'install_search_form' );2731 break;2732 2733 case 'featured':2734 case 'popular':2735 case 'new':2736 case 'updated':2737 $args['browse'] = $tab;2738 break;2739 2740 default:2741 $args = false;2742 }2743 2744 if ( !$args )2745 return;2746 2747 $api = plugins_api( 'query_plugins', $args );2748 2749 if ( is_wp_error( $api ) )2750 wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' );2751 2752 $this->items = $api->plugins;2753 2754 $this->set_pagination_args( array(2755 'total_items' => $api->info['results'],2756 'per_page' => $per_page,2757 ) );2758 }2759 2760 function no_items() {2761 _e( 'No plugins match your request.' );2762 }2763 2764 function get_views() {2765 global $tabs, $tab;2766 2767 $display_tabs = array();2768 foreach ( (array) $tabs as $action => $text ) {2769 $class = ( $action == $tab ) ? ' class="current"' : '';2770 $href = admin_url('plugin-install.php?tab=' . $action);2771 $display_tabs[$action] = "<a href='$href'$class>$text</a>";2772 }2773 2774 return $display_tabs;2775 }2776 2777 function display_tablenav( $which ) {2778 if ( 'top' == $which ) { ?>2779 <div class="tablenav">2780 <div class="alignleft actions">2781 <?php do_action( 'install_plugins_table_header' ); ?>2782 </div>2783 <?php $this->pagination( $which ); ?>2784 <br class="clear" />2785 </div>2786 <?php } else { ?>2787 <div class="tablenav">2788 <?php $this->pagination( $which ); ?>2789 <br class="clear" />2790 </div>2791 <?php2792 }2793 }2794 2795 function get_table_classes() {2796 extract( $this->_args );2797 2798 return array( 'widefat', $plural );2799 }2800 2801 function get_columns() {2802 return array(2803 'name' => __( 'Name' ),2804 'version' => __( 'Version' ),2805 'rating' => __( 'Rating' ),2806 'description' => __( 'Description' ),2807 );2808 }2809 2810 function display_rows() {2811 $plugins_allowedtags = array(2812 'a' => array( 'href' => array(),'title' => array(), 'target' => array() ),2813 'abbr' => array( 'title' => array() ),'acronym' => array( 'title' => array() ),2814 'code' => array(), 'pre' => array(), 'em' => array(),'strong' => array(),2815 'ul' => array(), 'ol' => array(), 'li' => array(), 'p' => array(), 'br' => array()2816 );2817 2818 foreach ( (array) $this->items as $plugin ) {2819 if ( is_object( $plugin ) )2820 $plugin = (array) $plugin;2821 2822 $title = wp_kses( $plugin['name'], $plugins_allowedtags );2823 //Limit description to 400char, and remove any HTML.2824 $description = strip_tags( $plugin['description'] );2825 if ( strlen( $description ) > 400 )2826 $description = mb_substr( $description, 0, 400 ) . '…';2827 //remove any trailing entities2828 $description = preg_replace( '/&[^;\s]{0,6}$/', '', $description );2829 //strip leading/trailing & multiple consecutive lines2830 $description = trim( $description );2831 $description = preg_replace( "|(\r?\n)+|", "\n", $description );2832 //\n => <br>2833 $description = nl2br( $description );2834 $version = wp_kses( $plugin['version'], $plugins_allowedtags );2835 2836 $name = strip_tags( $title . ' ' . $version );2837 2838 $author = $plugin['author'];2839 if ( ! empty( $plugin['author'] ) )2840 $author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '.</cite>';2841 2842 $author = wp_kses( $author, $plugins_allowedtags );2843 2844 $action_links = array();2845 $action_links[] = '<a href="' . admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin['slug'] .2846 '&TB_iframe=true&width=600&height=550' ) . '" class="thickbox" title="' .2847 esc_attr( sprintf( __( 'More information about %s' ), $name ) ) . '">' . __( 'Details' ) . '</a>';2848 2849 if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) {2850 $status = install_plugin_install_status( $plugin );2851 2852 switch ( $status['status'] ) {2853 case 'install':2854 if ( $status['url'] )2855 $action_links[] = '<a class="install-now" href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Install %s' ), $name ) ) . '">' . __( 'Install Now' ) . '</a>';2856 break;2857 case 'update_available':2858 if ( $status['url'] )2859 $action_links[] = '<a href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Update to version %s' ), $status['version'] ) ) . '">' . sprintf( __( 'Update Now' ), $status['version'] ) . '</a>';2860 break;2861 case 'latest_installed':2862 case 'newer_installed':2863 $action_links[] = '<span title="' . esc_attr__( 'This plugin is already installed and is up to date' ) . ' ">' . __( 'Installed' ) . '</span>';2864 break;2865 }2866 }2867 2868 $action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin );2869 ?>2870 <tr>2871 <td class="name"><strong><?php echo $title; ?></strong>2872 <div class="action-links"><?php if ( !empty( $action_links ) ) echo implode( ' | ', $action_links ); ?></div>2873 </td>2874 <td class="vers"><?php echo $version; ?></td>2875 <td class="vers">2876 <div class="star-holder" title="<?php printf( _n( '( based on %s rating )', '( based on %s ratings )', $plugin['num_ratings'] ), number_format_i18n( $plugin['num_ratings'] ) ) ?>">2877 <div class="star star-rating" style="width: <?php echo esc_attr( $plugin['rating'] ) ?>px"></div>2878 <div class="star star5"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '5 stars' ) ?>" /></div>2879 <div class="star star4"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '4 stars' ) ?>" /></div>2880 <div class="star star3"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '3 stars' ) ?>" /></div>2881 <div class="star star2"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '2 stars' ) ?>" /></div>2882 <div class="star star1"><img src="<?php echo admin_url( 'images/star.gif' ); ?>" alt="<?php _e( '1 star' ) ?>" /></div>2883 </div>2884 </td>2885 <td class="desc"><?php echo $description, $author; ?></td>2886 </tr>2887 <?php2888 }2889 }2890 }2891 2892 class WP_Themes_Table extends WP_List_Table {2893 2894 var $search = array();2895 var $features = array();2896 2897 function WP_Themes_Table() {2898 parent::__construct( array(2899 'screen' => 'themes',2900 ) );2901 }2902 2903 function check_permissions() {2904 if ( !current_user_can('switch_themes') && !current_user_can('edit_theme_options') )2905 wp_die( __( 'Cheatin’ uh?' ) );2906 }2907 2908 function prepare_items() {2909 global $ct;2910 2911 $ct = current_theme_info();2912 2913 $themes = get_allowed_themes();2914 2915 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';2916 2917 if ( '' !== $search ) {2918 $this->search = array_merge( $this->search, array_filter( array_map( 'trim', explode( ',', $search ) ) ) );2919 $this->search = array_unique( $this->search );2920 }2921 2922 if ( !empty( $_REQUEST['features'] ) ) {2923 $this->features = $_REQUEST['features'];2924 $this->features = array_map( 'trim', $this->features );2925 $this->features = array_map( 'sanitize_title_with_dashes', $this->features );2926 $this->features = array_unique( $this->features );2927 }2928 2929 if ( $this->search || $this->features ) {2930 foreach ( $themes as $key => $theme ) {2931 if ( !$this->search_theme( $theme ) )2932 unset( $themes[ $key ] );2933 }2934 }2935 2936 unset( $themes[$ct->name] );2937 uksort( $themes, "strnatcasecmp" );2938 2939 $per_page = 15;2940 $page = $this->get_pagenum();2941 2942 $start = ( $page - 1 ) * $per_page;2943 2944 $this->items = array_slice( $themes, $start, $per_page );2945 2946 $this->set_pagination_args( array(2947 'query_var' => 'pagenum',2948 'total_items' => count( $themes ),2949 'per_page' => $per_page,2950 ) );2951 }2952 2953 function no_items() {2954 if ( current_user_can( 'install_themes' ) )2955 printf( __( 'You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress.org Theme Directory at any time: just click on the <em><a href="%s">Install Themes</a></em> tab above.' ), 'theme-install.php' );2956 else2957 printf( __( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ), get_site_option( 'site_name' ) );2958 }2959 2960 function display_table() {2961 ?>2962 <div class="tablenav">2963 <?php $this->pagination( 'top' ); ?>2964 <br class="clear" />2965 </div>2966 2967 <table id="availablethemes" cellspacing="0" cellpadding="0">2968 <tbody id="the-list" class="list:themes">2969 <?php $this->display_rows(); ?>2970 </tbody>2971 </table>2972 2973 <div class="tablenav">2974 <?php $this->pagination( 'bottom' ); ?>2975 <br class="clear" />2976 </div>2977 <?php2978 }2979 2980 function get_columns() {2981 return array();2982 }2983 2984 function display_rows() {2985 $themes = $this->items;2986 $theme_names = array_keys( $themes );2987 natcasesort( $theme_names );2988 2989 $table = array();2990 $rows = ceil( count( $theme_names ) / 3 );2991 for ( $row = 1; $row <= $rows; $row++ )2992 for ( $col = 1; $col <= 3; $col++ )2993 $table[$row][$col] = array_shift( $theme_names );2994 2995 foreach ( $table as $row => $cols ) {2996 ?>2997 <tr>2998 <?php2999 foreach ( $cols as $col => $theme_name ) {3000 $class = array( 'available-theme' );3001 if ( $row == 1 ) $class[] = 'top';3002 if ( $col == 1 ) $class[] = 'left';3003 if ( $row == $rows ) $class[] = 'bottom';3004 if ( $col == 3 ) $class[] = 'right';3005 ?>3006 <td class="<?php echo join( ' ', $class ); ?>">3007 <?php if ( !empty( $theme_name ) ) :3008 $template = $themes[$theme_name]['Template'];3009 $stylesheet = $themes[$theme_name]['Stylesheet'];3010 $title = $themes[$theme_name]['Title'];3011 $version = $themes[$theme_name]['Version'];3012 $description = $themes[$theme_name]['Description'];3013 $author = $themes[$theme_name]['Author'];3014 $screenshot = $themes[$theme_name]['Screenshot'];3015 $stylesheet_dir = $themes[$theme_name]['Stylesheet Dir'];3016 $template_dir = $themes[$theme_name]['Template Dir'];3017 $parent_theme = $themes[$theme_name]['Parent Theme'];3018 $theme_root = $themes[$theme_name]['Theme Root'];3019 $theme_root_uri = $themes[$theme_name]['Theme Root URI'];3020 $preview_link = esc_url( get_option( 'home' ) . '/' );3021 if ( is_ssl() )3022 $preview_link = str_replace( 'http://', 'https://', $preview_link );3023 $preview_link = htmlspecialchars( add_query_arg( array( 'preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'TB_iframe' => 'true' ), $preview_link ) );3024 $preview_text = esc_attr( sprintf( __( 'Preview of “%s”' ), $title ) );3025 $tags = $themes[$theme_name]['Tags'];3026 $thickbox_class = 'thickbox thickbox-preview';3027 $activate_link = wp_nonce_url( "themes.php?action=activate&template=".urlencode( $template )."&stylesheet=".urlencode( $stylesheet ), 'switch-theme_' . $template );3028 $activate_text = esc_attr( sprintf( __( 'Activate “%s”' ), $title ) );3029 $actions = array();3030 $actions[] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __( 'Activate' ) . '</a>';3031 $actions[] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr( sprintf( __( 'Preview “%s”' ), $theme_name ) ) . '">' . __( 'Preview' ) . '</a>';3032 if ( current_user_can( 'delete_themes' ) )3033 $actions[] = '<a class="submitdelete deletion" href="' . wp_nonce_url( "themes.php?action=delete&template=$stylesheet", 'delete-theme_' . $stylesheet ) . '" onclick="' . "return confirm( '" . esc_js( sprintf( __( "You are about to delete this theme '%s'\n 'Cancel' to stop, 'OK' to delete." ), $theme_name ) ) . "' );" . '">' . __( 'Delete' ) . '</a>';3034 $actions = apply_filters( 'theme_action_links', $actions, $themes[$theme_name] );3035 3036 $actions = implode ( ' | ', $actions );3037 ?>3038 <a href="<?php echo $preview_link; ?>" class="<?php echo $thickbox_class; ?> screenshot">3039 <?php if ( $screenshot ) : ?>3040 <img src="<?php echo $theme_root_uri . '/' . $stylesheet . '/' . $screenshot; ?>" alt="" />3041 <?php endif; ?>3042 </a>3043 <h3><?php3044 /* translators: 1: theme title, 2: theme version, 3: theme author */3045 printf( __( '%1$s %2$s by %3$s' ), $title, $version, $author ) ; ?></h3>3046 <p class="description"><?php echo $description; ?></p>3047 <span class='action-links'><?php echo $actions ?></span>3048 <?php if ( current_user_can( 'edit_themes' ) && $parent_theme ) {3049 /* translators: 1: theme title, 2: template dir, 3: stylesheet_dir, 4: theme title, 5: parent_theme */ ?>3050 <p><?php printf( __( 'The template files are located in <code>%2$s</code>. The stylesheet files are located in <code>%3$s</code>. <strong>%4$s</strong> uses templates from <strong>%5$s</strong>. Changes made to the templates will affect both themes.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ), $title, $parent_theme ); ?></p>3051 <?php } else { ?>3052 <p><?php printf( __( 'All of this theme’s files are located in <code>%2$s</code>.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ) ); ?></p>3053 <?php } ?>3054 <?php if ( $tags ) : ?>3055 <p><?php _e( 'Tags:' ); ?> <?php echo join( ', ', $tags ); ?></p>3056 <?php endif; ?>3057 <?php theme_update_available( $themes[$theme_name] ); ?>3058 <?php endif; // end if not empty theme_name ?>3059 </td>3060 <?php } // end foreach $cols ?>3061 </tr>3062 <?php } // end foreach $table3063 }3064 3065 function search_theme( $theme ) {3066 $matched = 0;3067 3068 // Match all phrases3069 if ( count( $this->search ) > 0 ) {3070 foreach ( $this->search as $word ) {3071 $matched = 0;3072 3073 // In a tag?3074 if ( in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) )3075 $matched = 1;3076 3077 // In one of the fields?3078 foreach ( array( 'Name', 'Title', 'Description', 'Author', 'Template', 'Stylesheet' ) AS $field ) {3079 if ( stripos( $theme[$field], $word ) !== false )3080 $matched++;3081 }3082 3083 if ( $matched == 0 )3084 return false;3085 }3086 }3087 3088 // Now search the features3089 if ( count( $this->features ) > 0 ) {3090 foreach ( $this->features as $word ) {3091 // In a tag?3092 if ( !in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) )3093 return false;3094 }3095 }3096 3097 // Only get here if each word exists in the tags or one of the fields3098 return true;3099 }3100 }3101 11 3102 12 class WP_Theme_Install_Table extends WP_List_Table { … … 3278 188 } 3279 189 190 ?> -
trunk/wp-admin/includes/list-table-themes.php
r15954 r15955 9 9 * @subpackage Administration 10 10 */ 11 12 class WP_Media_Table extends WP_List_Table {13 14 function WP_Media_Table() {15 global $detached;16 17 $detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );18 19 parent::WP_List_Table( array(20 'screen' => $detached ? 'upload-detached' : 'upload',21 'plural' => 'media'22 ) );23 }24 25 function check_permissions() {26 if ( !current_user_can('upload_files') )27 wp_die( __( 'You do not have permission to upload files.' ) );28 }29 30 function prepare_items() {31 global $lost, $wpdb, $wp_query, $post_mime_types, $avail_post_mime_types;32 33 $q = $_REQUEST;34 35 if ( !empty( $lost ) )36 $q['post__in'] = implode( ',', $lost );37 38 list( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $q );39 40 $this->is_trash = isset( $_REQUEST['status'] ) && 'trash' == $_REQUEST['status'];41 42 $this->set_pagination_args( array(43 'total_items' => $wp_query->found_posts,44 'total_pages' => $wp_query->max_num_pages,45 'per_page' => $wp_query->query_vars['posts_per_page'],46 ) );47 }48 49 function get_views() {50 global $wpdb, $post_mime_types, $detached, $avail_post_mime_types;51 52 $type_links = array();53 $_num_posts = (array) wp_count_attachments();54 $_total_posts = array_sum($_num_posts) - $_num_posts['trash'];55 if ( !isset( $total_orphans ) )56 $total_orphans = $wpdb->get_var( "SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent < 1" );57 $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));58 foreach ( $matches as $type => $reals )59 foreach ( $reals as $real )60 $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];61 62 $class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : '';63 $type_links['all'] = "<li><a href='upload.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $_total_posts, 'uploaded files' ), number_format_i18n( $_total_posts ) ) . '</a>';64 foreach ( $post_mime_types as $mime_type => $label ) {65 $class = '';66 67 if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )68 continue;69 70 if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )71 $class = ' class="current"';72 if ( !empty( $num_posts[$mime_type] ) )73 $type_links[$mime_type] = "<li><a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( _n( $label[2][0], $label[2][1], $num_posts[$mime_type] ), number_format_i18n( $num_posts[$mime_type] )) . '</a>';74 }75 $type_links['detached'] = '<li><a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( _nx( 'Unattached <span class="count">(%s)</span>', 'Unattached <span class="count">(%s)</span>', $total_orphans, 'detached files' ), number_format_i18n( $total_orphans ) ) . '</a>';76 77 if ( !empty($_num_posts['trash']) )78 $type_links['trash'] = '<li><a href="upload.php?status=trash"' . ( (isset($_GET['status']) && $_GET['status'] == 'trash' ) ? ' class="current"' : '') . '>' . sprintf( _nx( 'Trash <span class="count">(%s)</span>', 'Trash <span class="count">(%s)</span>', $_num_posts['trash'], 'uploaded files' ), number_format_i18n( $_num_posts['trash'] ) ) . '</a>';79 80 return $type_links;81 }82 83 function get_bulk_actions() {84 global $detached;85 86 $actions = array();87 $actions['delete'] = __( 'Delete Permanently' );88 if ( $detached )89 $actions['attach'] = __( 'Attach to a post' );90 91 return $actions;92 }93 94 function extra_tablenav( $which ) {95 global $post_type, $detached;96 ?>97 <div class="alignleft actions">98 <?php99 if ( 'top' == $which && !is_singular() && !$detached && !$this->is_trash ) {100 $this->months_dropdown( $post_type );101 102 do_action( 'restrict_manage_posts' );103 ?>104 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />105 <?php106 }107 108 if ( $detached ) { ?>109 <input type="submit" id="find_detached" name="find_detached" value="<?php esc_attr_e( 'Scan for lost attachments' ); ?>" class="button-secondary" />110 <?php } elseif ( $this->is_trash && current_user_can( 'edit_others_posts' ) ) { ?>111 <input type="submit" id="delete_all" name="delete_all" value="<?php esc_attr_e( 'Empty Trash' ); ?>" class="button-secondary apply" />112 <?php } ?>113 </div>114 <?php115 }116 117 function current_action() {118 if ( isset( $_REQUEST['find_detached'] ) )119 return 'find_detached';120 121 if ( isset( $_REQUEST['found_post_id'] ) && isset( $_REQUEST['media'] ) )122 return 'attach';123 124 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )125 return 'delete_all';126 127 return parent::current_action();128 }129 130 function has_items() {131 return have_posts();132 }133 134 function no_items() {135 _e( 'No media attachments found.' );136 }137 138 function get_columns() {139 $posts_columns = array();140 $posts_columns['cb'] = '<input type="checkbox" />';141 $posts_columns['icon'] = '';142 /* translators: column name */143 $posts_columns['title'] = _x( 'File', 'column name' );144 $posts_columns['author'] = __( 'Author' );145 //$posts_columns['tags'] = _x( 'Tags', 'column name' );146 /* translators: column name */147 if ( 'upload' == $this->_screen->id ) {148 $posts_columns['parent'] = _x( 'Attached to', 'column name' );149 $posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="' . esc_url( admin_url( 'images/comment-grey-bubble.png' ) ) . '" /></div>';150 }151 /* translators: column name */152 $posts_columns['date'] = _x( 'Date', 'column name' );153 $posts_columns = apply_filters( 'manage_media_columns', $posts_columns, 'upload' != $this->_screen->id );154 155 return $posts_columns;156 }157 158 function get_sortable_columns() {159 return array(160 'title' => 'title',161 'author' => 'author',162 'parent' => 'parent',163 'comments' => 'comment_count',164 'date' => 'date',165 );166 }167 168 function display_rows() {169 global $detached, $post, $id;170 171 if ( $detached ) {172 $this->display_orphans();173 return;174 }175 176 add_filter( 'the_title','esc_html' );177 $alt = '';178 179 while ( have_posts() ) : the_post();180 181 if ( $this->is_trash && $post->post_status != 'trash'182 || !$this->is_trash && $post->post_status == 'trash' )183 continue;184 185 $alt = ( 'alternate' == $alt ) ? '' : 'alternate';186 $post_owner = ( get_current_user_id() == $post->post_author ) ? 'self' : 'other';187 $att_title = _draft_or_post_title();188 ?>189 <tr id='post-<?php echo $id; ?>' class='<?php echo trim( $alt . ' author-' . $post_owner . ' status-' . $post->post_status ); ?>' valign="top">190 <?php191 192 list( $columns, $hidden ) = $this->get_column_info();193 foreach ( $columns as $column_name => $column_display_name ) {194 $class = "class='$column_name column-$column_name'";195 196 $style = '';197 if ( in_array( $column_name, $hidden ) )198 $style = ' style="display:none;"';199 200 $attributes = $class . $style;201 202 switch ( $column_name ) {203 204 case 'cb':205 ?>206 <th scope="row" class="check-column"><?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?><input type="checkbox" name="media[]" value="<?php the_ID(); ?>" /><?php } ?></th>207 <?php208 break;209 210 case 'icon':211 $attributes = 'class="column-icon media-icon"' . $style;212 ?>213 <td <?php echo $attributes ?>><?php214 if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {215 if ( $this->is_trash ) {216 echo $thumb;217 } else {218 ?>219 <a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>">220 <?php echo $thumb; ?>221 </a>222 223 <?php }224 }225 ?>226 </td>227 <?php228 break;229 230 case 'title':231 ?>232 <td <?php echo $attributes ?>><strong><?php if ( $this->is_trash ) echo $att_title; else { ?><a href="<?php echo get_edit_post_link( $post->ID, true ); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php echo $att_title; ?></a><?php } ?></strong>233 <p>234 <?php235 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )236 echo esc_html( strtoupper( $matches[1] ) );237 else238 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );239 ?>240 </p>241 <?php242 $actions = array();243 if ( current_user_can( 'edit_post', $post->ID ) && !$this->is_trash )244 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';245 if ( current_user_can( 'delete_post', $post->ID ) ) {246 if ( $this->is_trash )247 $actions['untrash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=untrash&post=$post->ID", 'untrash-attachment_' . $post->ID ) . "'>" . __( 'Restore' ) . "</a>";248 elseif ( EMPTY_TRASH_DAYS && MEDIA_TRASH )249 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";250 if ( $this->is_trash || !EMPTY_TRASH_DAYS || !MEDIA_TRASH ) {251 $delete_ays = ( !$this->is_trash && !MEDIA_TRASH ) ? " onclick='return showNotice.warn();'" : '';252 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";253 }254 }255 if ( !$this->is_trash ) {256 $title =_draft_or_post_title( $post->post_parent );257 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';258 }259 $actions = apply_filters( 'media_row_actions', $actions, $post );260 echo $this->row_actions( $actions );261 ?>262 </td>263 <?php264 break;265 266 case 'author':267 ?>268 <td <?php echo $attributes ?>><?php the_author() ?></td>269 <?php270 break;271 272 case 'tags':273 ?>274 <td <?php echo $attributes ?>><?php275 $tags = get_the_tags();276 if ( !empty( $tags ) ) {277 $out = array();278 foreach ( $tags as $c )279 $out[] = "<a href='edit.php?tag=$c->slug'> " . esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'post_tag', 'display' ) ) . "</a>";280 echo join( ', ', $out );281 } else {282 _e( 'No Tags' );283 }284 ?>285 </td>286 <?php287 break;288 289 case 'desc':290 ?>291 <td <?php echo $attributes ?>><?php echo has_excerpt() ? $post->post_excerpt : ''; ?></td>292 <?php293 break;294 295 case 'date':296 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {297 $t_time = $h_time = __( 'Unpublished' );298 } else {299 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );300 $m_time = $post->post_date;301 $time = get_post_time( 'G', true, $post, false );302 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {303 if ( $t_diff < 0 )304 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );305 else306 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );307 } else {308 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );309 }310 }311 ?>312 <td <?php echo $attributes ?>><?php echo $h_time ?></td>313 <?php314 break;315 316 case 'parent':317 if ( $post->post_parent > 0 ) {318 if ( get_post( $post->post_parent ) ) {319 $title =_draft_or_post_title( $post->post_parent );320 }321 ?>322 <td <?php echo $attributes ?>>323 <strong><a href="<?php echo get_edit_post_link( $post->post_parent ); ?>"><?php echo $title ?></a></strong>,324 <?php echo get_the_time( __( 'Y/m/d' ) ); ?>325 </td>326 <?php327 } else {328 ?>329 <td <?php echo $attributes ?>><?php _e( '(Unattached)' ); ?><br />330 <a class="hide-if-no-js" onclick="findPosts.open( 'media[]','<?php echo $post->ID ?>' );return false;" href="#the-list"><?php _e( 'Attach' ); ?></a></td>331 <?php332 }333 break;334 335 case 'comments':336 $attributes = 'class="comments column-comments num"' . $style;337 ?>338 <td <?php echo $attributes ?>>339 <div class="post-com-count-wrapper">340 <?php341 $pending_comments = get_pending_comments_num( $post->ID );342 343 $this->comments_bubble( $post->ID, $pending_comments );344 ?>345 </div>346 </td>347 <?php348 break;349 350 case 'actions':351 ?>352 <td <?php echo $attributes ?>>353 <a href="media.php?action=edit&attachment_id=<?php the_ID(); ?>" title="<?php echo esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ); ?>"><?php _e( 'Edit' ); ?></a> |354 <a href="<?php the_permalink(); ?>"><?php _e( 'Get permalink' ); ?></a>355 </td>356 <?php357 break;358 359 default:360 ?>361 <td <?php echo $attributes ?>>362 <?php do_action( 'manage_media_custom_column', $column_name, $id ); ?>363 </td>364 <?php365 break;366 }367 }368 ?>369 </tr>370 <?php endwhile;371 }372 373 function display_orphans() {374 global $post;375 376 $class = '';377 378 while ( have_posts() ) : the_post();379 380 $class = ( 'alternate' == $class ) ? '' : 'alternate';381 $att_title = esc_html( _draft_or_post_title( $post->ID ) );382 383 $edit_link = '<a href="' . get_edit_post_link( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ) . '">%s</a>';384 ?>385 <tr id='post-<?php echo $post->ID; ?>' class='<?php echo $class; ?>' valign="top">386 <th scope="row" class="check-column">387 <?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?>388 <input type="checkbox" name="media[]" value="<?php echo esc_attr( $post->ID ); ?>" />389 <?php } ?>390 </th>391 392 <td class="media-icon">393 <?php if ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) {394 printf( $edit_link, $thumb );395 } ?>396 </td>397 398 <td class="media column-media">399 <strong><?php printf( $edit_link, $att_title ); ?></strong><br />400 <?php401 if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) )402 echo esc_html( strtoupper( $matches[1] ) );403 else404 echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );405 ?>406 <?php407 $actions = array();408 if ( current_user_can( 'edit_post', $post->ID ) )409 $actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '">' . __( 'Edit' ) . '</a>';410 if ( current_user_can( 'delete_post', $post->ID ) )411 if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) {412 $actions['trash'] = "<a class='submitdelete' href='" . wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-attachment_' . $post->ID ) . "'>" . __( 'Trash' ) . "</a>";413 } else {414 $delete_ays = !MEDIA_TRASH ? " onclick='return showNotice.warn();'" : '';415 $actions['delete'] = "<a class='submitdelete'$delete_ays href='" . wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-attachment_' . $post->ID ) . "'>" . __( 'Delete Permanently' ) . "</a>";416 }417 $actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View “%s”' ), $att_title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';418 if ( current_user_can( 'edit_post', $post->ID ) )419 $actions['attach'] = '<a href="#the-list" onclick="findPosts.open( \'media[]\',\''.$post->ID.'\' );return false;" class="hide-if-no-js">'.__( 'Attach' ).'</a>';420 $actions = apply_filters( 'media_row_actions', $actions, $post );421 422 echo $this->row_actions( $actions );423 ?>424 </td>425 <td class="author column-author">426 <?php $author = get_userdata( $post->post_author ); echo $author->display_name; ?>427 </td>428 <?php429 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {430 $t_time = $h_time = __( 'Unpublished' );431 } else {432 $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );433 $m_time = $post->post_date;434 $time = get_post_time( 'G', true );435 if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {436 if ( $t_diff < 0 )437 $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );438 else439 $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );440 } else {441 $h_time = mysql2date( __( 'Y/m/d' ), $m_time );442 }443 }444 ?>445 <td class="date column-date"><?php echo $h_time ?></td>446 </tr>447 <?php448 endwhile;449 }450 }451 452 class WP_Terms_Table extends WP_List_Table {453 454 var $callback_args;455 456 function WP_Terms_Table() {457 global $post_type, $taxonomy, $tax, $current_screen;458 459 wp_reset_vars( array( 'action', 'taxonomy', 'post_type' ) );460 461 if ( empty( $taxonomy ) )462 $taxonomy = 'post_tag';463 464 if ( !taxonomy_exists( $taxonomy ) )465 wp_die( __( 'Invalid taxonomy' ) );466 467 $tax = get_taxonomy( $taxonomy );468 469 if ( empty( $post_type ) || !in_array( $post_type, get_post_types( array( 'public' => true ) ) ) )470 $post_type = 'post';471 472 if ( !isset( $current_screen ) )473 set_current_screen( 'edit-' . $taxonomy );474 475 parent::WP_List_Table( array(476 'screen' => $current_screen,477 'plural' => 'tags',478 'singular' => 'tag',479 ) );480 }481 482 function check_permissions( $type = 'manage' ) {483 global $tax;484 485 $cap = 'manage' == $type ? $tax->cap->manage_terms : $tax->cap->edit_terms;486 487 if ( !current_user_can( $tax->cap->manage_terms ) )488 wp_die( __( 'Cheatin’ uh?' ) );489 }490 491 function prepare_items() {492 global $taxonomy;493 494 $tags_per_page = $this->get_items_per_page( 'edit_' . $taxonomy . '_per_page' );495 496 if ( 'post_tag' == $taxonomy ) {497 $tags_per_page = apply_filters( 'edit_tags_per_page', $tags_per_page );498 $tags_per_page = apply_filters( 'tagsperpage', $tags_per_page ); // Old filter499 } elseif ( 'category' == $taxonomy ) {500 $tags_per_page = apply_filters( 'edit_categories_per_page', $tags_per_page ); // Old filter501 }502 503 $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';504 505 $args = array(506 'search' => $search,507 'page' => $this->get_pagenum(),508 'number' => $tags_per_page,509 );510 511 if ( !empty( $_REQUEST['orderby'] ) )512 $args['orderby'] = trim( stripslashes( $_REQUEST['orderby'] ) );513 514 if ( !empty( $_REQUEST['order'] ) )515 $args['order'] = trim( stripslashes( $_REQUEST['order'] ) );516 517 $this->callback_args = $args;518 519 $this->set_pagination_args( array(520 'total_items' => wp_count_terms( $taxonomy, compact( 'search' ) ),521 'per_page' => $tags_per_page,522 ) );523 }524 525 function get_bulk_actions() {526 $actions = array();527 $actions['delete'] = __( 'Delete' );528 529 return $actions;530 }531 532 function current_action() {533 if ( isset( $_REQUEST['action'] ) && isset( $_REQUEST['delete_tags'] ) && ( 'delete' == $_REQUEST['action'] || 'delete' == $_REQUEST['action2'] ) )534 return 'bulk-delete';535 536 return parent::current_action();537 }538 539 function get_columns() {540 global $taxonomy;541 542 $columns = array(543 'cb' => '<input type="checkbox" />',544 'name' => __( 'Name' ),545 'description' => __( 'Description' ),546 'slug' => __( 'Slug' ),547 );548 549 if ( 'link_category' == $taxonomy )550 $columns['links'] = __( 'Links' );551 else552 $columns['posts'] = __( 'Posts' );553 554 return $columns;555 }556 557 function get_sortable_columns() {558 return array(559 'name' => 'name',560 'description' => 'description',561 'slug' => 'slug',562 'posts' => 'count',563 'links' => 'count'564 );565 }566 567 function display_rows() {568 global $taxonomy;569 570 $args = wp_parse_args( $this->callback_args, array(571 'page' => 1,572 'number' => 20,573 'search' => '',574 'hide_empty' => 0575 ) );576 577 extract( $args, EXTR_SKIP );578 579 $args['offset'] = $offset = ( $page - 1 ) * $number;580 581 // convert it to table rows582 $out = '';583 $count = 0;584 if ( is_taxonomy_hierarchical( $taxonomy ) && !isset( $orderby ) ) {585 // We'll need the full set of terms then.586 $args['number'] = $args['offset'] = 0;587 588 $terms = get_terms( $taxonomy, $args );589 if ( !empty( $search ) ) // Ignore children on searches.590 $children = array();591 else592 $children = _get_term_hierarchy( $taxonomy );593 594 // Some funky recursion to get the job done( Paging & parents mainly ) is contained within, Skip it for non-hierarchical taxonomies for performance sake595 $out .= $this->_rows( $taxonomy, $terms, $children, $offset, $number, $count );596 } else {597 $terms = get_terms( $taxonomy, $args );598 foreach ( $terms as $term )599 $out .= $this->single_row( $term, 0, $taxonomy );600 $count = $number; // Only displaying a single page.601 }602 603 echo $out;604 }605 606 function _rows( $taxonomy, $terms, &$children, $start = 0, $per_page = 20, &$count, $parent = 0, $level = 0 ) {607 608 $end = $start + $per_page;609 610 $output = '';611 foreach ( $terms as $key => $term ) {612 613 if ( $count >= $end )614 break;615 616 if ( $term->parent != $parent && empty( $_REQUEST['s'] ) )617 continue;618 619 // If the page starts in a subtree, print the parents.620 if ( $count == $start && $term->parent > 0 && empty( $_REQUEST['s'] ) ) {621 $my_parents = $parent_ids = array();622 $p = $term->parent;623 while ( $p ) {624 $my_parent = get_term( $p, $taxonomy );625 $my_parents[] = $my_parent;626 $p = $my_parent->parent;627 if ( in_array( $p, $parent_ids ) ) // Prevent parent loops.628 break;629 $parent_ids[] = $p;630 }631 unset( $parent_ids );632 633 $num_parents = count( $my_parents );634 while ( $my_parent = array_pop( $my_parents ) ) {635 $output .= "\t" . $this->single_row( $my_parent, $level - $num_parents, $taxonomy );636 $num_parents--;637 }638 }639 640 if ( $count >= $start )641 $output .= "\t" . $this->single_row( $term, $level, $taxonomy );642 643 ++$count;644 645 unset( $terms[$key] );646 647 if ( isset( $children[$term->term_id] ) && empty( $_REQUEST['s'] ) )648 $output .= $this->_rows( $taxonomy, $terms, $children, $start, $per_page, $count, $term->term_id, $level + 1 );649 }650 651 return $output;652 }653 654 function single_row( $tag, $level = 0 ) {655 static $row_class = '';656 $row_class = ( $row_class == '' ? ' class="alternate"' : '' );657 658 $this->level = $level;659 660 echo '<tr id="tag-' . $tag->term_id . '"' . $row_class . '>';661 echo $this->single_row_columns( $tag );662 echo '</tr>';663 }664 665 function column_cb( $tag ) {666 global $taxonomy, $tax;667 668 $default_term = get_option( 'default_' . $taxonomy );669 670 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )671 return '<input type="checkbox" name="delete_tags[]" value="' . $tag->term_id . '" />';672 else673 return ' ';674 }675 676 function column_name( $tag ) {677 global $taxonomy, $tax, $post_type;678 679 $default_term = get_option( 'default_' . $taxonomy );680 681 $pad = str_repeat( '— ', max( 0, $this->level ) );682 $name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag );683 $qe_data = get_term( $tag->term_id, $taxonomy, OBJECT, 'edit' );684 $edit_link = get_edit_term_link( $tag->term_id, $taxonomy, $post_type );685 686 $out = '<strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $name ) ) . '">' . $name . '</a></strong><br />';687 688 $actions = array();689 if ( current_user_can( $tax->cap->edit_terms ) ) {690 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';691 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __( 'Quick Edit' ) . '</a>';692 }693 if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )694 $actions['delete'] = "<a class='delete-tag' href='" . wp_nonce_url( "edit-tags.php?action=delete&taxonomy=$taxonomy&tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id ) . "'>" . __( 'Delete' ) . "</a>";695 696 $actions = apply_filters( 'tag_row_actions', $actions, $tag );697 $actions = apply_filters( "${taxonomy}_row_actions", $actions, $tag );698 699 $out .= $this->row_actions( $actions );700 $out .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';701 $out .= '<div class="name">' . $qe_data->name . '</div>';702 $out .= '<div class="slug">' . apply_filters( 'editable_slug', $qe_data->slug ) . '</div>';703 $out .= '<div class="parent">' . $qe_data->parent . '</div></div></td>';704 705 return $out;706 }707 708 function column_description( $tag ) {709 return $tag->description;710 }711 712 function column_slug( $tag ) {713 return apply_filters( 'editable_slug', $tag->slug );714 }715 716 function column_posts( $tag ) {717 global $taxonomy, $post_type;718 719 $count = number_format_i18n( $tag->count );720 721 if ( 'post_tag' == $taxonomy ) {722 $tagsel = 'tag';723 } elseif ( 'category' == $taxonomy ) {724 $tagsel = 'category_name';725 } elseif ( ! empty( $tax->query_var ) ) {726 $tagsel = $tax->query_var;727 } else {728 $tagsel = $taxonomy;729 }730 731 return "<a href='edit.php?$tagsel=$tag->slug&post_type=$post_type'>$count</a>";732 }733 734 function column_links( $tag ) {735 $count = number_format_i18n( $tag->count );736 return $count;737 }738 739 function column_default( $tag, $column_name ) {740 global $taxonomy;741 742 return apply_filters( "manage_${taxonomy}_custom_column", '', $column_name, $tag->term_id );743 $out .= "</td>";744 }745 746 /**747 * Outputs the hidden row displayed when inline editing748 *749 * @since 3.1.0750 */751 function inline_edit() {752 global $tax;753 754 if ( ! current_user_can( $tax->cap->edit_terms ) )755 return;756 757 list( $columns, $hidden ) = $this->get_column_info();758 759 $col_count = count( $columns ) - count( $hidden );760 ?>761 762 <form method="get" action=""><table style="display: none"><tbody id="inlineedit">763 <tr id="inline-edit" class="inline-edit-row" style="display: none"><td colspan="<?php echo $col_count; ?>">764 765 <fieldset><div class="inline-edit-col">766 <h4><?php _e( 'Quick Edit' ); ?></h4>767 768 <label>769 <span class="title"><?php _e( 'Name' ); ?></span>770 <span class="input-text-wrap"><input type="text" name="name" class="ptitle" value="" /></span>771 </label>772 <?php if ( !global_terms_enabled() ) { ?>773 <label>774 <span class="title"><?php _e( 'Slug' ); ?></span>775 <span class="input-text-wrap"><input type="text" name="slug" class="ptitle" value="" /></span>776 </label>777 <?php } ?>778 779 </div></fieldset>780 <?php781 782 $core_columns = array( 'cb' => true, 'description' => true, 'name' => true, 'slug' => true, 'posts' => true );783 784 foreach ( $columns as $column_name => $column_display_name ) {785 if ( isset( $core_columns[$column_name] ) )786 continue;787 do_action( 'quick_edit_custom_box', $column_name, $type, $tax->taxonomy );788 }789 790 ?>791 792 <p class="inline-edit-save submit">793 <a accesskey="c" href="#inline-edit" title="<?php _e( 'Cancel' ); ?>" class="cancel button-secondary alignleft"><?php _e( 'Cancel' ); ?></a>794 <?php $update_text = $tax->labels->update_item; ?>795 <a accesskey="s" href="#inline-edit" title="<?php echo esc_attr( $update_text ); ?>" class="save button-primary alignright"><?php echo $update_text; ?></a>796 <img class="waiting" style="display:none;" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" />797 <span class="error" style="display:none;"></span>798 <?php wp_nonce_field( 'taxinlineeditnonce', '_inline_edit', false ); ?>799 <input type="hidden" name="taxonomy" value="<?php echo esc_attr( $tax->name ); ?>" />800 <br class="clear" />801 </p>802 </td></tr>803 </tbody></table></form>804 <?php805 }806 }807 808 class WP_Users_Table extends WP_List_Table {809 810 function WP_Users_Table() {811 parent::WP_List_Table( array(812 'screen' => 'users',813 'plural' => 'users'814 ) );815 }816 817 function check_permissions() {818 if ( !current_user_can('list_users') )819 wp_die(__('Cheatin’ uh?'));820 }821 822 function prepare_items() {823 global $role, $usersearch;824 825 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';826 827 $role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : '';828 829 $users_per_page = $this->get_items_per_page( 'users_per_page' );830 831 $paged = $this->get_pagenum();832 833 $args = array(834 'number' => $users_per_page,835 'offset' => ( $paged-1 ) * $users_per_page,836 'role' => $role,837 'search' => $usersearch838 );839 840 if ( isset( $_REQUEST['orderby'] ) )841 $args['orderby'] = $_REQUEST['orderby'];842 843 if ( isset( $_REQUEST['order'] ) )844 $args['order'] = $_REQUEST['order'];845 846 // Query the user IDs for this page847 $wp_user_search = new WP_User_Query( $args );848 849 $this->items = $wp_user_search->get_results();850 851 $this->set_pagination_args( array(852 'total_items' => $wp_user_search->get_total(),853 'per_page' => $users_per_page,854 ) );855 }856 857 function no_items() {858 _e( 'No matching users were found.' );859 }860 861 function get_views() {862 global $wp_roles, $role;863 864 $users_of_blog = count_users();865 $total_users = $users_of_blog['total_users'];866 $avail_roles =& $users_of_blog['avail_roles'];867 unset($users_of_blog);868 869 $current_role = false;870 $class = empty($role) ? ' class="current"' : '';871 $role_links = array();872 $role_links['all'] = "<li><a href='users.php'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>';873 foreach ( $wp_roles->get_names() as $this_role => $name ) {874 if ( !isset($avail_roles[$this_role]) )875 continue;876 877 $class = '';878 879 if ( $this_role == $role ) {880 $current_role = $role;881 $class = ' class="current"';882 }883 884 $name = translate_user_role( $name );885 /* translators: User role name with count */886 $name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, $avail_roles[$this_role] );887 $role_links[$this_role] = "<li><a href='users.php?role=$this_role'$class>$name</a>";888 }889 890 return $role_links;891 }892 893 function get_bulk_actions() {894 $actions = array();895 896 if ( !is_multisite() && current_user_can( 'delete_users' ) )897 $actions['delete'] = __( 'Delete' );898 else899 $actions['remove'] = __( 'Remove' );900 901 return $actions;902 }903 904 function extra_tablenav( $which ) {905 if ( 'top' != $which )906 return;907 ?>908 <div class="alignleft actions">909 <label class="screen-reader-text" for="new_role"><?php _e( 'Change role to…' ) ?></label>910 <select name="new_role" id="new_role">911 <option value=''><?php _e( 'Change role to…' ) ?></option>912 <?php wp_dropdown_roles(); ?>913 </select>914 <input type="submit" value="<?php esc_attr_e( 'Change' ); ?>" name="changeit" class="button-secondary" />915 </div>916 <?php917 }918 919 function current_action() {920 if ( isset($_REQUEST['changeit']) && !empty($_REQUEST['new_role']) )921 return 'promote';922 923 return parent::current_action();924 }925 926 function get_columns() {927 return array(928 'cb' => '<input type="checkbox" />',929 'username' => __( 'Login' ),930 'name' => __( 'Name' ),931 'email' => __( 'E-mail' ),932 'role' => __( 'Role' ),933 'posts' => __( 'Posts' )934 );935 }936 937 function get_sortable_columns() {938 return array(939 'username' => 'login',940 'name' => 'name',941 'email' => 'email',942 'posts' => 'post_count',943 );944 }945 946 function display_rows() {947 // Query the post counts for this page948 $post_counts = count_many_users_posts( array_keys( $this->items ) );949 950 $style = '';951 foreach ( $this->items as $userid => $user_object ) {952 $role = reset( $user_object->roles );953 954 if ( is_multisite() && empty( $role ) )955 continue;956 957 $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"';958 echo "\n\t", $this->single_row( $user_object, $style, $role, $post_counts[ $userid ] );959 }960 }961 962 /**963 * Generate HTML for a single row on the users.php admin panel.964 *965 * @since 2.1.0966 *967 * @param object $user_object968 * @param string $style Optional. Attributes added to the TR element. Must be sanitized.969 * @param string $role Key for the $wp_roles array.970 * @param int $numposts Optional. Post count to display for this user. Defaults to zero, as in, a new user has made zero posts.971 * @return string972 */973 function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) {974 global $wp_roles;975 976 if ( !( is_object( $user_object ) && is_a( $user_object, 'WP_User' ) ) )977 $user_object = new WP_User( (int) $user_object );978 $user_object = sanitize_user_object( $user_object, 'display' );979 $email = $user_object->user_email;980 $url = $user_object->user_url;981 $short_url = str_replace( 'http://', '', $url );982 $short_url = str_replace( 'www.', '', $short_url );983 if ( '/' == substr( $short_url, -1 ) )984 $short_url = substr( $short_url, 0, -1 );985 if ( strlen( $short_url ) > 35 )986 $short_url = substr( $short_url, 0, 32 ).'...';987 $checkbox = '';988 // Check if the user for this row is editable989 if ( current_user_can( 'list_users' ) ) {990 // Set up the user editing link991 // TODO: make profile/user-edit determination a separate function992 if ( get_current_user_id() == $user_object->ID ) {993 $edit_link = 'profile.php';994 } else {995 $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( esc_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" ) );996 }997 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";998 999 // Set up the hover actions for this user1000 $actions = array();1001 1002 if ( current_user_can( 'edit_user', $user_object->ID ) ) {1003 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";1004 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';1005 } else {1006 $edit = "<strong>$user_object->user_login</strong><br />";1007 }1008 1009 if ( !is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) )1010 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=delete&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Delete' ) . "</a>";1011 if ( is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'remove_user', $user_object->ID ) )1012 $actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=remove&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . "</a>";1013 $actions = apply_filters( 'user_row_actions', $actions, $user_object );1014 $edit .= $this->row_actions( $actions );1015 1016 // Set up the checkbox ( because the user is editable, otherwise its empty )1017 $checkbox = "<input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='$role' value='{$user_object->ID}' />";1018 1019 } else {1020 $edit = '<strong>' . $user_object->user_login . '</strong>';1021 }1022 $role_name = isset( $wp_roles->role_names[$role] ) ? translate_user_role( $wp_roles->role_names[$role] ) : __( 'None' );1023 $r = "<tr id='user-$user_object->ID'$style>";1024 $avatar = get_avatar( $user_object->ID, 32 );1025 1026 list( $columns, $hidden ) = $this->get_column_info();1027 1028 foreach ( $columns as $column_name => $column_display_name ) {1029 $class = "class=\"$column_name column-$column_name\"";1030 1031 $style = '';1032 if ( in_array( $column_name, $hidden ) )1033 $style = ' style="display:none;"';1034 1035 $attributes = "$class$style";1036 1037 switch ( $column_name ) {1038 case 'cb':1039 $r .= "<th scope='row' class='check-column'>$checkbox</th>";1040 break;1041 case 'username':1042 $r .= "<td $attributes>$avatar $edit</td>";1043 break;1044 case 'name':1045 $r .= "<td $attributes>$user_object->first_name $user_object->last_name</td>";1046 break;1047 case 'email':1048 $r .= "<td $attributes><a href='mailto:$email' title='" . sprintf( __( 'E-mail: %s' ), $email ) . "'>$email</a></td>";1049 break;1050 case 'role':1051 $r .= "<td $attributes>$role_name</td>";1052 break;1053 case 'posts':1054 $attributes = 'class="posts column-posts num"' . $style;1055 $r .= "<td $attributes>";1056 if ( $numposts > 0 ) {1057 $r .= "<a href='edit.php?author=$user_object->ID' title='" . __( 'View posts by this author' ) . "' class='edit'>";1058 $r .= $numposts;1059 $r .= '</a>';1060 } else {1061 $r .= 0;1062 }1063 $r .= "</td>";1064 break;1065 default:1066 $r .= "<td $attributes>";1067 $r .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID );1068 $r .= "</td>";1069 }1070 }1071 $r .= '</tr>';1072 1073 return $r;1074 }1075 }1076 1077 class WP_Comments_Table extends WP_List_Table {1078 1079 var $checkbox = true;1080 var $from_ajax = false;1081 1082 var $pending_count = array();1083 1084 function WP_Comments_Table() {1085 global $mode;1086 1087 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'detail' : $_REQUEST['mode'];1088 1089 if ( get_option('show_avatars') && 'single' != $mode )1090 add_filter( 'comment_author', 'floated_admin_avatar' );1091 1092 parent::WP_List_Table( array(1093 'screen' => 'edit-comments',1094 'plural' => 'comments'1095 ) );1096 }1097 1098 function check_permissions() {1099 if ( !current_user_can('edit_posts') )1100 wp_die(__('Cheatin’ uh?'));1101 }1102 1103 function prepare_items() {1104 global $post_id, $comment_status, $search;1105 1106 if ( isset( $_REQUEST['p'] ) )1107 $post_id = absint( $_REQUEST['p'] );1108 elseif ( isset( $_REQUEST['post'] ) )1109 $post_id = absint( $_REQUEST['post'] );1110 elseif ( isset( $_REQUEST['post_ID'] ) )1111 $post_id = absint( $_REQUEST['post_ID'] );1112 else1113 $post_id = 0;1114 1115 $comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all';1116 if ( !in_array( $comment_status, array( 'all', 'moderated', 'approved', 'spam', 'trash' ) ) )1117 $comment_status = 'all';1118 1119 $comment_type = !empty( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : '';1120 1121 $search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : '';1122 1123 $user_id = ( isset( $_REQUEST['user_id'] ) ) ? $_REQUEST['user_id'] : '';1124 1125 $comments_per_page = $this->get_items_per_page( 'edit_comments_per_page' );1126 $comments_per_page = apply_filters( 'comments_per_page', $comments_per_page, $comment_status );1127 1128 if ( isset( $_POST['number'] ) )1129 $number = (int) $_POST['number'];1130 else1131 $number = $comments_per_page + min( 8, $comments_per_page ); // Grab a few extra1132 1133 $page = $this->get_pagenum();1134 1135 $start = $offset = ( $page - 1 ) * $comments_per_page;1136 1137 $status_map = array(1138 'moderated' => 'hold',1139 'approved' => 'approve'1140 );1141 1142 $args = array(1143 'status' => isset( $status_map[$comment_status] ) ? $status_map[$comment_status] : $comment_status,1144 'search' => $search,1145 'user_id' => $user_id,1146 'offset' => $start,1147 'number' => $number,1148 'post_id' => $post_id,1149 'type' => $comment_type,1150 'orderby' => @$_REQUEST['orderby'],1151 'order' => @$_REQUEST['order'],1152 );1153 1154 $_comments = get_comments( $args );1155 1156 update_comment_cache( $_comments );1157 1158 $this->items = array_slice( $_comments, 0, $comments_per_page );1159 $this->extra_items = array_slice( $_comments, $comments_per_page );1160 1161 $total_comments = get_comments( array_merge( $args, array('count' => true, 'offset' => 0, 'number' => 0) ) );1162 1163 $_comment_post_ids = array();1164 foreach ( $_comments as $_c ) {1165 $_comment_post_ids[] = $_c->comment_post_ID;1166 }1167 1168 $this->pending_count = get_pending_comments_num( $_comment_post_ids );1169 1170 $this->set_pagination_args( array(1171 'total_items' => $total_comments,1172 'per_page' => $comments_per_page,1173 ) );1174 }1175 1176 function get_views() {1177 global $post_id, $comment_status;1178 1179 $status_links = array();1180 $num_comments = ( $post_id ) ? wp_count_comments( $post_id ) : wp_count_comments();1181 //, number_format_i18n($num_comments->moderated) ), "<span class='comment-count'>" . number_format_i18n($num_comments->moderated) . "</span>"),1182 //, number_format_i18n($num_comments->spam) ), "<span class='spam-comment-count'>" . number_format_i18n($num_comments->spam) . "</span>")1183 $stati = array(1184 'all' => _nx_noop('All', 'All', 'comments'), // singular not used1185 'moderated' => _n_noop('Pending <span class="count">(<span class="pending-count">%s</span>)</span>', 'Pending <span class="count">(<span class="pending-count">%s</span>)</span>'),1186 'approved' => _n_noop('Approved', 'Approved'), // singular not used1187 'spam' => _n_noop('Spam <span class="count">(<span class="spam-count">%s</span>)</span>', 'Spam <span class="count">(<span class="spam-count">%s</span>)</span>'),1188 'trash' => _n_noop('Trash <span class="count">(<span class="trash-count">%s</span>)</span>', 'Trash <span class="count">(<span class="trash-count">%s</span>)</span>')1189 );1190 1191 if ( !EMPTY_TRASH_DAYS )1192 unset($stati['trash']);1193 1194 $link = 'edit-comments.php';1195 if ( !empty($comment_type) && 'all' != $comment_type )1196 $link = add_query_arg( 'comment_type', $comment_type, $link );1197 1198 foreach ( $stati as $status => $label ) {1199 $class = ( $status == $comment_status ) ? ' class="current"' : '';1200 1201 if ( !isset( $num_comments->$status ) )1202 $num_comments->$status = 10;1203 $link = add_query_arg( 'comment_status', $status, $link );1204 if ( $post_id )1205 $link = add_query_arg( 'p', absint( $post_id ), $link );1206 /*1207 // I toyed with this, but decided against it. Leaving it in here in case anyone thinks it is a good idea. ~ Mark1208 if ( !empty( $_REQUEST['s'] ) )1209 $link = add_query_arg( 's', esc_attr( stripslashes( $_REQUEST['s'] ) ), $link );1210 */1211 $status_links[$status] = "<li class='$status'><a href='$link'$class>" . sprintf(1212 _n( $label[0], $label[1], $num_comments->$status ),1213 number_format_i18n( $num_comments->$status )1214 ) . '</a>';1215 }1216 1217 $status_links = apply_filters( 'comment_status_links', $status_links );1218 return $status_links;1219 }1220 1221 function get_bulk_actions() {1222 global $comment_status;1223 1224 $actions = array();1225 if ( in_array( $comment_status, array( 'all', 'approved' ) ) )1226 $actions['unapprove'] = __( 'Unapprove' );1227 if ( in_array( $comment_status, array( 'all', 'moderated', 'spam' ) ) )1228 $actions['approve'] = __( 'Approve' );1229 if ( in_array( $comment_status, array( 'all', 'moderated', 'approved' ) ) )1230 $actions['spam'] = _x( 'Mark as Spam', 'comment' );1231 1232 if ( 'trash' == $comment_status )1233 $actions['untrash'] = __( 'Restore' );1234 elseif ( 'spam' == $comment_status )1235 $actions['unspam'] = _x( 'Not Spam', 'comment' );1236 1237 if ( in_array( $comment_status, array( 'trash', 'spam' ) ) || !EMPTY_TRASH_DAYS )1238 $actions['delete'] = __( 'Delete Permanently' );1239 else1240 $actions['trash'] = __( 'Move to Trash' );1241 1242 return $actions;1243 }1244 1245 function extra_tablenav( $which ) {1246 global $comment_status, $comment_type;1247 ?>1248 <div class="alignleft actions">1249 <?php1250 if ( 'top' == $which ) {1251 ?>1252 <select name="comment_type">1253 <option value=""><?php _e( 'Show all comment types' ); ?></option>1254 <?php1255 $comment_types = apply_filters( 'admin_comment_types_dropdown', array(1256 'comment' => __( 'Comments' ),1257 'pings' => __( 'Pings' ),1258 ) );1259 1260 foreach ( $comment_types as $type => $label )1261 echo "\t<option value='" . esc_attr( $type ) . "'" . selected( $comment_type, $type, false ) . ">$label</option>\n";1262 ?>1263 </select>1264 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />1265 <?php1266 }1267 1268 if ( ( 'spam' == $comment_status || 'trash' == $comment_status ) && current_user_can( 'moderate_comments' ) ) {1269 wp_nonce_field( 'bulk-destroy', '_destroy_nonce' );1270 $title = ( 'spam' == $comment_status ) ? esc_attr__( 'Empty Spam' ) : esc_attr__( 'Empty Trash' );1271 ?>1272 <input type="submit" name="delete_all" id="delete_all" value="<?php echo $title ?>" class="button-secondary apply" />1273 <?php1274 }1275 ?>1276 <?php1277 do_action( 'manage_comments_nav', $comment_status );1278 echo '</div>';1279 }1280 1281 function current_action() {1282 if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )1283 return 'delete_all';1284 1285 return parent::current_action();1286 }1287 1288 function get_columns() {1289 global $mode;1290 1291 $columns = array();1292 1293 if ( $this->checkbox )1294 $columns['cb'] = '<input type="checkbox" />';1295 1296 $columns['author'] = __( 'Author' );1297 $columns['comment'] = _x( 'Comment', 'column name' );1298 1299 if ( 'single' !== $mode )1300 $columns['response'] = _x( 'Comment', 'column name' );1301 1302 return $columns;1303 }1304 1305 function get_sortable_columns() {1306 return array(1307 'author' => 'comment_author',1308 'comment' => 'comment_content',1309 'response' => 'comment_post_ID'1310 );1311 }1312 1313 function display_table() {1314 extract( $this->_args );1315 1316 $this->display_tablenav( 'top' );1317 1318 ?>1319 <table class="<?php echo implode( ' ', $this->get_table_classes() ); ?>" cellspacing="0">1320 <thead>1321 <tr>1322 <?php $this->print_column_headers(); ?>1323 </tr>1324 </thead>1325 1326 <tfoot>1327 <tr>1328 <?php $this->print_column_headers( false ); ?>1329 </tr>1330 </tfoot>1331 1332 <tbody id="the-comment-list" class="list:comment">1333 <?php $this->display_rows(); ?>1334 </tbody>1335 1336 <tbody id="the-extra-comment-list" class="list:comment" style="display: none;">1337 <?php $this->items = $this->extra_items; $this->display_rows(); ?>1338 </tbody>1339 </table>1340 <?php1341 1342 $this->display_tablenav( 'bottom' );1343 }1344 1345 function single_row( $a_comment ) {1346 global $post, $comment, $the_comment_status;1347 1348 $comment = $a_comment;1349 $the_comment_status = wp_get_comment_status( $comment->comment_ID );1350 1351 $post = get_post( $comment->comment_post_ID );1352 1353 $this->user_can = current_user_can( 'edit_comment', $comment->comment_ID );1354 1355 echo "<tr id='comment-$comment->comment_ID' class='$the_comment_status'>";1356 echo $this->single_row_columns( $comment );1357 echo "</tr>\n";1358 }1359 1360 function column_cb( $comment ) {1361 if ( $this->user_can )1362 echo "<input type='checkbox' name='delete_comments[]' value='$comment->comment_ID' />";1363 }1364 1365 function column_comment( $comment ) {1366 global $post, $comment_status, $the_comment_status;1367 1368 $user_can = $this->user_can;1369 1370 $comment_url = esc_url( get_comment_link( $comment->comment_ID ) );1371 1372 $ptime = date( 'G', strtotime( $comment->comment_date ) );1373 if ( ( abs( time() - $ptime ) ) < 86400 )1374 $ptime = sprintf( __( '%s ago' ), human_time_diff( $ptime ) );1375 else1376 $ptime = mysql2date( __( 'Y/m/d \a\t g:i A' ), $comment->comment_date );1377 1378 if ( $user_can ) {1379 $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) );1380 $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) );1381 1382 $url = "comment.php?c=$comment->comment_ID";1383 1384 $approve_url = esc_url( $url . "&action=approvecomment&$approve_nonce" );1385 $unapprove_url = esc_url( $url . "&action=unapprovecomment&$approve_nonce" );1386 $spam_url = esc_url( $url . "&action=spamcomment&$del_nonce" );1387 $unspam_url = esc_url( $url . "&action=unspamcomment&$del_nonce" );1388 $trash_url = esc_url( $url . "&action=trashcomment&$del_nonce" );1389 $untrash_url = esc_url( $url . "&action=untrashcomment&$del_nonce" );1390 $delete_url = esc_url( $url . "&action=deletecomment&$del_nonce" );1391 }1392 1393 echo '<div id="submitted-on">';1394 /* translators: 2: comment date, 3: comment time */1395 printf( __( '<a href="%1$s">%2$s at %3$s</a>' ), $comment_url,1396 /* translators: comment date format. See http://php.net/date */ get_comment_date( __( 'Y/m/d' ) ),1397 /* translators: comment time format. See http://php.net/date */ get_comment_date( get_option( 'time_format' ) ) );1398 1399 if ( $comment->comment_parent ) {1400 $parent = get_comment( $comment->comment_parent );1401 $parent_link = esc_url( get_comment_link( $comment->comment_parent ) );1402 $name = get_comment_author( $parent->comment_ID );1403 printf( ' | '.__( 'In reply to <a href="%1$s">%2$s</a>.' ), $parent_link, $name );1404 }1405 1406 echo '</div>';1407 comment_text();1408 if ( $user_can ) { ?>1409 <div id="inline-<?php echo $comment->comment_ID; ?>" class="hidden">1410 <textarea class="comment" rows="1" cols="1"><?php echo esc_html( apply_filters( 'comment_edit_pre', $comment->comment_content ) ); ?></textarea>1411 <div class="author-email"><?php echo esc_attr( $comment->comment_author_email ); ?></div>1412 <div class="author"><?php echo esc_attr( $comment->comment_author ); ?></div>1413 <div class="author-url"><?php echo esc_attr( $comment->comment_author_url ); ?></div>1414 <div class="comment_status"><?php echo $comment->comment_approved; ?></div>1415 </div>1416 <?php1417 }1418 1419 if ( $user_can ) {1420 // preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash1421 $actions = array(1422 'approve' => '', 'unapprove' => '',1423 'reply' => '',1424 'quickedit' => '',1425 'edit' => '',1426 'spam' => '', 'unspam' => '',1427 'trash' => '', 'untrash' => '', 'delete' => ''1428 );1429 1430 if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments1431 if ( 'approved' == $the_comment_status )1432 $actions['unapprove'] = "<a href='$unapprove_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=unapproved vim-u vim-destructive' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';1433 else if ( 'unapproved' == $the_comment_status )1434 $actions['approve'] = "<a href='$approve_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&new=approved vim-a vim-destructive' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';1435 } else {1436 $actions['approve'] = "<a href='$approve_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved vim-a' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';1437 $actions['unapprove'] = "<a href='$unapprove_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved vim-u' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';1438 }1439 1440 if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) {1441 $actions['spam'] = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1 vim-s vim-destructive' title='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>';1442 } elseif ( 'spam' == $the_comment_status ) {1443 $actions['unspam'] = "<a href='$unspam_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:unspam=1 vim-z vim-destructive'>" . _x( 'Not Spam', 'comment' ) . '</a>';1444 } elseif ( 'trash' == $the_comment_status ) {1445 $actions['untrash'] = "<a href='$untrash_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:untrash=1 vim-z vim-destructive'>" . __( 'Restore' ) . '</a>';1446 }1447 1448 if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) {1449 $actions['delete'] = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID::delete=1 delete vim-d vim-destructive'>" . __( 'Delete Permanently' ) . '</a>';1450 } else {1451 $actions['trash'] = "<a href='$trash_url' class='delete:the-comment-list:comment-$comment->comment_ID::trash=1 delete vim-d vim-destructive' title='" . esc_attr__( 'Move this comment to the trash' ) . "'>" . _x( 'Trash', 'verb' ) . '</a>';1452 }1453 1454 if ( 'trash' != $the_comment_status ) {1455 $actions['edit'] = "<a href='comment.php?action=editcomment&c={$comment->comment_ID}' title='" . esc_attr__( 'Edit comment' ) . "'>". __( 'Edit' ) . '</a>';1456 $actions['quickedit'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\',\'edit\' );return false;" class="vim-q" title="'.esc_attr__( 'Quick Edit' ).'" href="#">' . __( 'Quick Edit' ) . '</a>';1457 if ( 'spam' != $the_comment_status )1458 $actions['reply'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\' );return false;" class="vim-r" title="'.esc_attr__( 'Reply to this comment' ).'" href="#">' . __( 'Reply' ) . '</a>';1459 }1460 1461 $actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment );1462 1463 $i = 0;1464 echo '<div class="row-actions">';1465 foreach ( $actions as $action => $link ) {1466 ++$i;1467 ( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';1468 1469 // Reply and quickedit need a hide-if-no-js span when not added with ajax1470 if ( ( 'reply' == $action || 'quickedit' == $action ) && ! $this->from_ajax )1471 $action .= ' hide-if-no-js';1472 elseif ( ( $action == 'untrash' && $the_comment_status == 'trash' ) || ( $action == 'unspam' && $the_comment_status == 'spam' ) ) {1473 if ( '1' == get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) )1474 $action .= ' approve';1475 else1476 $action .= ' unapprove';1477 }1478 1479 echo "<span class='$action'>$sep$link</span>";1480 }1481 echo '</div>';1482 }1483 }1484 1485 function column_author( $comment ) {1486 global $comment_status;1487 1488 $author_url = get_comment_author_url();1489 if ( 'http://' == $author_url )1490 $author_url = '';1491 $author_url_display = preg_replace( '|http://(www\.)?|i', '', $author_url );1492 if ( strlen( $author_url_display ) > 50 )1493 $author_url_display = substr( $author_url_display, 0, 49 ) . '...';1494 1495 echo "<strong>"; comment_author(); echo '</strong><br />';1496 if ( !empty( $author_url ) )1497 echo "<a title='$author_url' href='$author_url'>$author_url_display</a><br />";1498 1499 if ( $this->user_can ) {1500 if ( !empty( $comment->comment_author_email ) ) {1501 comment_author_email_link();1502 echo '<br />';1503 }1504 echo '<a href="edit-comments.php?s=';1505 comment_author_IP();1506 echo '&mode=detail';1507 if ( 'spam' == $comment_status )1508 echo '&comment_status=spam';1509 echo '">';1510 comment_author_IP();1511 echo '</a>';1512 }1513 }1514 1515 function column_date( $comment ) {1516 return get_comment_date( __( 'Y/m/d \a\t g:ia' ) );1517 }1518 1519 function column_response( $comment ) {1520 global $post;1521 1522 if ( isset( $this->pending_count[$post->ID] ) ) {1523 $pending_comments = $this->pending_count[$post->ID];1524 } else {1525 $_pending_count_temp = get_pending_comments_num( array( $post->ID ) );1526 $pending_comments = $this->pending_count[$post->ID] = $_pending_count_temp[$post->ID];1527 }1528 1529 if ( current_user_can( 'edit_post', $post->ID ) ) {1530 $post_link = "<a href='" . get_edit_post_link( $post->ID ) . "'>";1531 $post_link .= get_the_title( $post->ID ) . '</a>';1532 } else {1533 $post_link = get_the_title( $post->ID );1534 }1535 1536 echo '<div class="response-links"><span class="post-com-count-wrapper">';1537 echo $post_link . '<br />';1538 $this->comments_bubble( $post->ID, $pending_comments );1539 echo '</span> ';1540 echo "<a href='" . get_permalink( $post->ID ) . "'>#</a>";1541 echo '</div>';1542 if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) )1543 echo $thumb;1544 }1545 1546 function column_default( $comment, $column_name ) {1547 do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID );1548 }1549 }1550 1551 class WP_Post_Comments_Table extends WP_Comments_Table {1552 1553 function get_columns() {1554 return array(1555 'author' => __( 'Author' ),1556 'comment' => _x( 'Comment', 'column name' ),1557 );1558 }1559 1560 function get_sortable_columns() {1561 return array();1562 }1563 }1564 1565 class WP_Links_Table extends WP_List_Table {1566 1567 function WP_Links_Table() {1568 parent::WP_List_Table( array(1569 'screen' => 'link-manager',1570 'plural' => 'bookmarks',1571 ) );1572 }1573 1574 function check_permissions() {1575 if ( ! current_user_can( 'manage_links' ) )1576 wp_die( __( 'You do not have sufficient permissions to edit the links for this site.' ) );1577 }1578 1579 function prepare_items() {1580 global $cat_id, $s, $orderby, $order;1581 1582 wp_reset_vars( array( 'action', 'cat_id', 'linkurl', 'name', 'image', 'description', 'visible', 'target', 'category', 'link_id', 'submit', 'orderby', 'order', 'links_show_cat_id', 'rating', 'rel', 'notes', 'linkcheck[]', 's' ) );1583 1584 $args = array( 'hide_invisible' => 0, 'hide_empty' => 0 );1585 1586 if ( 'all' != $cat_id )1587 $args['category'] = $cat_id;1588 if ( !empty( $s ) )1589 $args['search'] = $s;1590 if ( !empty( $orderby ) )1591 $args['orderby'] = $orderby;1592 if ( !empty( $order ) )1593 $args['order'] = $order;1594 1595 $this->items = get_bookmarks( $args );1596 }1597 1598 function no_items() {1599 _e( 'No links found.' );1600 }1601 1602 function get_bulk_actions() {1603 $actions = array();1604 $actions['delete'] = __( 'Delete' );1605 1606 return $actions;1607 }1608 1609 function extra_tablenav( $which ) {1610 global $cat_id;1611 1612 if ( 'top' != $which )1613 return;1614 ?>1615 <div class="alignleft actions">1616 <?php1617 $dropdown_options = array(1618 'selected' => $cat_id,1619 'name' => 'cat_id',1620 'taxonomy' => 'link_category',1621 'show_option_all' => __( 'View all categories' ),1622 'hide_empty' => true,1623 'hierarchical' => 1,1624 'show_count' => 0,1625 'orderby' => 'name',1626 );1627 wp_dropdown_categories( $dropdown_options );1628 ?>1629 <input type="submit" id="post-query-submit" value="<?php esc_attr_e( 'Filter' ); ?>" class="button-secondary" />1630 </div>1631 <?php1632 }1633 1634 function get_columns() {1635 return array(1636 'cb' => '<input type="checkbox" />',1637 'name' => __( 'Name' ),1638 'url' => __( 'URL' ),1639 'categories' => __( 'Categories' ),1640 'rel' => __( 'Relationship' ),1641 'visible' => __( 'Visible' ),1642 'rating' => __( 'Rating' )1643 );1644 }1645 1646 function get_sortable_columns() {1647 return array(1648 'name' => 'name',1649 'url' => 'url',1650 'visible' => 'visible',1651 'rating' => 'rating'1652 );1653 }1654 1655 function display_rows() {1656 global $cat_id;1657 1658 $alt = 0;1659 1660 foreach ( $this->items as $link ) {1661 $link = sanitize_bookmark( $link );1662 $link->link_name = esc_attr( $link->link_name );1663 $link->link_category = wp_get_link_cats( $link->link_id );1664 1665 $short_url = str_replace( 'http://', '', $link->link_url );1666 $short_url = preg_replace( '/^www\./i', '', $short_url );1667 if ( '/' == substr( $short_url, -1 ) )1668 $short_url = substr( $short_url, 0, -1 );1669 if ( strlen( $short_url ) > 35 )1670 $short_url = substr( $short_url, 0, 32 ).'...';1671 1672 $visible = ( $link->link_visible == 'Y' ) ? __( 'Yes' ) : __( 'No' );1673 $rating = $link->link_rating;1674 $style = ( $alt++ % 2 ) ? '' : ' class="alternate"';1675 1676 $edit_link = get_edit_bookmark_link( $link );1677 ?>1678 <tr id="link-<?php echo $link->link_id; ?>" valign="middle" <?php echo $style; ?>>1679 <?php1680 1681 list( $columns, $hidden ) = $this->get_column_info();1682 1683 foreach ( $columns as $column_name => $column_display_name ) {1684 $class = "class='column-$column_name'";1685 1686 $style = '';1687 if ( in_array( $column_name, $hidden ) )1688 $style = ' style="display:none;"';1689 1690 $attributes = $class . $style;1691 1692 switch ( $column_name ) {1693 case 'cb':1694 echo '<th scope="row" class="check-column"><input type="checkbox" name="linkcheck[]" value="'. esc_attr( $link->link_id ) .'" /></th>';1695 break;1696 1697 case 'name':1698 echo "<td $attributes><strong><a class='row-title' href='$edit_link' title='" . esc_attr( sprintf( __( 'Edit “%s”' ), $link->link_name ) ) . "'>$link->link_name</a></strong><br />";1699 1700 $actions = array();1701 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';1702 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "link.php?action=delete&link_id=$link->link_id", 'delete-bookmark_' . $link->link_id ) . "' onclick=\"if ( confirm( '" . esc_js( sprintf( __( "You are about to delete this link '%s'\n 'Cancel' to stop, 'OK' to delete." ), $link->link_name ) ) . "' ) ) { return true;}return false;\">" . __( 'Delete' ) . "</a>";1703 echo $this->row_actions( $actions );1704 1705 echo '</td>';1706 break;1707 case 'url':1708 echo "<td $attributes><a href='$link->link_url' title='".sprintf( __( 'Visit %s' ), $link->link_name )."'>$short_url</a></td>";1709 break;1710 case 'categories':1711 ?><td <?php echo $attributes ?>><?php1712 $cat_names = array();1713 foreach ( $link->link_category as $category ) {1714 $cat = get_term( $category, 'link_category', OBJECT, 'display' );1715 if ( is_wp_error( $cat ) )1716 echo $cat->get_error_message();1717 $cat_name = $cat->name;1718 if ( $cat_id != $category )1719 $cat_name = "<a href='link-manager.php?cat_id=$category'>$cat_name</a>";1720 $cat_names[] = $cat_name;1721 }1722 echo implode( ', ', $cat_names );1723 ?></td><?php1724 break;1725 case 'rel':1726 ?><td <?php echo $attributes ?>><?php echo empty( $link->link_rel ) ? '<br />' : $link->link_rel; ?></td><?php1727 break;1728 case 'visible':1729 ?><td <?php echo $attributes ?>><?php echo $visible; ?></td><?php1730 break;1731 case 'rating':1732 ?><td <?php echo $attributes ?>><?php echo $rating; ?></td><?php1733 break;1734 default:1735 ?>1736 <td <?php echo $attributes ?>><?php do_action( 'manage_link_custom_column', $column_name, $link->link_id ); ?></td>1737 <?php1738 break;1739 }1740 }1741 ?>1742 </tr>1743 <?php1744 }1745 }1746 }1747 1748 class WP_Sites_Table extends WP_List_Table {1749 1750 function WP_Sites_Table() {1751 parent::WP_List_Table( array(1752 'screen' => 'sites-network',1753 'plural' => 'sites',1754 ) );1755 }1756 1757 function check_permissions() {1758 if ( ! current_user_can( 'manage_sites' ) )1759 wp_die( __( 'You do not have permission to access this page.' ) );1760 }1761 1762 function prepare_items() {1763 global $s, $mode, $wpdb;1764 1765 $mode = ( empty( $_REQUEST['mode'] ) ) ? 'list' : $_REQUEST['mode'];1766 1767 $per_page = $this->get_items_per_page( 'sites_network_per_page' );1768 1769 $pagenum = $this->get_pagenum();1770 1771 $s = isset( $_REQUEST['s'] ) ? stripslashes( trim( $_REQUEST[ 's' ] ) ) : '';1772 $like_s = esc_sql( like_escape( $s ) );1773 1774 $query = "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' ";1775 1776 if ( isset( $_REQUEST['searchaction'] ) ) {1777 if ( 'name' == $_REQUEST['searchaction'] ) {1778 $query .= " AND ( {$wpdb->blogs}.domain LIKE '%{$like_s}%' OR {$wpdb->blogs}.path LIKE '%{$like_s}%' ) ";1779 } elseif ( 'id' == $_REQUEST['searchaction'] ) {1780 $query .= " AND {$wpdb->blogs}.blog_id = '{$like_s}' ";1781 } elseif ( 'ip' == $_REQUEST['searchaction'] ) {1782 $query = "SELECT *1783 FROM {$wpdb->blogs}, {$wpdb->registration_log}1784 WHERE site_id = '{$wpdb->siteid}'1785 AND {$wpdb->blogs}.blog_id = {$wpdb->registration_log}.blog_id1786 AND {$wpdb->registration_log}.IP LIKE ( '%{$like_s}%' )";1787 }1788 }1789 1790 $order_by = isset( $_REQUEST['orderby'] ) ? $_REQUEST['orderby'] : 'id';1791 if ( $order_by == 'registered' ) {1792 $query .= ' ORDER BY registered ';1793 } elseif ( $order_by == 'lastupdated' ) {1794 $query .= ' ORDER BY last_updated ';1795 } elseif ( $order_by == 'blogname' ) {1796 $query .= ' ORDER BY domain ';1797 } else {1798 $order_by = 'id';1799 $query .= " ORDER BY {$wpdb->blogs}.blog_id ";1800 }1801 1802 $order = ( isset( $_REQUEST['order'] ) && 'DESC' == strtoupper( $_REQUEST['order'] ) ) ? "DESC" : "ASC";1803 $query .= $order;1804 1805 $total = $wpdb->get_var( str_replace( 'SELECT *', 'SELECT COUNT( blog_id )', $query ) );1806 1807 $query .= " LIMIT " . intval( ( $pagenum - 1 ) * $per_page ) . ", " . intval( $per_page );1808 $this->items = $wpdb->get_results( $query, ARRAY_A );1809 1810 $this->set_pagination_args( array(1811 'total_items' => $total,1812 'per_page' => $per_page,1813 ) );1814 }1815 1816 function no_items() {1817 _e( 'No sites found.' );1818 }1819 1820 function get_bulk_actions() {1821 $actions = array();1822 $actions['delete'] = __( 'Delete' );1823 $actions['spam'] = _x( 'Mark as Spam', 'site' );1824 $actions['notspam'] = _x( 'Not Spam', 'site' );1825 1826 return $actions;1827 }1828 1829 function pagination( $which ) {1830 global $mode;1831 1832 parent::pagination( $which );1833 1834 if ( 'top' == $which )1835 $this->view_switcher( $mode );1836 }1837 1838 function get_columns() {1839 $blogname_columns = ( is_subdomain_install() ) ? __( 'Domain' ) : __( 'Path' );1840 $sites_columns = array(1841 'cb' => '<input type="checkbox" />',1842 'blogname' => $blogname_columns,1843 'lastupdated' => __( 'Last Updated' ),1844 'registered' => _x( 'Registered', 'site' ),1845 'users' => __( 'Users' )1846 );1847 1848 if ( has_filter( 'wpmublogsaction' ) )1849 $sites_columns['plugins'] = __( 'Actions' );1850 1851 $sites_columns = apply_filters( 'wpmu_blogs_columns', $sites_columns );1852 1853 return $sites_columns;1854 }1855 1856 function get_sortable_columns() {1857 return array(1858 'id' => 'id',1859 'blogname' => 'blogname',1860 'lastupdated' => 'lastupdated',1861 'registered' => 'registered',1862 );1863 }1864 1865 function display_rows() {1866 global $current_site, $mode;1867 1868 $status_list = array(1869 'archived' => array( 'site-archived', __( 'Archived' ) ),1870 'spam' => array( 'site-spammed', _x( 'Spam', 'site' ) ),1871 'deleted' => array( 'site-deleted', __( 'Deleted' ) ),1872 'mature' => array( 'site-mature', __( 'Mature' ) )1873 );1874 1875 $class = '';1876 foreach ( $this->items as $blog ) {1877 $class = ( 'alternate' == $class ) ? '' : 'alternate';1878 reset( $status_list );1879 1880 $blog_states = array();1881 foreach ( $status_list as $status => $col ) {1882 if ( get_blog_status( $blog['blog_id'], $status ) == 1 ) {1883 $class = $col[0];1884 $blog_states[] = $col[1];1885 }1886 }1887 $blog_state = '';1888 if ( ! empty( $blog_states ) ) {1889 $state_count = count( $blog_states );1890 $i = 0;1891 $blog_state .= ' - ';1892 foreach ( $blog_states as $state ) {1893 ++$i;1894 ( $i == $state_count ) ? $sep = '' : $sep = ', ';1895 $blog_state .= "<span class='post-state'>$state$sep</span>";1896 }1897 }1898 echo "<tr class='$class'>";1899 1900 $blogname = ( is_subdomain_install() ) ? str_replace( '.'.$current_site->domain, '', $blog['domain'] ) : $blog['path'];1901 1902 list( $columns, $hidden ) = $this->get_column_info();1903 1904 foreach ( $columns as $column_name => $column_display_name ) {1905 switch ( $column_name ) {1906 case 'cb': ?>1907 <th scope="row" class="check-column">1908 <input type="checkbox" id="blog_<?php echo $blog['blog_id'] ?>" name="allblogs[]" value="<?php echo esc_attr( $blog['blog_id'] ) ?>" />1909 </th>1910 <?php1911 break;1912 1913 case 'id': ?>1914 <th valign="top" scope="row">1915 <?php echo $blog['blog_id'] ?>1916 </th>1917 <?php1918 break;1919 1920 case 'blogname': ?>1921 <td class="column-title">1922 <a href="<?php echo esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ); ?>" class="edit"><?php echo $blogname . $blog_state; ?></a>1923 <?php1924 if ( 'list' != $mode )1925 echo '<p>' . sprintf( _x( '%1$s – <em>%2$s</em>', '%1$s: site name. %2$s: site tagline.' ), get_blog_option( $blog['blog_id'], 'blogname' ), get_blog_option( $blog['blog_id'], 'blogdescription ' ) ) . '</p>';1926 1927 // Preordered.1928 $actions = array(1929 'edit' => '', 'backend' => '',1930 'activate' => '', 'deactivate' => '',1931 'archive' => '', 'unarchive' => '',1932 'spam' => '', 'unspam' => '',1933 'delete' => '',1934 'visit' => '',1935 );1936 1937 $actions['edit'] = '<span class="edit"><a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ) . '">' . __( 'Edit' ) . '</a></span>';1938 $actions['backend'] = "<span class='backend'><a href='" . esc_url( get_admin_url( $blog['blog_id'] ) ) . "' class='edit'>" . __( 'Dashboard' ) . '</a></span>';1939 if ( $current_site->blog_id != $blog['blog_id'] ) {1940 if ( get_blog_status( $blog['blog_id'], 'deleted' ) == '1' )1941 $actions['activate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=activateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to activate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Activate' ) . '</a></span>';1942 else1943 $actions['deactivate'] = '<span class="activate"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deactivateblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to deactivate the site %s' ), $blogname ) ) ) ) . '">' . __( 'Deactivate' ) . '</a></span>';1944 1945 if ( get_blog_status( $blog['blog_id'], 'archived' ) == '1' )1946 $actions['unarchive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unarchiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unarchive the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Unarchive' ) . '</a></span>';1947 else1948 $actions['archive'] = '<span class="archive"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=archiveblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to archive the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Archive', 'verb; site' ) . '</a></span>';1949 1950 if ( get_blog_status( $blog['blog_id'], 'spam' ) == '1' )1951 $actions['unspam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=unspamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to unspam the site %s.' ), $blogname ) ) ) ) . '">' . _x( 'Not Spam', 'site' ) . '</a></span>';1952 else1953 $actions['spam'] = '<span class="spam"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=spamblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to mark the site %s as spam.' ), $blogname ) ) ) ) . '">' . _x( 'Spam', 'site' ) . '</a></span>';1954 1955 $actions['delete'] = '<span class="delete"><a href="' . esc_url( network_admin_url( 'edit.php?action=confirm&action2=deleteblog&id=' . $blog['blog_id'] . '&msg=' . urlencode( sprintf( __( 'You are about to delete the site %s.' ), $blogname ) ) ) ) . '">' . __( 'Delete' ) . '</a></span>';1956 }1957 1958 $actions['visit'] = "<span class='view'><a href='" . esc_url( get_home_url( $blog['blog_id'] ) ) . "' rel='permalink'>" . __( 'Visit' ) . '</a></span>';1959 $actions = array_filter( $actions );1960 echo $this->row_actions( $actions );1961 ?>1962 </td>1963 <?php1964 break;1965 1966 case 'lastupdated': ?>1967 <td valign="top">1968 <?php1969 if ( 'list' == $mode )1970 $date = 'Y/m/d';1971 else1972 $date = 'Y/m/d \<\b\r \/\> g:i:s a';1973 echo ( $blog['last_updated'] == '0000-00-00 00:00:00' ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] ); ?>1974 </td>1975 <?php1976 break;1977 case 'registered': ?>1978 <td valign="top">1979 <?php1980 if ( $blog['registered'] == '0000-00-00 00:00:00' )1981 echo '—';1982 else1983 echo mysql2date( $date, $blog['registered'] );1984 ?>1985 </td>1986 <?php1987 break;1988 case 'users': ?>1989 <td valign="top">1990 <?php1991 $blogusers = get_users( array( 'blog_id' => $blog['blog_id'], 'number' => 6) );1992 if ( is_array( $blogusers ) ) {1993 $blogusers_warning = '';1994 if ( count( $blogusers ) > 5 ) {1995 $blogusers = array_slice( $blogusers, 0, 5 );1996 $blogusers_warning = __( 'Only showing first 5 users.' ) . ' <a href="' . esc_url( get_admin_url( $blog['blog_id'], 'users.php' ) ) . '">' . __( 'More' ) . '</a>';1997 }1998 foreach ( $blogusers as $user_object ) {1999 echo '<a href="' . esc_url( admin_url( 'user-edit.php?user_id=' . $user_object->ID ) ) . '">' . esc_html( $user_object->user_login ) . '</a> ';2000 if ( 'list' != $mode )2001 echo '( ' . $user_object->user_email . ' )';2002 echo '<br />';2003 }2004 if ( $blogusers_warning != '' )2005 echo '<strong>' . $blogusers_warning . '</strong><br />';2006 }2007 ?>2008 </td>2009 <?php2010 break;2011 2012 case 'plugins': ?>2013 <?php if ( has_filter( 'wpmublogsaction' ) ) { ?>2014 <td valign="top">2015 <?php do_action( 'wpmublogsaction', $blog['blog_id'] ); ?>2016 </td>2017 <?php } ?>2018 <?php break;2019 2020 default: ?>2021 <?php if ( has_filter( 'manage_blogs_custom_column' ) ) { ?>2022 <td valign="top">2023 <?php do_action( 'manage_blogs_custom_column', $column_name, $blog['blog_id'] ); ?>2024 </td>2025 <?php } ?>2026 <?php break;2027 }2028 }2029 ?>2030 </tr>2031 <?php2032 }2033 }2034 }2035 2036 class WP_MS_Users_Table extends WP_List_Table {2037 2038 function WP_MS_Users_Table() {2039 parent::WP_List_Table( array(2040 'screen' => 'users-network',2041 ) );2042 }2043 2044 function check_permissions() {2045 if ( !is_multisite() )2046 wp_die( __( 'Multisite support is not enabled.' ) );2047 2048 if ( ! current_user_can( 'manage_network_users' ) )2049 wp_die( __( 'You do not have permission to access this page.' ) );2050 }2051 2052 function prepare_items() {2053 global $usersearch;2054 2055 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';2056 2057 $users_per_page = $this->get_items_per_page( 'users_network_per_page' );2058 2059 $paged = $this->get_pagenum();2060 2061 $args = array(2062 'number' => $users_per_page,2063 'offset' => ( $paged-1 ) * $users_per_page,2064 'search' => $usersearch,2065 'blog_id' => 02066 );2067 2068 if ( isset( $_REQUEST['orderby'] ) )2069 $args['orderby'] = $_REQUEST['orderby'];2070 2071 if ( isset( $_REQUEST['order'] ) )2072 $args['order'] = $_REQUEST['order'];2073 2074 // Query the user IDs for this page2075 $wp_user_search = new WP_User_Query( $args );2076 2077 $this->items = $wp_user_search->get_results();2078 2079 $this->set_pagination_args( array(2080 'total_items' => $wp_user_search->get_total(),2081 'per_page' => $users_per_page,2082 ) );2083 }2084 2085 function get_bulk_actions() {2086 $actions = array();2087 $actions['delete'] = __( 'Delete' );2088 $actions['spam'] = _x( 'Mark as Spam', 'user' );2089 $actions['notspam'] = _x( 'Not Spam', 'user' );2090 2091 return $actions;2092 }2093 2094 function no_items() {2095 _e( 'No users found.' );2096 }2097 2098 function pagination( $which ) {2099 global $mode;2100 2101 parent::pagination ( $which );2102 2103 if ( 'top' == $which )2104 $this->view_switcher( $mode );2105 }2106 2107 function get_columns() {2108 $users_columns = array(2109 'cb' => '<input type="checkbox" />',2110 'login' => __( 'Login' ),2111 'name' => __( 'Name' ),2112 'email' => __( 'E-mail' ),2113 'registered' => _x( 'Registered', 'user' ),2114 'blogs' => __( 'Sites' )2115 );2116 $users_columns = apply_filters( 'wpmu_users_columns', $users_columns );2117 2118 return $users_columns;2119 }2120 2121 function get_sortable_columns() {2122 return array(2123 'id' => 'id',2124 'login' => 'login',2125 'name' => 'name',2126 'email' => 'email',2127 'registered' => 'registered',2128 );2129 }2130 2131 function display_rows() {2132 global $current_site, $mode;2133 2134 $class = '';2135 $super_admins = get_super_admins();2136 foreach ( $this->items as $user ) {2137 $class = ( 'alternate' == $class ) ? '' : 'alternate';2138 2139 $status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' );2140 2141 foreach ( $status_list as $status => $col ) {2142 if ( $user->$status )2143 $class = $col;2144 }2145 2146 ?>2147 <tr class="<?php echo $class; ?>">2148 <?php2149 2150 list( $columns, $hidden ) = $this->get_column_info();2151 2152 foreach ( $columns as $column_name => $column_display_name ) :2153 switch ( $column_name ) {2154 case 'cb': ?>2155 <th scope="row" class="check-column">2156 <input type="checkbox" id="blog_<?php echo $user->ID ?>" name="allusers[]" value="<?php echo esc_attr( $user->ID ) ?>" />2157 </th>2158 <?php2159 break;2160 2161 case 'id': ?>2162 <th valign="top" scope="row">2163 <?php echo $user->ID ?>2164 </th>2165 <?php2166 break;2167 2168 case 'login':2169 $avatar = get_avatar( $user->user_email, 32 );2170 $edit_link = ( get_current_user_id() == $user->ID ) ? 'profile.php' : 'user-edit.php?user_id=' . $user->ID;2171 ?>2172 <td class="username column-username">2173 <?php echo $avatar; ?><strong><a href="<?php echo esc_url( self_admin_url( $edit_link ) ); ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a><?php2174 if ( in_array( $user->user_login, $super_admins ) )2175 echo ' - ' . __( 'Super admin' );2176 ?></strong>2177 <br/>2178 <?php2179 $actions = array();2180 $actions['edit'] = '<a href="' . esc_url( self_admin_url( $edit_link ) ) . '">' . __( 'Edit' ) . '</a>';2181 2182 if ( ! in_array( $user->user_login, $super_admins ) ) {2183 $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deleteuser' ) . '&action=deleteuser&id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';2184 }2185 2186 echo $this->row_actions( $actions );2187 ?>2188 </div>2189 </td>2190 <?php2191 break;2192 2193 case 'name': ?>2194 <td class="name column-name"><?php echo $user->display_name ?></td>2195 <?php2196 break;2197 2198 case 'email': ?>2199 <td class="email column-email"><a href="mailto:<?php echo $user->user_email ?>"><?php echo $user->user_email ?></a></td>2200 <?php2201 break;2202 2203 case 'registered':2204 if ( 'list' == $mode )2205 $date = 'Y/m/d';2206 else2207 $date = 'Y/m/d \<\b\r \/\> g:i:s a';2208 ?>2209 <td><?php echo mysql2date( $date, $user->user_registered ); ?></td>2210 <?php2211 break;2212 2213 case 'blogs':2214 $blogs = get_blogs_of_user( $user->ID, true );2215 ?>2216 <td>2217 <?php2218 if ( is_array( $blogs ) ) {2219 foreach ( (array) $blogs as $key => $val ) {2220 $path = ( $val->path == '/' ) ? '' : $val->path;2221 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . str_replace( '.' . $current_site->domain, '', $val->domain . $path ) . '</a>';2222 echo ' <small class="row-actions">';2223 2224 // Edit2225 echo '<a href="'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'">' . __( 'Edit' ) . '</a> | ';2226 2227 // View2228 echo '<a ';2229 if ( get_blog_status( $val->userblog_id, 'spam' ) == 1 )2230 echo 'style="background-color: #faa" ';2231 echo 'href="' . esc_url( get_home_url( $val->userblog_id ) ) . '">' . __( 'View' ) . '</a>';2232 2233 echo '</small><br />';2234 }2235 }2236 ?>2237 </td>