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
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 ;
2010-11-04 04:07:03 -04:00
function WP_Terms_List_Table () {
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 );
if ( empty ( $post_type ) || ! in_array ( $post_type , get_post_types ( array ( 'public' => true ) ) ) )
$post_type = 'post' ;
parent :: WP_List_Table ( array (
'plural' => 'tags' ,
'singular' => 'tag' ,
) );
}
2010-12-03 18:18:02 -05:00
function check_permissions ( $type = '' ) {
2010-10-24 22:57:43 -04:00
global $tax ;
2010-12-03 18:18:02 -05:00
$cap = 'edit' == $type ? $tax -> cap -> edit_terms : $tax -> cap -> manage_terms ;
if ( ! current_user_can ( $cap ) )
2010-10-24 22:57:43 -04:00
wp_die ( __ ( 'Cheatin’ uh?' ) );
}
function prepare_items () {
global $taxonomy ;
$tags_per_page = $this -> get_items_per_page ( 'edit_' . $taxonomy . '_per_page' );
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 ,
) );
}
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 () {
2010-11-09 01:38:53 -05:00
global $taxonomy , $typenow ;
2010-10-24 22:57:43 -04:00
$columns = array (
'cb' => '<input type="checkbox" />' ,
'name' => __ ( 'Name' ),
'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 = empty ( $typenow ) ? 'post' : $typenow ;
$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'
);
}
function display_rows () {
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 ;
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.
}
echo $out ;
}
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 )
return '<input type="checkbox" name="delete_tags[]" value="' . $tag -> term_id . '" />' ;
else
return ' ' ;
}
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' );
$edit_link = get_edit_term_link ( $tag -> term_id , $taxonomy , $post_type );
$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> " ;
$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>' ;
$out .= '<div class="parent">' . $qe_data -> parent . '</div></div></td>' ;
return $out ;
}
function column_description ( $tag ) {
return $tag -> description ;
}
function column_slug ( $tag ) {
return apply_filters ( 'editable_slug' , $tag -> slug );
}
function column_posts ( $tag ) {
global $taxonomy , $post_type ;
$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
if ( ! $tax -> public )
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
}
2010-11-24 20:39:34 -05:00
$args [ 'post_type' ] = $post_type ;
return " <a href=' " . 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 );
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 () {
global $tax ;
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 >
< span class = " title " >< ? php _e ( 'Name' ); ?> </span>
< 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 ;
do_action ( 'quick_edit_custom_box' , $column_name , $type , $tax -> taxonomy );
}
?>
< p class = " inline-edit-save submit " >
< a accesskey = " c " href = " #inline-edit " title = " <?php _e( 'Cancel' ); ?> " class = " cancel button-secondary alignleft " >< ? php _e ( 'Cancel' ); ?> </a>
< ? 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 ); ?> " />
< br class = " clear " />
</ p >
</ td ></ tr >
</ tbody ></ table ></ form >
< ? php
}
}
2010-11-04 11:00:55 -04:00
?>