2010-10-25 04:57:43 +02:00
< ? php
/**
2010-10-25 06:04:18 +02:00
* Terms List Table class .
2010-10-25 04:57:43 +02:00
*
* @ package WordPress
2010-10-25 06:04:18 +02:00
* @ subpackage List_Table
* @ since 3.1 . 0
2011-01-16 22:47:24 +01:00
* @ access private
2010-10-25 04:57:43 +02:00
*/
2010-11-04 09:07:03 +01:00
class WP_Terms_List_Table extends WP_List_Table {
2010-10-25 04:57:43 +02:00
var $callback_args ;
2012-09-19 14:43:31 +02:00
function __construct ( $args = array () ) {
global $post_type , $taxonomy , $action , $tax ;
2010-10-25 04:57:43 +02:00
2012-09-19 14:43:31 +02:00
parent :: __construct ( array (
'plural' => 'tags' ,
'singular' => 'tag' ,
'screen' => isset ( $args [ 'screen' ] ) ? $args [ 'screen' ] : null ,
) );
$action = $this -> screen -> action ;
$post_type = $this -> screen -> post_type ;
$taxonomy = $this -> screen -> taxonomy ;
2010-10-25 04:57:43 +02:00
if ( empty ( $taxonomy ) )
$taxonomy = 'post_tag' ;
2012-09-19 14:43:31 +02:00
if ( ! taxonomy_exists ( $taxonomy ) )
2010-10-25 04:57:43 +02:00
wp_die ( __ ( 'Invalid taxonomy' ) );
$tax = get_taxonomy ( $taxonomy );
2012-09-19 14:43:31 +02:00
// @todo Still needed? Maybe just the show_ui part.
2011-10-29 07:30:57 +02:00
if ( empty ( $post_type ) || ! in_array ( $post_type , get_post_types ( array ( 'show_ui' => true ) ) ) )
2010-10-25 04:57:43 +02:00
$post_type = 'post' ;
}
2010-12-16 10:18:28 +01:00
function ajax_user_can () {
2012-09-19 14:43:31 +02:00
return current_user_can ( get_taxonomy ( $this -> screen -> taxonomy ) -> cap -> manage_terms );
2010-10-25 04:57:43 +02:00
}
function prepare_items () {
2012-09-19 14:43:31 +02:00
$tags_per_page = $this -> get_items_per_page ( 'edit_' . $this -> screen -> taxonomy . '_per_page' );
2010-10-25 04:57:43 +02:00
2012-09-19 14:43:31 +02:00
if ( 'post_tag' == $this -> screen -> taxonomy ) {
2014-02-04 08:56:12 +01:00
/**
* Filter the number of terms displayed per page for the Tags list table .
*
* @ since 2.8 . 0
*
* @ param int $tags_per_page Number of tags to be displayed . Default 20.
*/
2010-10-25 04:57:43 +02:00
$tags_per_page = apply_filters ( 'edit_tags_per_page' , $tags_per_page );
2014-02-04 08:56:12 +01:00
/**
* Filter the number of terms displayed per page for the Tags list table .
*
* @ since 2.7 . 0
* @ deprecated 2.8 . 0 Use edit_tags_per_page instead .
*
* @ param int $tags_per_page Number of tags to be displayed . Default 20.
*/
$tags_per_page = apply_filters ( 'tagsperpage' , $tags_per_page );
2012-09-19 14:43:31 +02:00
} elseif ( 'category' == $this -> screen -> taxonomy ) {
2014-02-04 08:56:12 +01:00
/**
* Filter the number of terms displayed per page for the Categories list table .
*
* @ since 2.8 . 0
*
* @ param int $tags_per_page Number of categories to be displayed . Default 20.
*/
$tags_per_page = apply_filters ( 'edit_categories_per_page' , $tags_per_page );
2010-10-25 04:57:43 +02:00
}
2013-03-01 18:00:25 +01:00
$search = ! empty ( $_REQUEST [ 's' ] ) ? trim ( wp_unslash ( $_REQUEST [ 's' ] ) ) : '' ;
2010-10-25 04:57:43 +02:00
$args = array (
'search' => $search ,
'page' => $this -> get_pagenum (),
'number' => $tags_per_page ,
);
if ( ! empty ( $_REQUEST [ 'orderby' ] ) )
2013-03-01 18:00:25 +01:00
$args [ 'orderby' ] = trim ( wp_unslash ( $_REQUEST [ 'orderby' ] ) );
2010-10-25 04:57:43 +02:00
if ( ! empty ( $_REQUEST [ 'order' ] ) )
2013-03-01 18:00:25 +01:00
$args [ 'order' ] = trim ( wp_unslash ( $_REQUEST [ 'order' ] ) );
2010-10-25 04:57:43 +02:00
$this -> callback_args = $args ;
$this -> set_pagination_args ( array (
2012-09-19 14:43:31 +02:00
'total_items' => wp_count_terms ( $this -> screen -> taxonomy , compact ( 'search' ) ),
2010-10-25 04:57:43 +02:00
'per_page' => $tags_per_page ,
) );
}
2011-01-06 05:11:14 +01:00
2010-12-17 12:41:59 +01:00
function has_items () {
// todo: populate $this->items in prepare_items()
return true ;
}
2010-10-25 04:57:43 +02: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 () {
$columns = array (
'cb' => '<input type="checkbox" />' ,
2011-06-11 00:13:26 +02:00
'name' => _x ( 'Name' , 'term name' ),
2010-10-25 04:57:43 +02:00
'description' => __ ( 'Description' ),
'slug' => __ ( 'Slug' ),
);
2012-09-19 14:43:31 +02:00
if ( 'link_category' == $this -> screen -> taxonomy ) {
2010-10-25 04:57:43 +02:00
$columns [ 'links' ] = __ ( 'Links' );
2010-11-09 01:59:49 +01:00
} else {
2012-09-19 14:43:31 +02:00
$post_type_object = get_post_type_object ( $this -> screen -> post_type );
2010-11-09 01:59:49 +01:00
$columns [ 'posts' ] = $post_type_object ? $post_type_object -> labels -> name : __ ( 'Posts' );
}
2010-10-25 04:57:43 +02:00
return $columns ;
}
function get_sortable_columns () {
return array (
'name' => 'name' ,
'description' => 'description' ,
'slug' => 'slug' ,
'posts' => 'count' ,
'links' => 'count'
);
}
2010-12-17 12:17:41 +01:00
function display_rows_or_placeholder () {
2012-09-19 14:43:31 +02:00
$taxonomy = $this -> screen -> taxonomy ;
2010-10-25 04:57:43 +02:00
$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
$count = 0 ;
2011-01-06 05:11:14 +01:00
2010-12-17 12:17:41 +01:00
$terms = array ();
2010-10-25 04:57:43 +02:00
if ( is_taxonomy_hierarchical ( $taxonomy ) && ! isset ( $orderby ) ) {
// We'll need the full set of terms then.
$args [ 'number' ] = $args [ 'offset' ] = 0 ;
2013-04-29 15:39:28 +02:00
}
$terms = get_terms ( $taxonomy , $args );
2010-10-25 04:57:43 +02:00
2013-04-29 15:39:28 +02:00
if ( empty ( $terms ) ) {
list ( $columns , $hidden ) = $this -> get_column_info ();
echo '<tr class="no-items"><td class="colspanchange" colspan="' . $this -> get_column_count () . '">' ;
$this -> no_items ();
echo '</td></tr>' ;
return ;
}
if ( is_taxonomy_hierarchical ( $taxonomy ) && ! isset ( $orderby ) ) {
2010-10-25 04:57:43 +02:00
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
2013-04-29 03:10:50 +02:00
$this -> _rows ( $taxonomy , $terms , $children , $offset , $number , $count );
2010-10-25 04:57:43 +02:00
} else {
$terms = get_terms ( $taxonomy , $args );
foreach ( $terms as $term )
2013-04-29 15:39:28 +02:00
$this -> single_row ( $term );
2010-10-25 04:57:43 +02:00
$count = $number ; // Only displaying a single page.
}
}
2013-04-29 15:39:28 +02:00
function _rows ( $taxonomy , $terms , & $children , $start , $per_page , & $count , $parent = 0 , $level = 0 ) {
2010-10-25 04:57:43 +02:00
$end = $start + $per_page ;
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 ) ) {
2013-04-29 03:10:50 +02:00
echo " \t " ;
2013-04-29 15:39:28 +02:00
$this -> single_row ( $my_parent , $level - $num_parents );
2010-10-25 04:57:43 +02:00
$num_parents -- ;
}
}
2013-04-29 03:10:50 +02:00
if ( $count >= $start ) {
echo " \t " ;
2013-04-29 15:39:28 +02:00
$this -> single_row ( $term , $level );
2013-04-29 03:10:50 +02:00
}
2010-10-25 04:57:43 +02:00
++ $count ;
unset ( $terms [ $key ] );
if ( isset ( $children [ $term -> term_id ] ) && empty ( $_REQUEST [ 's' ] ) )
2013-04-29 03:10:50 +02:00
$this -> _rows ( $taxonomy , $terms , $children , $start , $per_page , $count , $term -> term_id , $level + 1 );
2010-10-25 04:57:43 +02:00
}
}
function single_row ( $tag , $level = 0 ) {
2014-05-11 02:05:15 +02:00
global $taxonomy ;
$tag = sanitize_term ( $tag , $taxonomy );
2010-10-25 04:57:43 +02:00
static $row_class = '' ;
$row_class = ( $row_class == '' ? ' class="alternate"' : '' );
$this -> level = $level ;
echo '<tr id="tag-' . $tag -> term_id . '"' . $row_class . '>' ;
2013-04-29 03:10:50 +02:00
$this -> single_row_columns ( $tag );
2010-10-25 04:57:43 +02:00
echo '</tr>' ;
}
function column_cb ( $tag ) {
2012-09-19 14:43:31 +02:00
$default_term = get_option ( 'default_' . $this -> screen -> taxonomy );
2010-10-25 04:57:43 +02:00
2012-09-19 14:43:31 +02:00
if ( current_user_can ( get_taxonomy ( $this -> screen -> taxonomy ) -> cap -> delete_terms ) && $tag -> term_id != $default_term )
2012-07-25 18:18:14 +02: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 20:01:22 +02:00
return ' ' ;
2010-10-25 04:57:43 +02:00
}
function column_name ( $tag ) {
2012-09-19 14:43:31 +02:00
$taxonomy = $this -> screen -> taxonomy ;
$tax = get_taxonomy ( $taxonomy );
2010-10-25 04:57:43 +02:00
$default_term = get_option ( 'default_' . $taxonomy );
$pad = str_repeat ( '— ' , max ( 0 , $this -> level ) );
2014-02-04 08:56:12 +01:00
/**
* Filter display of the term name in the terms list table .
*
* The default output may include padding due to the term ' s
* current level in the term hierarchy .
*
* @ since 2.5 . 0
*
* @ see WP_Terms_List_Table :: column_name ()
*
* @ param string $pad_tag_name The term name , padded if not top - level .
* @ param object $tag Term object .
*/
2010-10-25 04:57:43 +02:00
$name = apply_filters ( 'term_name' , $pad . ' ' . $tag -> name , $tag );
2014-02-04 08:56:12 +01:00
2010-10-25 04:57:43 +02:00
$qe_data = get_term ( $tag -> term_id , $taxonomy , OBJECT , 'edit' );
2012-09-19 14:43:31 +02:00
$edit_link = esc_url ( get_edit_term_link ( $tag -> term_id , $taxonomy , $this -> screen -> post_type ) );
2010-10-25 04:57:43 +02: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> " ;
2013-07-28 23:06:19 +02:00
if ( $tax -> public )
$actions [ 'view' ] = '<a href="' . get_term_link ( $tag ) . '">' . __ ( 'View' ) . '</a>' ;
2010-10-25 04:57:43 +02:00
2014-02-04 08:56:12 +01:00
/**
* Filter the action links displayed for each term in the Tags list table .
*
* @ since 2.8 . 0
* @ deprecated 3.0 . 0 Use { $taxonomy } _row_actions instead .
*
* @ param array $actions An array of action links to be displayed . Default
* 'Edit' , 'Quick Edit' , 'Delete' , and 'View' .
* @ param object $tag Term object .
*/
2010-10-25 04:57:43 +02:00
$actions = apply_filters ( 'tag_row_actions' , $actions , $tag );
2014-02-04 08:56:12 +01:00
/**
* Filter the action links displayed for each term in the terms list table .
*
* The dynamic portion of the hook name , $taxonomy , refers to the taxonomy slug .
*
* @ since 3.0 . 0
*
* @ param array $actions An array of action links to be displayed . Default
* 'Edit' , 'Quick Edit' , 'Delete' , and 'View' .
* @ param object $tag Term object .
*/
2010-11-14 16:50:02 +01:00
$actions = apply_filters ( " { $taxonomy } _row_actions " , $actions , $tag );
2010-10-25 04:57:43 +02:00
$out .= $this -> row_actions ( $actions );
$out .= '<div class="hidden" id="inline_' . $qe_data -> term_id . '">' ;
$out .= '<div class="name">' . $qe_data -> name . '</div>' ;
2014-02-04 08:56:12 +01:00
/** This filter is documented in wp-admin/edit-tag-form.php */
2010-10-25 04:57:43 +02:00
$out .= '<div class="slug">' . apply_filters ( 'editable_slug' , $qe_data -> slug ) . '</div>' ;
2011-05-24 01:33:30 +02:00
$out .= '<div class="parent">' . $qe_data -> parent . '</div></div>' ;
2010-10-25 04:57:43 +02:00
return $out ;
}
function column_description ( $tag ) {
return $tag -> description ;
}
function column_slug ( $tag ) {
2014-02-04 08:56:12 +01:00
/** This filter is documented in wp-admin/edit-tag-form.php */
2010-10-25 04:57:43 +02:00
return apply_filters ( 'editable_slug' , $tag -> slug );
}
function column_posts ( $tag ) {
$count = number_format_i18n ( $tag -> count );
2012-09-19 14:43:31 +02:00
$tax = get_taxonomy ( $this -> screen -> taxonomy );
2010-11-25 02:39:34 +01:00
2012-09-19 14:43:31 +02:00
$ptype_object = get_post_type_object ( $this -> screen -> post_type );
2011-11-21 21:44:48 +01:00
if ( ! $ptype_object -> show_ui )
2010-11-25 02:39:34 +01:00
return $count ;
2010-11-25 00:29:13 +01:00
if ( $tax -> query_var ) {
2010-11-25 02:39:34 +01:00
$args = array ( $tax -> query_var => $tag -> slug );
} else {
$args = array ( 'taxonomy' => $tax -> name , 'term' => $tag -> slug );
2010-10-25 04:57:43 +02:00
}
2012-09-19 14:43:31 +02:00
if ( 'post' != $this -> screen -> post_type )
$args [ 'post_type' ] = $this -> screen -> post_type ;
2010-11-25 02:39:34 +01:00
2012-09-22 00:52:54 +02:00
if ( 'attachment' == $this -> screen -> post_type )
return " <a href=' " . esc_url ( add_query_arg ( $args , 'upload.php' ) ) . " '> $count </a> " ;
2011-05-24 01:33:30 +02:00
return " <a href=' " . esc_url ( add_query_arg ( $args , 'edit.php' ) ) . " '> $count </a> " ;
2010-10-25 04:57:43 +02:00
}
function column_links ( $tag ) {
$count = number_format_i18n ( $tag -> count );
2010-12-27 17:57:19 +01:00
if ( $count )
$count = " <a href='link-manager.php?cat_id= $tag->term_id '> $count </a> " ;
2010-10-25 04:57:43 +02:00
return $count ;
}
function column_default ( $tag , $column_name ) {
2014-02-04 08:56:12 +01:00
/**
* Filter the displayed columns in the terms list table .
*
* The dynamic portion of the hook name , $this -> screen -> taxonomy ,
* refers to the slug of the current taxonomy .
*
* @ since 2.8 . 0
*
* @ param string $string Blank string .
* @ param string $column_name Name of the column .
* @ param int $term_id Term ID .
*/
2012-09-19 14:43:31 +02:00
return apply_filters ( " manage_ { $this -> screen -> taxonomy } _custom_column " , '' , $column_name , $tag -> term_id );
2010-10-25 04:57:43 +02:00
}
/**
* Outputs the hidden row displayed when inline editing
*
* @ since 3.1 . 0
*/
function inline_edit () {
2012-09-19 14:43:31 +02:00
$tax = get_taxonomy ( $this -> screen -> taxonomy );
2010-10-25 04:57:43 +02:00
if ( ! current_user_can ( $tax -> cap -> edit_terms ) )
return ;
2010-11-14 19:00:09 +01:00
?>
2010-10-25 04:57:43 +02:00
< form method = " get " action = " " >< table style = " display: none " >< tbody id = " inlineedit " >
2010-11-14 19:00:09 +01:00
< tr id = " inline-edit " class = " inline-edit-row " style = " display: none " >< td colspan = " <?php echo $this->get_column_count (); ?> " class = " colspanchange " >
2010-10-25 04:57:43 +02:00
< fieldset >< div class = " inline-edit-col " >
< h4 >< ? php _e ( 'Quick Edit' ); ?> </h4>
< label >
2011-06-11 00:13:26 +02:00
< span class = " title " >< ? php _ex ( 'Name' , 'term name' ); ?> </span>
2010-10-25 04:57:43 +02: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 19:00:09 +01:00
list ( $columns ) = $this -> get_column_info ();
2010-10-25 04:57:43 +02:00
foreach ( $columns as $column_name => $column_display_name ) {
if ( isset ( $core_columns [ $column_name ] ) )
continue ;
2010-12-17 14:20:17 +01:00
2014-02-04 08:56:12 +01:00
/** This action is documented in wp-admin/includes/class-wp-posts-list-table.php */
2012-09-19 14:43:31 +02:00
do_action ( 'quick_edit_custom_box' , $column_name , 'edit-tags' , $this -> screen -> taxonomy );
2010-10-25 04:57:43 +02:00
}
?>
< p class = " inline-edit-save submit " >
2013-05-28 06:53:46 +02:00
< a accesskey = " c " href = " #inline-edit " class = " cancel button-secondary alignleft " >< ? php _e ( 'Cancel' ); ?> </a>
< a accesskey = " s " href = " #inline-edit " class = " save button-primary alignright " >< ? php echo $tax -> labels -> update_item ; ?> </a>
2012-09-26 21:57:44 +02:00
< span class = " spinner " ></ span >
2010-10-25 04:57:43 +02:00
< span class = " error " style = " display:none; " ></ span >
< ? php wp_nonce_field ( 'taxinlineeditnonce' , '_inline_edit' , false ); ?>
2012-09-19 14:43:31 +02:00
< input type = " hidden " name = " taxonomy " value = " <?php echo esc_attr( $this->screen ->taxonomy ); ?> " />
< input type = " hidden " name = " post_type " value = " <?php echo esc_attr( $this->screen ->post_type ); ?> " />
2010-10-25 04:57:43 +02:00
< br class = " clear " />
</ p >
</ td ></ tr >
</ tbody ></ table ></ form >
< ? php
}
}