2010-10-24 22:57:43 -04:00
< ? php
/**
2010-10-25 00:04:18 -04:00
* Terms List Table class .
2010-10-24 22:57:43 -04:00
*
* @ package WordPress
2010-10-25 00:04:18 -04:00
* @ subpackage List_Table
* @ since 3.1 . 0
2011-01-16 16:47:24 -05:00
* @ access private
2010-10-24 22:57:43 -04:00
*/
2010-11-04 04:07:03 -04:00
class WP_Terms_List_Table extends WP_List_Table {
2010-10-24 22:57:43 -04:00
var $callback_args ;
2011-04-29 16:05:12 -04:00
function __construct () {
2010-11-04 11:00:55 -04:00
global $post_type , $taxonomy , $tax ;
2010-10-24 22:57:43 -04:00
wp_reset_vars ( array ( 'action' , 'taxonomy' , 'post_type' ) );
if ( empty ( $taxonomy ) )
$taxonomy = 'post_tag' ;
if ( ! taxonomy_exists ( $taxonomy ) )
wp_die ( __ ( 'Invalid taxonomy' ) );
$tax = get_taxonomy ( $taxonomy );
2011-10-29 01:30:57 -04:00
if ( empty ( $post_type ) || ! in_array ( $post_type , get_post_types ( array ( 'show_ui' => true ) ) ) )
2010-10-24 22:57:43 -04:00
$post_type = 'post' ;
2011-04-29 16:05:12 -04:00
parent :: __construct ( array (
2010-10-24 22:57:43 -04:00
'plural' => 'tags' ,
'singular' => 'tag' ,
) );
}
2010-12-16 04:18:28 -05:00
function ajax_user_can () {
2010-10-24 22:57:43 -04:00
global $tax ;
2010-12-16 04:18:28 -05:00
return current_user_can ( $tax -> cap -> manage_terms );
2010-10-24 22:57:43 -04:00
}
function prepare_items () {
global $taxonomy ;
2011-12-13 18:45:31 -05:00
$tags_per_page = $this -> get_items_per_page ( 'edit_' . $taxonomy . '_per_page' );
2010-10-24 22:57:43 -04:00
if ( 'post_tag' == $taxonomy ) {
$tags_per_page = apply_filters ( 'edit_tags_per_page' , $tags_per_page );
$tags_per_page = apply_filters ( 'tagsperpage' , $tags_per_page ); // Old filter
} elseif ( 'category' == $taxonomy ) {
$tags_per_page = apply_filters ( 'edit_categories_per_page' , $tags_per_page ); // Old filter
}
$search = ! empty ( $_REQUEST [ 's' ] ) ? trim ( stripslashes ( $_REQUEST [ 's' ] ) ) : '' ;
$args = array (
'search' => $search ,
'page' => $this -> get_pagenum (),
'number' => $tags_per_page ,
);
if ( ! empty ( $_REQUEST [ 'orderby' ] ) )
$args [ 'orderby' ] = trim ( stripslashes ( $_REQUEST [ 'orderby' ] ) );
if ( ! empty ( $_REQUEST [ 'order' ] ) )
$args [ 'order' ] = trim ( stripslashes ( $_REQUEST [ 'order' ] ) );
$this -> callback_args = $args ;
$this -> set_pagination_args ( array (
'total_items' => wp_count_terms ( $taxonomy , compact ( 'search' ) ),
'per_page' => $tags_per_page ,
) );
}
2011-01-05 23:11:14 -05:00
2010-12-17 06:41:59 -05:00
function has_items () {
// todo: populate $this->items in prepare_items()
return true ;
}
2010-10-24 22:57:43 -04:00
function get_bulk_actions () {
$actions = array ();
$actions [ 'delete' ] = __ ( 'Delete' );
return $actions ;
}
function current_action () {
if ( isset ( $_REQUEST [ 'action' ] ) && isset ( $_REQUEST [ 'delete_tags' ] ) && ( 'delete' == $_REQUEST [ 'action' ] || 'delete' == $_REQUEST [ 'action2' ] ) )
return 'bulk-delete' ;
return parent :: current_action ();
}
function get_columns () {
2011-10-23 13:48:58 -04:00
global $taxonomy , $post_type ;
2010-10-24 22:57:43 -04:00
$columns = array (
'cb' => '<input type="checkbox" />' ,
2011-06-10 18:13:26 -04:00
'name' => _x ( 'Name' , 'term name' ),
2010-10-24 22:57:43 -04:00
'description' => __ ( 'Description' ),
'slug' => __ ( 'Slug' ),
);
2010-11-08 19:59:49 -05:00
if ( 'link_category' == $taxonomy ) {
2010-10-24 22:57:43 -04:00
$columns [ 'links' ] = __ ( 'Links' );
2010-11-08 19:59:49 -05:00
} else {
2010-11-09 01:38:53 -05:00
$post_type_object = get_post_type_object ( $post_type );
2010-11-08 19:59:49 -05:00
$columns [ 'posts' ] = $post_type_object ? $post_type_object -> labels -> name : __ ( 'Posts' );
}
2010-10-24 22:57:43 -04:00
return $columns ;
}
function get_sortable_columns () {
return array (
'name' => 'name' ,
'description' => 'description' ,
'slug' => 'slug' ,
'posts' => 'count' ,
'links' => 'count'
);
}
2010-12-17 06:17:41 -05:00
function display_rows_or_placeholder () {
2010-10-24 22:57:43 -04:00
global $taxonomy ;
$args = wp_parse_args ( $this -> callback_args , array (
'page' => 1 ,
'number' => 20 ,
'search' => '' ,
'hide_empty' => 0
) );
extract ( $args , EXTR_SKIP );
$args [ 'offset' ] = $offset = ( $page - 1 ) * $number ;
// convert it to table rows
$out = '' ;
$count = 0 ;
2011-01-05 23:11:14 -05:00
2010-12-17 06:17:41 -05:00
$terms = array ();
2010-10-24 22:57:43 -04:00
if ( is_taxonomy_hierarchical ( $taxonomy ) && ! isset ( $orderby ) ) {
// We'll need the full set of terms then.
$args [ 'number' ] = $args [ 'offset' ] = 0 ;
$terms = get_terms ( $taxonomy , $args );
if ( ! empty ( $search ) ) // Ignore children on searches.
$children = array ();
else
$children = _get_term_hierarchy ( $taxonomy );
// Some funky recursion to get the job done( Paging & parents mainly ) is contained within, Skip it for non-hierarchical taxonomies for performance sake
$out .= $this -> _rows ( $taxonomy , $terms , $children , $offset , $number , $count );
} else {
$terms = get_terms ( $taxonomy , $args );
foreach ( $terms as $term )
$out .= $this -> single_row ( $term , 0 , $taxonomy );
$count = $number ; // Only displaying a single page.
}
2011-01-05 23:11:14 -05:00
2010-12-17 06:17:41 -05:00
if ( empty ( $terms ) ) {
2011-01-20 17:19:34 -05:00
list ( $columns , $hidden ) = $this -> get_column_info ();
2011-01-21 02:39:21 -05:00
echo '<tr class="no-items"><td class="colspanchange" colspan="' . $this -> get_column_count () . '">' ;
2010-12-17 06:17:41 -05:00
$this -> no_items ();
echo '</td></tr>' ;
} else {
echo $out ;
}
2010-10-24 22:57:43 -04:00
}
function _rows ( $taxonomy , $terms , & $children , $start = 0 , $per_page = 20 , & $count , $parent = 0 , $level = 0 ) {
$end = $start + $per_page ;
$output = '' ;
foreach ( $terms as $key => $term ) {
if ( $count >= $end )
break ;
if ( $term -> parent != $parent && empty ( $_REQUEST [ 's' ] ) )
continue ;
// If the page starts in a subtree, print the parents.
if ( $count == $start && $term -> parent > 0 && empty ( $_REQUEST [ 's' ] ) ) {
$my_parents = $parent_ids = array ();
$p = $term -> parent ;
while ( $p ) {
$my_parent = get_term ( $p , $taxonomy );
$my_parents [] = $my_parent ;
$p = $my_parent -> parent ;
if ( in_array ( $p , $parent_ids ) ) // Prevent parent loops.
break ;
$parent_ids [] = $p ;
}
unset ( $parent_ids );
$num_parents = count ( $my_parents );
while ( $my_parent = array_pop ( $my_parents ) ) {
$output .= " \t " . $this -> single_row ( $my_parent , $level - $num_parents , $taxonomy );
$num_parents -- ;
}
}
if ( $count >= $start )
$output .= " \t " . $this -> single_row ( $term , $level , $taxonomy );
++ $count ;
unset ( $terms [ $key ] );
if ( isset ( $children [ $term -> term_id ] ) && empty ( $_REQUEST [ 's' ] ) )
$output .= $this -> _rows ( $taxonomy , $terms , $children , $start , $per_page , $count , $term -> term_id , $level + 1 );
}
return $output ;
}
function single_row ( $tag , $level = 0 ) {
static $row_class = '' ;
$row_class = ( $row_class == '' ? ' class="alternate"' : '' );
$this -> level = $level ;
echo '<tr id="tag-' . $tag -> term_id . '"' . $row_class . '>' ;
echo $this -> single_row_columns ( $tag );
echo '</tr>' ;
}
function column_cb ( $tag ) {
global $taxonomy , $tax ;
$default_term = get_option ( 'default_' . $taxonomy );
if ( current_user_can ( $tax -> cap -> delete_terms ) && $tag -> term_id != $default_term )
2012-07-25 12:18:14 -04:00
return '<label class="screen-reader-text" for="cb-select-' . $tag -> term_id . '">' . sprintf ( __ ( 'Select %s' ), $tag -> name ) . '</label>'
. '<input type="checkbox" name="delete_tags[]" value="' . $tag -> term_id . '" id="cb-select-' . $tag -> term_id . '" />' ;
2012-07-24 14:01:22 -04:00
return ' ' ;
2010-10-24 22:57:43 -04:00
}
function column_name ( $tag ) {
global $taxonomy , $tax , $post_type ;
$default_term = get_option ( 'default_' . $taxonomy );
$pad = str_repeat ( '— ' , max ( 0 , $this -> level ) );
$name = apply_filters ( 'term_name' , $pad . ' ' . $tag -> name , $tag );
$qe_data = get_term ( $tag -> term_id , $taxonomy , OBJECT , 'edit' );
2011-05-23 19:33:30 -04:00
$edit_link = esc_url ( get_edit_term_link ( $tag -> term_id , $taxonomy , $post_type ) );
2010-10-24 22:57:43 -04:00
$out = '<strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr ( sprintf ( __ ( 'Edit “%s”' ), $name ) ) . '">' . $name . '</a></strong><br />' ;
$actions = array ();
if ( current_user_can ( $tax -> cap -> edit_terms ) ) {
$actions [ 'edit' ] = '<a href="' . $edit_link . '">' . __ ( 'Edit' ) . '</a>' ;
$actions [ 'inline hide-if-no-js' ] = '<a href="#" class="editinline">' . __ ( 'Quick Edit' ) . '</a>' ;
}
if ( current_user_can ( $tax -> cap -> delete_terms ) && $tag -> term_id != $default_term )
$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> " ;
2011-06-08 12:49:27 -04:00
$actions [ 'view' ] = '<a href="' . get_term_link ( $tag ) . '">' . __ ( 'View' ) . '</a>' ;
2010-10-24 22:57:43 -04:00
$actions = apply_filters ( 'tag_row_actions' , $actions , $tag );
2010-11-14 10:50:02 -05:00
$actions = apply_filters ( " { $taxonomy } _row_actions " , $actions , $tag );
2010-10-24 22:57:43 -04:00
$out .= $this -> row_actions ( $actions );
$out .= '<div class="hidden" id="inline_' . $qe_data -> term_id . '">' ;
$out .= '<div class="name">' . $qe_data -> name . '</div>' ;
$out .= '<div class="slug">' . apply_filters ( 'editable_slug' , $qe_data -> slug ) . '</div>' ;
2011-05-23 19:33:30 -04:00
$out .= '<div class="parent">' . $qe_data -> parent . '</div></div>' ;
2010-10-24 22:57:43 -04:00
return $out ;
}
function column_description ( $tag ) {
return $tag -> description ;
}
function column_slug ( $tag ) {
return apply_filters ( 'editable_slug' , $tag -> slug );
}
function column_posts ( $tag ) {
2011-11-23 10:20:45 -05:00
global $taxonomy , $post_type ;
2010-10-24 22:57:43 -04:00
$count = number_format_i18n ( $tag -> count );
2010-11-24 18:29:13 -05:00
$tax = get_taxonomy ( $taxonomy );
2010-11-24 20:39:34 -05:00
2011-11-21 15:44:48 -05:00
$ptype_object = get_post_type_object ( $post_type );
if ( ! $ptype_object -> show_ui )
2010-11-24 20:39:34 -05:00
return $count ;
2010-11-24 18:29:13 -05:00
if ( $tax -> query_var ) {
2010-11-24 20:39:34 -05:00
$args = array ( $tax -> query_var => $tag -> slug );
} else {
$args = array ( 'taxonomy' => $tax -> name , 'term' => $tag -> slug );
2010-10-24 22:57:43 -04:00
}
2011-11-21 15:44:48 -05:00
if ( 'post' != $post_type )
$args [ 'post_type' ] = $post_type ;
2010-11-24 20:39:34 -05:00
2011-05-23 19:33:30 -04:00
return " <a href=' " . esc_url ( add_query_arg ( $args , 'edit.php' ) ) . " '> $count </a> " ;
2010-10-24 22:57:43 -04:00
}
function column_links ( $tag ) {
$count = number_format_i18n ( $tag -> count );
2010-12-27 11:57:19 -05:00
if ( $count )
$count = " <a href='link-manager.php?cat_id= $tag->term_id '> $count </a> " ;
2010-10-24 22:57:43 -04:00
return $count ;
}
function column_default ( $tag , $column_name ) {
2010-11-08 10:43:44 -05:00
$screen = get_current_screen ();
return apply_filters ( " manage_ { $screen -> taxonomy } _custom_column " , '' , $column_name , $tag -> term_id );
2010-10-24 22:57:43 -04:00
}
/**
* Outputs the hidden row displayed when inline editing
*
* @ since 3.1 . 0
*/
function inline_edit () {
2011-09-24 16:26:51 -04:00
global $post_type , $tax ;
2010-10-24 22:57:43 -04:00
if ( ! current_user_can ( $tax -> cap -> edit_terms ) )
return ;
2010-11-14 13:00:09 -05:00
?>
2010-10-24 22:57:43 -04:00
< form method = " get " action = " " >< table style = " display: none " >< tbody id = " inlineedit " >
2010-11-14 13:00:09 -05:00
< tr id = " inline-edit " class = " inline-edit-row " style = " display: none " >< td colspan = " <?php echo $this->get_column_count (); ?> " class = " colspanchange " >
2010-10-24 22:57:43 -04:00
< fieldset >< div class = " inline-edit-col " >
< h4 >< ? php _e ( 'Quick Edit' ); ?> </h4>
< label >
2011-06-10 18:13:26 -04:00
< span class = " title " >< ? php _ex ( 'Name' , 'term name' ); ?> </span>
2010-10-24 22:57:43 -04:00
< span class = " input-text-wrap " >< input type = " text " name = " name " class = " ptitle " value = " " /></ span >
</ label >
< ? php if ( ! global_terms_enabled () ) { ?>
< label >
< span class = " title " >< ? php _e ( 'Slug' ); ?> </span>
< span class = " input-text-wrap " >< input type = " text " name = " slug " class = " ptitle " value = " " /></ span >
</ label >
< ? php } ?>
</ div ></ fieldset >
< ? php
$core_columns = array ( 'cb' => true , 'description' => true , 'name' => true , 'slug' => true , 'posts' => true );
2010-11-14 13:00:09 -05:00
list ( $columns ) = $this -> get_column_info ();
2010-10-24 22:57:43 -04:00
foreach ( $columns as $column_name => $column_display_name ) {
if ( isset ( $core_columns [ $column_name ] ) )
continue ;
2010-12-17 08:20:17 -05:00
2010-12-31 11:34:08 -05:00
do_action ( 'quick_edit_custom_box' , $column_name , 'edit-tags' , $tax -> name );
2010-10-24 22:57:43 -04:00
}
?>
< p class = " inline-edit-save submit " >
2011-10-20 11:04:46 -04:00
< a accesskey = " c " href = " #inline-edit " title = " <?php esc_attr_e( 'Cancel' ); ?> " class = " cancel button-secondary alignleft " >< ? php _e ( 'Cancel' ); ?> </a>
2010-10-24 22:57:43 -04:00
< ? php $update_text = $tax -> labels -> update_item ; ?>
< a accesskey = " s " href = " #inline-edit " title = " <?php echo esc_attr( $update_text ); ?> " class = " save button-primary alignright " >< ? php echo $update_text ; ?> </a>
< img class = " waiting " style = " display:none; " src = " <?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?> " alt = " " />
< span class = " error " style = " display:none; " ></ span >
< ? php wp_nonce_field ( 'taxinlineeditnonce' , '_inline_edit' , false ); ?>
< input type = " hidden " name = " taxonomy " value = " <?php echo esc_attr( $tax->name ); ?> " />
2011-09-24 16:26:51 -04:00
< input type = " hidden " name = " post_type " value = " <?php echo esc_attr( $post_type ); ?> " />
2010-10-24 22:57:43 -04:00
< br class = " clear " />
</ p >
</ td ></ tr >
</ tbody ></ table ></ form >
< ? php
}
}