__( 'Comments' ),
'pings' => __( 'Pings' ),
) );
foreach ( $comment_types as $type => $label )
echo "\t$label \n";
?>
';
}
function current_action() {
if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )
return 'delete_all';
return parent::current_action();
}
function get_columns() {
global $mode;
$columns = array();
if ( $this->checkbox )
$columns['cb'] = '
';
$columns['author'] = __( 'Author' );
$columns['comment'] = _x( 'Comment', 'column name' );
if ( 'single' !== $mode )
$columns['response'] = _x( 'Comment', 'column name' );
return $columns;
}
function get_sortable_columns() {
return array(
'author' => 'comment_author',
'comment' => 'comment_content',
'response' => 'comment_post_ID'
);
}
function display_table() {
extract( $this->_args );
$this->display_tablenav( 'top' );
?>
print_column_headers(); ?>
print_column_headers( false ); ?>
display_tablenav( 'bottom' );
}
function single_row( $a_comment ) {
global $post, $comment, $the_comment_status;
$comment = $a_comment;
$the_comment_status = wp_get_comment_status( $comment->comment_ID );
$post = get_post( $comment->comment_post_ID );
$this->user_can = current_user_can( 'edit_comment', $comment->comment_ID );
echo "\n";
}
function column_cb( $comment ) {
if ( $this->user_can )
echo "
";
}
function column_comment( $comment ) {
global $post, $comment_status, $the_comment_status;
$user_can = $this->user_can;
$comment_url = esc_url( get_comment_link( $comment->comment_ID ) );
$ptime = date( 'G', strtotime( $comment->comment_date ) );
if ( ( abs( time() - $ptime ) ) < 86400 )
$ptime = sprintf( __( '%s ago' ), human_time_diff( $ptime ) );
else
$ptime = mysql2date( __( 'Y/m/d \a\t g:i A' ), $comment->comment_date );
if ( $user_can ) {
$del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) );
$approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) );
$url = "comment.php?c=$comment->comment_ID";
$approve_url = esc_url( $url . "&action=approvecomment&$approve_nonce" );
$unapprove_url = esc_url( $url . "&action=unapprovecomment&$approve_nonce" );
$spam_url = esc_url( $url . "&action=spamcomment&$del_nonce" );
$unspam_url = esc_url( $url . "&action=unspamcomment&$del_nonce" );
$trash_url = esc_url( $url . "&action=trashcomment&$del_nonce" );
$untrash_url = esc_url( $url . "&action=untrashcomment&$del_nonce" );
$delete_url = esc_url( $url . "&action=deletecomment&$del_nonce" );
}
echo '
';
/* translators: 2: comment date, 3: comment time */
printf( __( '
%2$s at %3$s ' ), $comment_url,
/* translators: comment date format. See http://php.net/date */ get_comment_date( __( 'Y/m/d' ) ),
/* translators: comment time format. See http://php.net/date */ get_comment_date( get_option( 'time_format' ) ) );
if ( $comment->comment_parent ) {
$parent = get_comment( $comment->comment_parent );
$parent_link = esc_url( get_comment_link( $comment->comment_parent ) );
$name = get_comment_author( $parent->comment_ID );
printf( ' | '.__( 'In reply to
%2$s .' ), $parent_link, $name );
}
echo '
';
comment_text();
if ( $user_can ) { ?>
'', 'unapprove' => '',
'reply' => '',
'quickedit' => '',
'edit' => '',
'spam' => '', 'unspam' => '',
'trash' => '', 'untrash' => '', 'delete' => ''
);
if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments
if ( 'approved' == $the_comment_status )
$actions['unapprove'] = "';
else if ( 'unapproved' == $the_comment_status )
$actions['approve'] = "';
} else {
$actions['approve'] = "';
$actions['unapprove'] = "';
}
if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) {
$actions['spam'] = "';
} elseif ( 'spam' == $the_comment_status ) {
$actions['unspam'] = "';
} elseif ( 'trash' == $the_comment_status ) {
$actions['untrash'] = "';
}
if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) {
$actions['delete'] = "';
} else {
$actions['trash'] = "';
}
if ( 'trash' != $the_comment_status ) {
$actions['edit'] = "
". __( 'Edit' ) . ' ';
$actions['quickedit'] = '
' . __( 'Quick Edit' ) . ' ';
if ( 'spam' != $the_comment_status )
$actions['reply'] = '
' . __( 'Reply' ) . ' ';
}
$actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment );
$i = 0;
echo '
';
foreach ( $actions as $action => $link ) {
++$i;
( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';
// Reply and quickedit need a hide-if-no-js span when not added with ajax
if ( ( 'reply' == $action || 'quickedit' == $action ) && ! $this->from_ajax )
$action .= ' hide-if-no-js';
elseif ( ( $action == 'untrash' && $the_comment_status == 'trash' ) || ( $action == 'unspam' && $the_comment_status == 'spam' ) ) {
if ( '1' == get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) )
$action .= ' approve';
else
$action .= ' unapprove';
}
echo "$sep$link ";
}
echo '
';
}
}
function column_author( $comment ) {
global $comment_status;
$author_url = get_comment_author_url();
if ( 'http://' == $author_url )
$author_url = '';
$author_url_display = preg_replace( '|http://(www\.)?|i', '', $author_url );
if ( strlen( $author_url_display ) > 50 )
$author_url_display = substr( $author_url_display, 0, 49 ) . '...';
echo "
"; comment_author(); echo ' ';
if ( !empty( $author_url ) )
echo "
$author_url_display ";
if ( $this->user_can ) {
if ( !empty( $comment->comment_author_email ) ) {
comment_author_email_link();
echo '
';
}
echo '
';
comment_author_IP();
echo ' ';
}
}
function column_date( $comment ) {
return get_comment_date( __( 'Y/m/d \a\t g:ia' ) );
}
function column_response( $comment ) {
global $post;
if ( isset( $this->pending_count[$post->ID] ) ) {
$pending_comments = $this->pending_count[$post->ID];
} else {
$_pending_count_temp = get_pending_comments_num( array( $post->ID ) );
$pending_comments = $this->pending_count[$post->ID] = $_pending_count_temp[$post->ID];
}
if ( current_user_can( 'edit_post', $post->ID ) ) {
$post_link = "
";
$post_link .= get_the_title( $post->ID ) . ' ';
} else {
$post_link = get_the_title( $post->ID );
}
echo '
';
echo $post_link . ' ';
$this->comments_bubble( $post->ID, $pending_comments );
echo ' ';
echo "
# ";
echo '
';
if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) )
echo $thumb;
}
function column_default( $comment, $column_name ) {
do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID );
}
}
class WP_Post_Comments_Table extends WP_Comments_Table {
function get_columns() {
return array(
'author' => __( 'Author' ),
'comment' => _x( 'Comment', 'column name' ),
);
}
function get_sortable_columns() {
return array();
}
}
class WP_Links_Table extends WP_List_Table {
function WP_Links_Table() {
parent::WP_List_Table( array(
'screen' => 'link-manager',
'plural' => 'bookmarks',
) );
}
function check_permissions() {
if ( ! current_user_can( 'manage_links' ) )
wp_die( __( 'You do not have sufficient permissions to edit the links for this site.' ) );
}
function prepare_items() {
global $cat_id, $s, $orderby, $order;
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' ) );
$args = array( 'hide_invisible' => 0, 'hide_empty' => 0 );
if ( 'all' != $cat_id )
$args['category'] = $cat_id;
if ( !empty( $s ) )
$args['search'] = $s;
if ( !empty( $orderby ) )
$args['orderby'] = $orderby;
if ( !empty( $order ) )
$args['order'] = $order;
$this->items = get_bookmarks( $args );
}
function no_items() {
_e( 'No links found.' );
}
function get_bulk_actions() {
$actions = array();
$actions['delete'] = __( 'Delete' );
return $actions;
}
function extra_tablenav( $which ) {
global $cat_id;
if ( 'top' != $which )
return;
?>
$cat_id,
'name' => 'cat_id',
'taxonomy' => 'link_category',
'show_option_all' => __( 'View all categories' ),
'hide_empty' => true,
'hierarchical' => 1,
'show_count' => 0,
'orderby' => 'name',
);
wp_dropdown_categories( $dropdown_options );
?>
'
',
'name' => __( 'Name' ),
'url' => __( 'URL' ),
'categories' => __( 'Categories' ),
'rel' => __( 'Relationship' ),
'visible' => __( 'Visible' ),
'rating' => __( 'Rating' )
);
}
function get_sortable_columns() {
return array(
'name' => 'name',
'url' => 'url',
'visible' => 'visible',
'rating' => 'rating'
);
}
function display_rows() {
global $cat_id;
$alt = 0;
foreach ( $this->items as $link ) {
$link = sanitize_bookmark( $link );
$link->link_name = esc_attr( $link->link_name );
$link->link_category = wp_get_link_cats( $link->link_id );
$short_url = str_replace( 'http://', '', $link->link_url );
$short_url = preg_replace( '/^www\./i', '', $short_url );
if ( '/' == substr( $short_url, -1 ) )
$short_url = substr( $short_url, 0, -1 );
if ( strlen( $short_url ) > 35 )
$short_url = substr( $short_url, 0, 32 ).'...';
$visible = ( $link->link_visible == 'Y' ) ? __( 'Yes' ) : __( 'No' );
$rating = $link->link_rating;
$style = ( $alt++ % 2 ) ? '' : ' class="alternate"';
$edit_link = get_edit_bookmark_link( $link );
?>
>
get_column_info();
foreach ( $columns as $column_name => $column_display_name ) {
$class = "class='column-$column_name'";
$style = '';
if ( in_array( $column_name, $hidden ) )
$style = ' style="display:none;"';
$attributes = $class . $style;
switch ( $column_name ) {
case 'cb':
echo ' ';
break;
case 'name':
echo "link_name ) ) . "'>$link->link_name ";
$actions = array();
$actions['edit'] = '' . __( 'Edit' ) . ' ';
$actions['delete'] = "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' ) . " ";
echo $this->row_actions( $actions );
echo ' ';
break;
case 'url':
echo "link_name )."'>$short_url ";
break;
case 'categories':
?>>link_category as $category ) {
$cat = get_term( $category, 'link_category', OBJECT, 'display' );
if ( is_wp_error( $cat ) )
echo $cat->get_error_message();
$cat_name = $cat->name;
if ( $cat_id != $category )
$cat_name = "$cat_name ";
$cat_names[] = $cat_name;
}
echo implode( ', ', $cat_names );
?> >link_rel ) ? ' ' : $link->link_rel; ?> > >
>link_id ); ?>
'sites-network',
'plural' => 'sites',
) );
}
function check_permissions() {
if ( ! current_user_can( 'manage_sites' ) )
wp_die( __( 'You do not have permission to access this page.' ) );
}
function prepare_items() {
global $s, $mode, $wpdb;
$mode = ( empty( $_REQUEST['mode'] ) ) ? 'list' : $_REQUEST['mode'];
$per_page = $this->get_items_per_page( 'sites_network_per_page' );
$pagenum = $this->get_pagenum();
$s = isset( $_REQUEST['s'] ) ? stripslashes( trim( $_REQUEST[ 's' ] ) ) : '';
$like_s = esc_sql( like_escape( $s ) );
$query = "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' ";
if ( isset( $_REQUEST['searchaction'] ) ) {
if ( 'name' == $_REQUEST['searchaction'] ) {
$query .= " AND ( {$wpdb->blogs}.domain LIKE '%{$like_s}%' OR {$wpdb->blogs}.path LIKE '%{$like_s}%' ) ";
} elseif ( 'id' == $_REQUEST['searchaction'] ) {
$query .= " AND {$wpdb->blogs}.blog_id = '{$like_s}' ";
} elseif ( 'ip' == $_REQUEST['searchaction'] ) {
$query = "SELECT *
FROM {$wpdb->blogs}, {$wpdb->registration_log}
WHERE site_id = '{$wpdb->siteid}'
AND {$wpdb->blogs}.blog_id = {$wpdb->registration_log}.blog_id
AND {$wpdb->registration_log}.IP LIKE ( '%{$like_s}%' )";
}
}
$order_by = isset( $_REQUEST['orderby'] ) ? $_REQUEST['orderby'] : 'id';
if ( $order_by == 'registered' ) {
$query .= ' ORDER BY registered ';
} elseif ( $order_by == 'lastupdated' ) {
$query .= ' ORDER BY last_updated ';
} elseif ( $order_by == 'blogname' ) {
$query .= ' ORDER BY domain ';
} else {
$order_by = 'id';
$query .= " ORDER BY {$wpdb->blogs}.blog_id ";
}
$order = ( isset( $_REQUEST['order'] ) && 'DESC' == strtoupper( $_REQUEST['order'] ) ) ? "DESC" : "ASC";
$query .= $order;
$total = $wpdb->get_var( str_replace( 'SELECT *', 'SELECT COUNT( blog_id )', $query ) );
$query .= " LIMIT " . intval( ( $pagenum - 1 ) * $per_page ) . ", " . intval( $per_page );
$this->items = $wpdb->get_results( $query, ARRAY_A );
$this->set_pagination_args( array(
'total_items' => $total,
'per_page' => $per_page,
) );
}
function no_items() {
_e( 'No sites found.' );
}
function get_bulk_actions() {
$actions = array();
$actions['delete'] = __( 'Delete' );
$actions['spam'] = _x( 'Mark as Spam', 'site' );
$actions['notspam'] = _x( 'Not Spam', 'site' );
return $actions;
}
function pagination( $which ) {
global $mode;
parent::pagination( $which );
if ( 'top' == $which )
$this->view_switcher( $mode );
}
function get_columns() {
$blogname_columns = ( is_subdomain_install() ) ? __( 'Domain' ) : __( 'Path' );
$sites_columns = array(
'cb' => '
',
'blogname' => $blogname_columns,
'lastupdated' => __( 'Last Updated' ),
'registered' => _x( 'Registered', 'site' ),
'users' => __( 'Users' )
);
if ( has_filter( 'wpmublogsaction' ) )
$sites_columns['plugins'] = __( 'Actions' );
$sites_columns = apply_filters( 'wpmu_blogs_columns', $sites_columns );
return $sites_columns;
}
function get_sortable_columns() {
return array(
'id' => 'id',
'blogname' => 'blogname',
'lastupdated' => 'lastupdated',
'registered' => 'registered',
);
}
function display_rows() {
global $current_site, $mode;
$status_list = array(
'archived' => array( 'site-archived', __( 'Archived' ) ),
'spam' => array( 'site-spammed', _x( 'Spam', 'site' ) ),
'deleted' => array( 'site-deleted', __( 'Deleted' ) ),
'mature' => array( 'site-mature', __( 'Mature' ) )
);
$class = '';
foreach ( $this->items as $blog ) {
$class = ( 'alternate' == $class ) ? '' : 'alternate';
reset( $status_list );
$blog_states = array();
foreach ( $status_list as $status => $col ) {
if ( get_blog_status( $blog['blog_id'], $status ) == 1 ) {
$class = $col[0];
$blog_states[] = $col[1];
}
}
$blog_state = '';
if ( ! empty( $blog_states ) ) {
$state_count = count( $blog_states );
$i = 0;
$blog_state .= ' - ';
foreach ( $blog_states as $state ) {
++$i;
( $i == $state_count ) ? $sep = '' : $sep = ', ';
$blog_state .= "
$state$sep ";
}
}
echo "
";
$blogname = ( is_subdomain_install() ) ? str_replace( '.'.$current_site->domain, '', $blog['domain'] ) : $blog['path'];
list( $columns, $hidden ) = $this->get_column_info();
foreach ( $columns as $column_name => $column_display_name ) {
switch ( $column_name ) {
case 'cb': ?>
' . sprintf( _x( '%1$s – %2$s ', '%1$s: site name. %2$s: site tagline.' ), get_blog_option( $blog['blog_id'], 'blogname' ), get_blog_option( $blog['blog_id'], 'blogdescription ' ) ) . '';
// Preordered.
$actions = array(
'edit' => '', 'backend' => '',
'activate' => '', 'deactivate' => '',
'archive' => '', 'unarchive' => '',
'spam' => '', 'unspam' => '',
'delete' => '',
'visit' => '',
);
$actions['edit'] = '' . __( 'Edit' ) . ' ';
$actions['backend'] = "" . __( 'Backend' ) . ' ';
if ( $current_site->blog_id != $blog['blog_id'] ) {
if ( get_blog_status( $blog['blog_id'], 'deleted' ) == '1' )
$actions['activate'] = '' . __( 'Activate' ) . ' ';
else
$actions['deactivate'] = '' . __( 'Deactivate' ) . ' ';
if ( get_blog_status( $blog['blog_id'], 'archived' ) == '1' )
$actions['unarchive'] = '' . __( 'Unarchive' ) . ' ';
else
$actions['archive'] = '' . _x( 'Archive', 'verb; site' ) . ' ';
if ( get_blog_status( $blog['blog_id'], 'spam' ) == '1' )
$actions['unspam'] = '' . _x( 'Not Spam', 'site' ) . ' ';
else
$actions['spam'] = '' . _x( 'Spam', 'site' ) . ' ';
$actions['delete'] = '' . __( 'Delete' ) . ' ';
}
$actions['visit'] = "" . __( 'Visit' ) . ' ';
$actions = array_filter( $actions );
echo $this->row_actions( $actions );
?>
g:i:s a';
echo ( $blog['last_updated'] == '0000-00-00 00:00:00' ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] ); ?>
5 ) {
$blogusers = array_slice( $blogusers, 0, 5 );
$blogusers_warning = __( 'Only showing first 5 users.' ) . ' ' . __( 'More' ) . ' ';
}
foreach ( $blogusers as $user_object ) {
echo '' . esc_html( $user_object->user_login ) . ' ';
if ( 'list' != $mode )
echo '( ' . $user_object->user_email . ' )';
echo ' ';
}
if ( $blogusers_warning != '' )
echo '' . $blogusers_warning . ' ';
}
?>
'users-network',
) );
}
function check_permissions() {
if ( !is_multisite() )
wp_die( __( 'Multisite support is not enabled.' ) );
if ( ! current_user_can( 'manage_network_users' ) )
wp_die( __( 'You do not have permission to access this page.' ) );
}
function prepare_items() {
global $usersearch;
$usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';
$users_per_page = $this->get_items_per_page( 'users_network_per_page' );
$paged = $this->get_pagenum();
$args = array(
'number' => $users_per_page,
'offset' => ( $paged-1 ) * $users_per_page,
'search' => $usersearch,
'blog_id' => 0
);
if ( isset( $_REQUEST['orderby'] ) )
$args['orderby'] = $_REQUEST['orderby'];
if ( isset( $_REQUEST['order'] ) )
$args['order'] = $_REQUEST['order'];
// Query the user IDs for this page
$wp_user_search = new WP_User_Query( $args );
$this->items = $wp_user_search->get_results();
$this->set_pagination_args( array(
'total_items' => $wp_user_search->get_total(),
'per_page' => $users_per_page,
) );
}
function get_bulk_actions() {
$actions = array();
$actions['delete'] = __( 'Delete' );
$actions['spam'] = _x( 'Mark as Spam', 'user' );
$actions['notspam'] = _x( 'Not Spam', 'user' );
return $actions;
}
function no_items() {
_e( 'No users found.' );
}
function pagination( $which ) {
global $mode;
parent::pagination ( $which );
if ( 'top' == $which )
$this->view_switcher( $mode );
}
function get_columns() {
$users_columns = array(
'cb' => '
',
'login' => __( 'Login' ),
'name' => __( 'Name' ),
'email' => __( 'E-mail' ),
'registered' => _x( 'Registered', 'user' ),
'blogs' => __( 'Sites' )
);
$users_columns = apply_filters( 'wpmu_users_columns', $users_columns );
return $users_columns;
}
function get_sortable_columns() {
return array(
'id' => 'id',
'login' => 'login',
'name' => 'name',
'email' => 'email',
'registered' => 'registered',
);
}
function display_rows() {
global $current_site, $mode;
$class = '';
$super_admins = get_super_admins();
foreach ( $this->items as $user ) {
$class = ( 'alternate' == $class ) ? '' : 'alternate';
$status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' );
foreach ( $status_list as $status => $col ) {
if ( $user->$status )
$class = $col;
}
?>
get_column_info();
foreach ( $columns as $column_name => $column_display_name ) :
switch ( $column_name ) {
case 'cb': ?>
ID ?>
user_email, 32 );
$edit_link = ( get_current_user_id() == $user->ID ) ? 'profile.php' : 'user-edit.php?user_id=' . $user->ID;
?>
user_login ); ?> user_login, $super_admins ) )
echo ' - ' . __( 'Super admin' );
?>
' . __( 'Edit' ) . '';
if ( ! in_array( $user->user_login, $super_admins ) ) {
$actions['delete'] = '' . __( 'Delete' ) . ' ';
}
echo $this->row_actions( $actions );
?>
display_name ?>
user_email ?>
g:i:s a';
?>
user_registered ); ?>
ID, true );
?>
$val ) {
$path = ( $val->path == '/' ) ? '' : $val->path;
echo '' . str_replace( '.' . $current_site->domain, '', $val->domain . $path ) . ' ';
echo ' ';
// Edit
echo '' . __( 'Edit' ) . ' | ';
// View
echo 'userblog_id, 'spam' ) == 1 )
echo 'style="background-color: #faa" ';
echo 'href="' . esc_url( get_home_url( $val->userblog_id ) ) . '">' . __( 'View' ) . ' ';
echo ' ';
}
}
?>
ID ); ?>
get_pagenum();
parent::WP_List_Table( array(
'screen' => 'plugins',
'plural' => 'plugins',
) );
}
function check_permissions() {
if ( is_multisite() ) {
$menu_perms = get_site_option( 'menu_items', array() );
if ( empty( $menu_perms['plugins'] ) ) {
if ( !is_super_admin() )
wp_die( __( 'Cheatin’ uh?' ) );
}
}
if ( !current_user_can('activate_plugins') )
wp_die( __( 'You do not have sufficient permissions to manage plugins for this site.' ) );
}
function prepare_items() {
global $status, $plugins, $totals, $page, $orderby, $order, $s;
wp_reset_vars( array( 'orderby', 'order', 's' ) );
$plugins = array(
'all' => apply_filters( 'all_plugins', get_plugins() ),
'search' => array(),
'active' => array(),
'inactive' => array(),
'recently_activated' => array(),
'upgrade' => array(),
'mustuse' => array(),
'dropins' => array()
);
if ( ! is_multisite() || ( is_network_admin() && current_user_can('manage_network_plugins') ) ) {
if ( apply_filters( 'show_advanced_plugins', true, 'mustuse' ) )
$plugins['mustuse'] = get_mu_plugins();
if ( apply_filters( 'show_advanced_plugins', true, 'dropins' ) )
$plugins['dropins'] = get_dropins();
}
set_transient( 'plugin_slugs', array_keys( $plugins['all'] ), 86400 );
$recently_activated = get_option( 'recently_activated', array() );
$one_week = 7*24*60*60;
foreach ( $recently_activated as $key => $time )
if ( $time + $one_week < time() )
unset( $recently_activated[$key] );
update_option( 'recently_activated', $recently_activated );
$current = get_site_transient( 'update_plugins' );
foreach ( array( 'all', 'mustuse', 'dropins' ) as $type ) {
foreach ( (array) $plugins[$type] as $plugin_file => $plugin_data ) {
// Translate, Apply Markup, Sanitize HTML
$plugins[$type][$plugin_file] = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, false, true );
}
}
foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) {
// Filter into individual sections
if ( is_plugin_active_for_network($plugin_file) && !is_network_admin() ) {
unset( $plugins['all'][ $plugin_file ] );
continue;
} elseif ( is_multisite() && is_network_only_plugin( $plugin_file ) && !current_user_can( 'manage_network_plugins' ) ) {
$plugins['network'][ $plugin_file ] = $plugin_data;
} elseif ( is_plugin_active( $plugin_file ) ) {
$plugins['active'][ $plugin_file ] = $plugin_data;
} else {
if ( !is_network_admin() && isset( $recently_activated[ $plugin_file ] ) ) // Was the plugin recently activated?
$plugins['recently_activated'][ $plugin_file ] = $plugin_data;
$plugins['inactive'][ $plugin_file ] = $plugin_data;
}
if ( isset( $current->response[ $plugin_file ] ) )
$plugins['upgrade'][ $plugin_file ] = $plugin_data;
}
if ( !current_user_can( 'update_plugins' ) )
$plugins['upgrade'] = array();
if ( $s ) {
function _search_plugins_filter_callback( $plugin ) {
static $term;
if ( is_null( $term ) )
$term = stripslashes( $_REQUEST['s'] );
foreach ( $plugin as $value )
if ( stripos( $value, $term ) !== false )
return true;
return false;
}
$status = 'search';
$plugins['search'] = array_filter( $plugins['all'], '_search_plugins_filter_callback' );
}
$totals = array();
foreach ( $plugins as $type => $list )
$totals[ $type ] = count( $list );
if ( empty( $plugins[ $status ] ) && !in_array( $status, array( 'all', 'search' ) ) )
$status = 'all';
$this->items = $plugins[ $status ];
$total_this_page = $totals[ $status ];
if ( $orderby ) {
$orderby = ucfirst( $orderby );
$order = strtoupper( $order );
function _order_plugins_callback( $plugin_a, $plugin_b ) {
global $orderby, $order;
$a = $plugin_a[$orderby];
$b = $plugin_b[$orderby];
if ( $a == $b )
return 0;
if ( 'DESC' == $order )
return ( $a < $b ) ? 1 : -1;
else
return ( $a < $b ) ? -1 : 1;
}
uasort( $this->items, '_order_plugins_callback' );
}
$plugins_per_page = $this->get_items_per_page( 'plugins_per_page', 999 );
$start = ( $page - 1 ) * $plugins_per_page;
if ( $total_this_page > $plugins_per_page )
$this->items = array_slice( $this->items, $start, $plugins_per_page );
$this->set_pagination_args( array(
'total_items' => $total_this_page,
'per_page' => $plugins_per_page,
) );
}
function no_items() {
global $plugins;
if ( !empty( $plugins['all'] ) )
_e( 'No plugins found.' );
else
_e( 'You do not appear to have any plugins available at this time.' );
}
function get_columns() {
global $status;
return array(
'cb' => !in_array( $status, array( 'mustuse', 'dropins' ) ) ? '
' : '',
'name' => __( 'Plugin' ),
'description' => __( 'Description' ),
);
}
function get_sortable_columns() {
return array(
'name' => 'name',
'description' => 'description',
);
}
function display_tablenav( $which ) {
global $status;
if ( !in_array( $status, array( 'mustuse', 'dropins' ) ) )
parent::display_tablenav( $which );
}
function get_views() {
global $totals, $status;
$status_links = array();
foreach ( $totals as $type => $count ) {
if ( !$count )
continue;
switch ( $type ) {
case 'all':
$text = _nx( 'All
(%s) ', 'All
(%s) ', $count, 'plugins' );
break;
case 'active':
$text = _n( 'Active
(%s) ', 'Active
(%s) ', $count );
break;
case 'recently_activated':
$text = _n( 'Recently Active
(%s) ', 'Recently Active
(%s) ', $count );
break;
case 'inactive':
$text = _n( 'Inactive
(%s) ', 'Inactive
(%s) ', $count );
break;
case 'network':
$text = _n( 'Network
(%s) ', 'Network
(%s) ', $count );
break;
case 'mustuse':
$text = _n( 'Must-Use
(%s) ', 'Must-Use
(%s) ', $count );
break;
case 'dropins':
$text = _n( 'Drop-ins
(%s) ', 'Drop-ins
(%s) ', $count );
break;
case 'upgrade':
$text = _n( 'Upgrade Available
(%s) ', 'Upgrade Available
(%s) ', $count );
break;
case 'search':
$text = _n( 'Search Results
(%s) ', 'Search Results
(%s) ', $count );
break;
}
$status_links[$type] = sprintf( "
%s ",
add_query_arg('plugin_status', $type, 'plugins.php'),
( $type == $status ) ? ' class="current"' : '',
sprintf( $text, number_format_i18n( $count ) )
);
}
return $status_links;
}
function get_bulk_actions() {
global $status;
$actions = array();
if ( 'active' != $status )
$actions['activate-selected'] = __( 'Activate' );
if ( is_multisite() && 'network' != $status )
$actions['network-activate-selected'] = __( 'Network Activate' );
if ( 'inactive' != $status && 'recent' != $status )
$actions['deactivate-selected'] = __( 'Deactivate' );
if ( current_user_can( 'update_plugins' ) )
$actions['update-selected'] = __( 'Update' );
if ( current_user_can( 'delete_plugins' ) && ( 'active' != $status ) )
$actions['delete-selected'] = __( 'Delete' );
return $actions;
}
function bulk_actions( $which ) {
global $status;
if ( in_array( $status, array( 'mustuse', 'dropins' ) ) )
return;
parent::bulk_actions( $which );
}
function extra_tablenav( $which ) {
global $status;
if ( 'recently_activated' == $status ) { ?>
items as $plugin_file => $plugin_data ) {
// preorder
$actions = array(
'network_deactivate' => '', 'deactivate' => '',
'network_only' => '', 'activate' => '',
'network_activate' => '',
'edit' => '',
'delete' => '',
);
if ( 'mustuse' == $context ) {
if ( is_multisite() && !is_network_admin() )
continue;
$is_active = true;
} elseif ( 'dropins' == $context ) {
if ( is_multisite() && !is_network_admin() )
continue;
$dropins = _get_dropins();
$plugin_name = $plugin_file;
if ( $plugin_file != $plugin_data['Name'] )
$plugin_name .= ' ' . $plugin_data['Name'];
if ( true === ( $dropins[ $plugin_file ][1] ) ) { // Doesn't require a constant
$is_active = true;
$description = '' . $dropins[ $plugin_file ][0] . '
';
} elseif ( constant( $dropins[ $plugin_file ][1] ) ) { // Constant is true
$is_active = true;
$description = '' . $dropins[ $plugin_file ][0] . '
';
} else {
$is_active = false;
$description = '' . $dropins[ $plugin_file ][0] . ' ' . __('Inactive:') . ' ' . sprintf( __( 'Requires %s
in wp-config.php
.' ), "define('" . $dropins[ $plugin_file ][1] . "', true);" ) . '
';
}
if ( $plugin_data['Description'] )
$description .= '' . $plugin_data['Description'] . '
';
} else {
$is_active_for_network = is_plugin_active_for_network($plugin_file);
if ( is_network_admin() )
$is_active = $is_active_for_network;
else
$is_active = is_plugin_active( $plugin_file );
if ( $is_active_for_network && !is_super_admin() && !is_network_admin() )
continue;
if ( is_network_admin() ) {
if ( $is_active_for_network ) {
if ( current_user_can( 'manage_network_plugins' ) )
$actions['network_deactivate'] = '' . __('Network Deactivate') . ' ';
} else {
if ( current_user_can( 'manage_network_plugins' ) )
$actions['network_activate'] = '' . __('Network Activate') . ' ';
if ( current_user_can('delete_plugins') )
$actions['delete'] = '' . __('Delete') . ' ';
}
} else {
if ( $is_active ) {
$actions['deactivate'] = '' . __('Deactivate') . ' ';
} else {
if ( is_network_only_plugin( $plugin_file ) && !is_network_admin() )
continue;
$actions['activate'] = '' . __('Activate') . ' ';
if ( current_user_can('delete_plugins') )
$actions['delete'] = '' . __('Delete') . ' ';
} // end if $is_active
} // end if is_network_admin()
if ( current_user_can('edit_plugins') && is_writable(WP_PLUGIN_DIR . '/' . $plugin_file) )
$actions['edit'] = '' . __('Edit') . ' ';
} // end if $context
$actions = apply_filters( 'plugin_action_links', array_filter( $actions ), $plugin_file, $plugin_data, $context );
$actions = apply_filters( "plugin_action_links_$plugin_file", $actions, $plugin_file, $plugin_data, $context );
$class = $is_active ? 'active' : 'inactive';
$checkbox = in_array( $status, array( 'mustuse', 'dropins' ) ) ? '' : " ";
if ( 'dropins' != $status ) {
$description = '' . $plugin_data['Description'] . '
';
$plugin_name = $plugin_data['Name'];
}
echo "
$checkbox
$plugin_name
$description
";
echo '';
foreach ( $actions as $action => $link ) {
$sep = end( $actions ) == $link ? '' : ' | ';
echo "$link$sep ";
}
echo "
";
$plugin_meta = array();
if ( !empty( $plugin_data['Version'] ) )
$plugin_meta[] = sprintf( __( 'Version %s' ), $plugin_data['Version'] );
if ( !empty( $plugin_data['Author'] ) ) {
$author = $plugin_data['Author'];
if ( !empty( $plugin_data['AuthorURI'] ) )
$author = '' . $plugin_data['Author'] . ' ';
$plugin_meta[] = sprintf( __( 'By %s' ), $author );
}
if ( ! empty( $plugin_data['PluginURI'] ) )
$plugin_meta[] = '' . __( 'Visit plugin site' ) . ' ';
$plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status );
echo implode( ' | ', $plugin_meta );
echo "
\n";
do_action( 'after_plugin_row', $plugin_file, $plugin_data, $status );
do_action( "after_plugin_row_$plugin_file", $plugin_file, $plugin_data, $status );
}
}
}
class WP_Plugin_Install_Table extends WP_List_Table {
function WP_Plugin_Install_Table() {
parent::WP_List_Table( array(
'screen' => 'plugin-install',
) );
}
function check_permissions() {
if ( ! current_user_can('install_plugins') )
wp_die(__('You do not have sufficient permissions to install plugins on this site.'));
}
function prepare_items() {
include( ABSPATH . 'wp-admin/includes/plugin-install.php' );
global $tabs, $tab, $paged, $type, $term;
wp_reset_vars( array( 'tab' ) );
$paged = $this->get_pagenum();
$per_page = 30;
// These are the tabs which are shown on the page
$tabs = array();
$tabs['dashboard'] = __( 'Search' );
if ( 'search' == $tab )
$tabs['search'] = __( 'Search Results' );
$tabs['upload'] = __( 'Upload' );
$tabs['featured'] = _x( 'Featured','Plugin Installer' );
$tabs['popular'] = _x( 'Popular','Plugin Installer' );
$tabs['new'] = _x( 'Newest','Plugin Installer' );
$tabs['updated'] = _x( 'Recently Updated','Plugin Installer' );
$nonmenu_tabs = array( 'plugin-information' ); //Valid actions to perform which do not have a Menu item.
$tabs = apply_filters( 'install_plugins_tabs', $tabs );
$nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs );
// If a non-valid menu tab has been selected, And its not a non-menu action.
if ( empty( $tab ) || ( !isset( $tabs[ $tab ] ) && !in_array( $tab, (array) $nonmenu_tabs ) ) )
$tab = key( $tabs );
$args = array( 'page' => $paged, 'per_page' => $per_page );
switch ( $tab ) {
case 'search':
$type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : '';
$term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '';
switch ( $type ) {
case 'tag':
$args['tag'] = sanitize_title_with_dashes( $term );
break;
case 'term':
$args['search'] = $term;
break;
case 'author':
$args['author'] = $term;
break;
}
add_action( 'install_plugins_table_header', 'install_search_form' );
break;
case 'featured':
case 'popular':
case 'new':
case 'updated':
$args['browse'] = $tab;
break;
default:
$args = false;
}
if ( !$args )
return;
$api = plugins_api( 'query_plugins', $args );
if ( is_wp_error( $api ) )
wp_die( $api->get_error_message() . ' ' . __( 'Try again' ) . ' ' );
$this->items = $api->plugins;
$this->set_pagination_args( array(
'total_items' => $api->info['results'],
'per_page' => $per_page,
) );
}
function no_items() {
_e( 'No plugins match your request.' );
}
function get_views() {
global $tabs, $tab;
$display_tabs = array();
foreach ( (array) $tabs as $action => $text ) {
$class = ( $action == $tab ) ? ' class="current"' : '';
$href = admin_url('plugin-install.php?tab=' . $action);
$display_tabs[$action] = "$text ";
}
return $display_tabs;
}
function display_tablenav( $which ) {
if ( 'top' == $which ) { ?>
pagination( $which ); ?>
_args );
return array( 'widefat', $plural );
}
function get_columns() {
return array(
'name' => __( 'Name' ),
'version' => __( 'Version' ),
'rating' => __( 'Rating' ),
'description' => __( 'Description' ),
);
}
function display_rows() {
$plugins_allowedtags = array(
'a' => array( 'href' => array(),'title' => array(), 'target' => array() ),
'abbr' => array( 'title' => array() ),'acronym' => array( 'title' => array() ),
'code' => array(), 'pre' => array(), 'em' => array(),'strong' => array(),
'ul' => array(), 'ol' => array(), 'li' => array(), 'p' => array(), 'br' => array()
);
foreach ( (array) $this->items as $plugin ) {
if ( is_object( $plugin ) )
$plugin = (array) $plugin;
$title = wp_kses( $plugin['name'], $plugins_allowedtags );
//Limit description to 400char, and remove any HTML.
$description = strip_tags( $plugin['description'] );
if ( strlen( $description ) > 400 )
$description = mb_substr( $description, 0, 400 ) . '…';
//remove any trailing entities
$description = preg_replace( '/&[^;\s]{0,6}$/', '', $description );
//strip leading/trailing & multiple consecutive lines
$description = trim( $description );
$description = preg_replace( "|(\r?\n)+|", "\n", $description );
//\n =>
$description = nl2br( $description );
$version = wp_kses( $plugin['version'], $plugins_allowedtags );
$name = strip_tags( $title . ' ' . $version );
$author = $plugin['author'];
if ( ! empty( $plugin['author'] ) )
$author = ' ' . sprintf( __( 'By %s' ), $author ) . '. ';
$author = wp_kses( $author, $plugins_allowedtags );
$action_links = array();
$action_links[] = '' . __( 'Details' ) . ' ';
if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) {
$status = install_plugin_install_status( $plugin );
switch ( $status['status'] ) {
case 'install':
if ( $status['url'] )
$action_links[] = '' . __( 'Install Now' ) . ' ';
break;
case 'update_available':
if ( $status['url'] )
$action_links[] = '' . sprintf( __( 'Update Now' ), $status['version'] ) . ' ';
break;
case 'latest_installed':
case 'newer_installed':
$action_links[] = '' . __( 'Installed' ) . ' ';
break;
}
}
$action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin );
?>
'themes',
) );
}
function check_permissions() {
if ( !current_user_can('switch_themes') && !current_user_can('edit_theme_options') )
wp_die( __( 'Cheatin’ uh?' ) );
}
function prepare_items() {
global $ct;
$ct = current_theme_info();
$themes = get_allowed_themes();
$search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : '';
if ( '' !== $this->search ) {
$this->search = array_merge( $this->search, array_filter( array_map( 'trim', explode( ',', $search ) ) ) );
$this->search = array_unique( $this->search );
foreach ( $themes as $key => $theme ) {
if ( !$this->search_theme( $theme ) )
unset( $themes[ $key ] );
}
}
unset( $themes[$ct->name] );
uksort( $themes, "strnatcasecmp" );
$per_page = 15;
$page = $this->get_pagenum();
$start = ( $page - 1 ) * $per_page;
$this->items = array_slice( $themes, $start, $per_page );
$this->set_pagination_args( array(
'query_var' => 'pagenum',
'total_items' => count( $themes ),
'per_page' => $per_page,
) );
}
function no_items() {
if ( current_user_can( 'install_themes' ) )
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 Install Themes tab above.' ), 'theme-install.php' );
else
printf( __( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ), get_site_option( 'site_name' ) );
}
function display_table() {
?>
pagination( 'top' ); ?>
pagination( 'bottom' ); ?>
items;
$theme_names = array_keys( $themes );
natcasesort( $theme_names );
$table = array();
$rows = ceil( count( $theme_names ) / 3 );
for ( $row = 1; $row <= $rows; $row++ )
for ( $col = 1; $col <= 3; $col++ )
$table[$row][$col] = array_shift( $theme_names );
foreach ( $table as $row => $cols ) {
?>
$theme_name ) {
$class = array( 'available-theme' );
if ( $row == 1 ) $class[] = 'top';
if ( $col == 1 ) $class[] = 'left';
if ( $row == $rows ) $class[] = 'bottom';
if ( $col == 3 ) $class[] = 'right';
?>
1, 'template' => $template, 'stylesheet' => $stylesheet, 'TB_iframe' => 'true' ), $preview_link ) );
$preview_text = esc_attr( sprintf( __( 'Preview of “%s”' ), $title ) );
$tags = $themes[$theme_name]['Tags'];
$thickbox_class = 'thickbox thickbox-preview';
$activate_link = wp_nonce_url( "themes.php?action=activate&template=".urlencode( $template )."&stylesheet=".urlencode( $stylesheet ), 'switch-theme_' . $template );
$activate_text = esc_attr( sprintf( __( 'Activate “%s”' ), $title ) );
$actions = array();
$actions[] = '' . __( 'Activate' ) . ' ';
$actions[] = '' . __( 'Preview' ) . ' ';
if ( current_user_can( 'delete_themes' ) )
$actions[] = '' . __( 'Delete' ) . ' ';
$actions = apply_filters( 'theme_action_links', $actions, $themes[$theme_name] );
$actions = implode ( ' | ', $actions );
?>
%2$s. The stylesheet files are located in %3$s
. %4$s uses templates from %5$s . 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 ); ?>
%2$s.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ) ); ?>
search ) > 0 ) {
foreach ( $this->search as $word ) {
$matched = 0;
// In a tag?
if ( in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) )
$matched = 1;
// In one of the fields?
foreach ( array( 'Name', 'Title', 'Description', 'Author', 'Template', 'Stylesheet' ) AS $field ) {
if ( stripos( $theme[$field], $word ) !== false )
$matched++;
}
if ( $matched == 0 )
return false;
}
}
// Now search the features
if ( count( $this->features ) > 0 ) {
foreach ( $this->features as $word ) {
// In a tag?
if ( !in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) )
return false;
}
}
// Only get here if each word exists in the tags or one of the fields
return true;
}
}
class WP_Theme_Install_Table extends WP_List_Table {
function WP_Theme_Install_Table() {
parent::WP_List_Table( array(
'screen' => 'theme-install',
) );
}
function check_permissions() {
if ( ! current_user_can('install_themes') )
wp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) );
}
function prepare_items() {
include( ABSPATH . 'wp-admin/includes/theme-install.php' );
global $tabs, $tab, $paged, $type, $term, $theme_field_defaults;
wp_reset_vars( array( 'tab' ) );
$paged = $this->get_pagenum();
$per_page = 30;
// These are the tabs which are shown on the page,
$tabs = array();
$tabs['dashboard'] = __( 'Search' );
if ( 'search' == $tab )
$tabs['search'] = __( 'Search Results' );
$tabs['upload'] = __( 'Upload' );
$tabs['featured'] = _x( 'Featured','Theme Installer' );
//$tabs['popular'] = _x( 'Popular','Theme Installer' );
$tabs['new'] = _x( 'Newest','Theme Installer' );
$tabs['updated'] = _x( 'Recently Updated','Theme Installer' );
$nonmenu_tabs = array( 'theme-information' ); // Valid actions to perform which do not have a Menu item.
$tabs = apply_filters( 'install_themes_tabs', $tabs );
$nonmenu_tabs = apply_filters( 'install_themes_nonmenu_tabs', $nonmenu_tabs );
// If a non-valid menu tab has been selected, And its not a non-menu action.
if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs ) ) )
$tab = key( $tabs );
$args = array( 'page' => $paged, 'per_page' => $per_page, 'fields' => $theme_field_defaults );
switch ( $tab ) {
case 'search':
$type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : '';
$term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '';
switch ( $type ) {
case 'tag':
$terms = explode( ',', $term );
$terms = array_map( 'trim', $terms );
$terms = array_map( 'sanitize_title_with_dashes', $terms );
$args['tag'] = $terms;
break;
case 'term':
$args['search'] = $term;
break;
case 'author':
$args['author'] = $term;
break;
}
if ( !empty( $_POST['features'] ) ) {
$terms = $_POST['features'];
$terms = array_map( 'trim', $terms );
$terms = array_map( 'sanitize_title_with_dashes', $terms );
$args['tag'] = $terms;
$_REQUEST['s'] = implode( ',', $terms );
$_REQUEST['type'] = 'tag';
}
add_action( 'install_themes_table_header', 'install_theme_search_form' );
break;
case 'featured':
//case 'popular':
case 'new':
case 'updated':
$args['browse'] = $tab;
break;
default:
$args = false;
}
if ( !$args )
return;
$api = themes_api( 'query_themes', $args );
if ( is_wp_error( $api ) )
wp_die( $api->get_error_message() . ' ' . __( 'Try again' ) . ' ' );
$this->items = $api->themes;
$this->set_pagination_args( array(
'total_items' => $api->info['results'],
'per_page' => $per_page,
) );
}
function no_items() {
_e( 'No themes match your request.' );
}
function get_views() {
global $tabs, $tab;
$display_tabs = array();
foreach ( (array) $tabs as $action => $text ) {
$class = ( $action == $tab ) ? ' class="current"' : '';
$href = admin_url('theme-install.php?tab=' . $action);
$display_tabs[$action] = "$text ";
}
return $display_tabs;
}
function get_columns() {
return array();
}
function display_table() {
?>
pagination( 'bottom' ); ?>
items;
$rows = ceil( count( $themes ) / 3 );
$table = array();
$theme_keys = array_keys( $themes );
for ( $row = 1; $row <= $rows; $row++ )
for ( $col = 1; $col <= 3; $col++ )
$table[$row][$col] = array_shift( $theme_keys );
foreach ( $table as $row => $cols ) {
echo "\t\n";
foreach ( $cols as $col => $theme_index ) {
$class = array( 'available-theme' );
if ( $row == 1 ) $class[] = 'top';
if ( $col == 1 ) $class[] = 'left';
if ( $row == $rows ) $class[] = 'bottom';
if ( $col == 3 ) $class[] = 'right';
?>
\n";
} // end foreach $table
}
}