X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/38ca813a0e312e2768e5b9519f0415cd0aa84781..refs/tags/wordpress-4.4:/wp-admin/includes/class-wp-media-list-table.php
diff --git a/wp-admin/includes/class-wp-media-list-table.php b/wp-admin/includes/class-wp-media-list-table.php
index 531fe60f..3e0f41cf 100644
--- a/wp-admin/includes/class-wp-media-list-table.php
+++ b/wp-admin/includes/class-wp-media-list-table.php
@@ -1,37 +1,81 @@
detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );
+ /**
+ * Holds the number of pending comments for each post.
+ *
+ * @since 4.4.0
+ * @var array
+ * @access protected
+ */
+ protected $comment_pending_count = array();
+
+ private $detached;
+
+ private $is_trash;
+
+ /**
+ * Constructor.
+ *
+ * @since 3.1.0
+ * @access public
+ *
+ * @see WP_List_Table::__construct() for more information on default arguments.
+ *
+ * @param array $args An associative array of arguments.
+ */
+ public function __construct( $args = array() ) {
+ $this->detached = ( isset( $_REQUEST['attachment-filter'] ) && 'detached' === $_REQUEST['attachment-filter'] );
+
+ $this->modes = array(
+ 'list' => __( 'List View' ),
+ 'grid' => __( 'Grid View' )
+ );
parent::__construct( array(
- 'plural' => 'media'
+ 'plural' => 'media',
+ 'screen' => isset( $args['screen'] ) ? $args['screen'] : null,
) );
}
- function ajax_user_can() {
+ /**
+ *
+ * @return bool
+ */
+ public function ajax_user_can() {
return current_user_can('upload_files');
}
- function prepare_items() {
- global $lost, $wpdb, $wp_query, $post_mime_types, $avail_post_mime_types;
+ /**
+ *
+ * @global WP_Query $wp_query
+ * @global array $post_mime_types
+ * @global array $avail_post_mime_types
+ * @global string $mode
+ */
+ public function prepare_items() {
+ global $wp_query, $post_mime_types, $avail_post_mime_types, $mode;
- $q = $_REQUEST;
+ list( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $_REQUEST );
- if ( !empty( $lost ) )
- $q['post__in'] = implode( ',', $lost );
+ $this->is_trash = isset( $_REQUEST['attachment-filter'] ) && 'trash' === $_REQUEST['attachment-filter'];
- list( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $q );
-
- $this->is_trash = isset( $_REQUEST['status'] ) && 'trash' == $_REQUEST['status'];
+ $mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode'];
$this->set_pagination_args( array(
'total_items' => $wp_query->found_posts,
@@ -40,113 +84,250 @@ class WP_Media_List_Table extends WP_List_Table {
) );
}
- function get_views() {
- global $wpdb, $post_mime_types, $avail_post_mime_types;
+ /**
+ * @global array $post_mime_types
+ * @global array $avail_post_mime_types
+ * @return array
+ */
+ protected function get_views() {
+ global $post_mime_types, $avail_post_mime_types;
$type_links = array();
- $_num_posts = (array) wp_count_attachments();
- $_total_posts = array_sum($_num_posts) - $_num_posts['trash'];
- if ( !isset( $total_orphans ) )
- $total_orphans = $wpdb->get_var( "SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent < 1" );
- $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));
- foreach ( $matches as $type => $reals )
- foreach ( $reals as $real )
- $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];
-
- $class = ( empty($_GET['post_mime_type']) && !$this->detached && !isset($_GET['status']) ) ? ' class="current"' : '';
- $type_links['all'] = "" . sprintf( _nx( 'All (%s)', 'All (%s)', $_total_posts, 'uploaded files' ), number_format_i18n( $_total_posts ) ) . '';
- foreach ( $post_mime_types as $mime_type => $label ) {
- $class = '';
- if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )
- continue;
+ $filter = empty( $_GET['attachment-filter'] ) ? '' : $_GET['attachment-filter'];
- if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )
- $class = ' class="current"';
- if ( !empty( $num_posts[$mime_type] ) )
- $type_links[$mime_type] = "" . sprintf( translate_nooped_plural( $label[2], $num_posts[$mime_type] ), number_format_i18n( $num_posts[$mime_type] )) . '';
- }
- $type_links['detached'] = 'detached ? ' class="current"' : '' ) . '>' . sprintf( _nx( 'Unattached (%s)', 'Unattached (%s)', $total_orphans, 'detached files' ), number_format_i18n( $total_orphans ) ) . '';
+ $type_links['all'] = sprintf(
+ '',
+ selected( $filter, true, false ),
+ __( 'All media items' )
+ );
- if ( !empty($_num_posts['trash']) )
- $type_links['trash'] = '' . sprintf( _nx( 'Trash (%s)', 'Trash (%s)', $_num_posts['trash'], 'uploaded files' ), number_format_i18n( $_num_posts['trash'] ) ) . '';
+ foreach ( $post_mime_types as $mime_type => $label ) {
+ if ( ! wp_match_mime_types( $mime_type, $avail_post_mime_types ) ) {
+ continue;
+ }
+ $selected = selected(
+ $filter && 0 === strpos( $filter, 'post_mime_type:' ) &&
+ wp_match_mime_types( $mime_type, str_replace( 'post_mime_type:', '', $filter ) ),
+ true,
+ false
+ );
+
+ $type_links[$mime_type] = sprintf(
+ '',
+ esc_attr( $mime_type ),
+ $selected,
+ $label[0]
+ );
+ }
+ $type_links['detached'] = '';
+
+ if ( $this->is_trash || ( defined( 'MEDIA_TRASH') && MEDIA_TRASH ) ) {
+ $type_links['trash'] = sprintf(
+ '',
+ selected( 'trash' === $filter, true, false ),
+ __( 'Trash' )
+ );
+ }
return $type_links;
}
- function get_bulk_actions() {
+ /**
+ *
+ * @return array
+ */
+ protected function get_bulk_actions() {
$actions = array();
- $actions['delete'] = __( 'Delete Permanently' );
+ if ( MEDIA_TRASH ) {
+ if ( $this->is_trash ) {
+ $actions['untrash'] = __( 'Restore' );
+ $actions['delete'] = __( 'Delete Permanently' );
+ } else {
+ $actions['trash'] = __( 'Trash' );
+ }
+ } else {
+ $actions['delete'] = __( 'Delete Permanently' );
+ }
+
if ( $this->detached )
- $actions['attach'] = __( 'Attach to a post' );
+ $actions['attach'] = __( 'Attach' );
return $actions;
}
- function extra_tablenav( $which ) {
- global $post_type;
- $post_type_obj = get_post_type_object( $post_type );
+ /**
+ * @param string $which
+ */
+ protected function extra_tablenav( $which ) {
+ if ( 'bar' !== $which ) {
+ return;
+ }
?>
-
+
detached && !$this->is_trash ) {
- $this->months_dropdown( $post_type );
+ if ( ! is_singular() ) {
+ if ( ! $this->is_trash ) {
+ $this->months_dropdown( 'attachment' );
+ }
+
+ /** This action is documented in wp-admin/includes/class-wp-posts-list-table.php */
+ do_action( 'restrict_manage_posts', $this->screen->post_type );
- do_action( 'restrict_manage_posts' );
- submit_button( __( 'Filter' ), 'secondary', false, false, array( 'id' => 'post-query-submit' ) );
+ submit_button( __( 'Filter' ), 'button', 'filter_action', false, array( 'id' => 'post-query-submit' ) );
}
- if ( $this->detached ) {
- submit_button( __( 'Scan for lost attachments' ), 'secondary', 'find_detached', false );
- } elseif ( $this->is_trash && current_user_can( 'edit_others_posts' ) ) {
- submit_button( __( 'Empty Trash' ), 'button-secondary apply', 'delete_all', false );
+ if ( $this->is_trash && current_user_can( 'edit_others_posts' ) ) {
+ submit_button( __( 'Empty Trash' ), 'apply', 'delete_all', false );
} ?>
get_views();
+
+ $this->screen->render_screen_reader_content( 'heading_views' );
+?>
+
+
+ view_switcher( $mode ); ?>
+
+
+
+
+extra_tablenav( 'bar' );
+
+ /** This filter is documented in wp-admin/inclues/class-wp-list-table.php */
+ $views = apply_filters( "views_{$this->screen->id}", array() );
+
+ // Back compat for pre-4.0 view links.
+ if ( ! empty( $views ) ) {
+ echo '
';
+ foreach ( $views as $class => $view ) {
+ echo "- $view
";
+ }
+ echo '
';
+ }
+?>
+
+
+
+
+
+
+ ';
- $posts_columns['icon'] = '';
/* translators: column name */
$posts_columns['title'] = _x( 'File', 'column name' );
$posts_columns['author'] = __( 'Author' );
- //$posts_columns['tags'] = _x( 'Tags', 'column name' );
+
+ $taxonomies = get_taxonomies_for_attachments( 'objects' );
+ $taxonomies = wp_filter_object_list( $taxonomies, array( 'show_admin_column' => true ), 'and', 'name' );
+
+ /**
+ * Filter the taxonomy columns for attachments in the Media list table.
+ *
+ * @since 3.5.0
+ *
+ * @param array $taxonomies An array of registered taxonomies to show for attachments.
+ * @param string $post_type The post type. Default 'attachment'.
+ */
+ $taxonomies = apply_filters( 'manage_taxonomies_for_attachment_columns', $taxonomies, 'attachment' );
+ $taxonomies = array_filter( $taxonomies, 'taxonomy_exists' );
+
+ foreach ( $taxonomies as $taxonomy ) {
+ if ( 'category' === $taxonomy ) {
+ $column_key = 'categories';
+ } elseif ( 'post_tag' === $taxonomy ) {
+ $column_key = 'tags';
+ } else {
+ $column_key = 'taxonomy-' . $taxonomy;
+ }
+ $posts_columns[ $column_key ] = get_taxonomy( $taxonomy )->labels->name;
+ }
+
/* translators: column name */
if ( !$this->detached ) {
- $posts_columns['parent'] = _x( 'Attached to', 'column name' );
- $posts_columns['comments'] = '
';
+ $posts_columns['parent'] = _x( 'Uploaded to', 'column name' );
+ if ( post_type_supports( 'attachment', 'comments' ) )
+ $posts_columns['comments'] = '';
}
/* translators: column name */
$posts_columns['date'] = _x( 'Date', 'column name' );
- $posts_columns = apply_filters( 'manage_media_columns', $posts_columns, $this->detached );
-
- return $posts_columns;
+ /**
+ * Filter the Media list table columns.
+ *
+ * @since 2.5.0
+ *
+ * @param array $posts_columns An array of columns displayed in the Media list table.
+ * @param bool $detached Whether the list table contains media not attached
+ * to any posts. Default true.
+ */
+ return apply_filters( 'manage_media_columns', $posts_columns, $this->detached );
}
- function get_sortable_columns() {
+ /**
+ *
+ * @return array
+ */
+ protected function get_sortable_columns() {
return array(
'title' => 'title',
'author' => 'author',
@@ -156,191 +337,309 @@ class WP_Media_List_Table extends WP_List_Table {
);
}
- function display_rows() {
- global $post, $id;
-
- add_filter( 'the_title','esc_html' );
- $alt = '';
+ /**
+ * Handles the checkbox column output.
+ *
+ * @since 4.3.0
+ * @access public
+ *
+ * @param WP_Post $post The current WP_Post object.
+ */
+ public function column_cb( $post ) {
+ if ( current_user_can( 'edit_post', $post->ID ) ) { ?>
+
+
+ post_mime_type );
+
+ $title = _draft_or_post_title();
+ $thumb = wp_get_attachment_image( $post->ID, array( 60, 60 ), true, array( 'alt' => '' ) );
+ $link_start = $link_end = '';
+
+ if ( current_user_can( 'edit_post', $post->ID ) && ! $this->is_trash ) {
+ $link_start = '
';
+ $link_end = '';
+ }
- if ( $this->is_trash && $post->post_status != 'trash'
- || !$this->is_trash && $post->post_status == 'trash' )
- continue;
+ $class = $thumb ? ' class="has-media-icon"' : '';
+
+ ?>
+
>
+
+
+
+
+
+
+
+
+
+
+
+
+ ID );
+ echo wp_basename( $file );
+ ?>
+
+ post_author ) ? 'self' : 'other';
- $att_title = _draft_or_post_title();
-?>
-
post_status ); ?>' valign="top">
-%s',
+ esc_url( add_query_arg( array( 'author' => get_the_author_meta('ID') ), 'upload.php' ) ),
+ get_the_author()
+ );
+ }
-list( $columns, $hidden ) = $this->get_column_info();
-foreach ( $columns as $column_name => $column_display_name ) {
- $class = "class='$column_name column-$column_name'";
+ /**
+ * Handles the description column output.
+ *
+ * @since 4.3.0
+ * @access public
+ *
+ * @param WP_Post $post The current WP_Post object.
+ */
+ public function column_desc( $post ) {
+ echo has_excerpt() ? $post->post_excerpt : '';
+ }
- $style = '';
- if ( in_array( $column_name, $hidden ) )
- $style = ' style="display:none;"';
+ /**
+ * Handles the date column output.
+ *
+ * @since 4.3.0
+ * @access public
+ *
+ * @param WP_Post $post The current WP_Post object.
+ */
+ public function column_date( $post ) {
+ if ( '0000-00-00 00:00:00' === $post->post_date ) {
+ $h_time = __( 'Unpublished' );
+ } else {
+ $m_time = $post->post_date;
+ $time = get_post_time( 'G', true, $post, false );
+ if ( ( abs( $t_diff = time() - $time ) ) < DAY_IN_SECONDS ) {
+ if ( $t_diff < 0 ) {
+ $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );
+ } else {
+ $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );
+ }
+ } else {
+ $h_time = mysql2date( __( 'Y/m/d' ), $m_time );
+ }
+ }
- $attributes = $class . $style;
+ echo $h_time;
+ }
- switch ( $column_name ) {
+ /**
+ * Handles the parent column output.
+ *
+ * @since 4.3.0
+ * @access public
+ *
+ * @param WP_Post $post The current WP_Post object.
+ */
+ public function column_parent( $post ) {
+ $user_can_edit = current_user_can( 'edit_post', $post->ID );
- case 'cb':
-?>
- ID ) ) { ?> |
-post_parent > 0 ) {
+ $parent = get_post( $post->post_parent );
+ } else {
+ $parent = false;
+ }
- case 'icon':
- $attributes = 'class="column-icon media-icon"' . $style;
+ if ( $parent ) {
+ $title = _draft_or_post_title( $post->post_parent );
+ $parent_type = get_post_type_object( $parent->post_type );
?>
- >ID, array( 80, 60 ), true ) ) {
- if ( $this->is_trash ) {
- echo $thumb;
- } else {
-?>
-
-
-
+
+ show_ui && current_user_can( 'edit_post', $post->post_parent ) ) { ?>
+
+
+
+ $post->post_parent,
+ 'media[]' => $post->ID,
+ '_wpnonce' => wp_create_nonce( 'bulk-' . $this->_args['plural'] )
+ ), 'upload.php' ); ?>
+
+
+
+
+
+
- |
-';
+
+ if ( isset( $this->comment_pending_count[ $post->ID ] ) ) {
+ $pending_comments = $this->comment_pending_count[ $post->ID ];
+ } else {
+ $pending_comments = get_pending_comments_num( $post->ID );
+ }
- case 'title':
-?>
- >is_trash ) echo $att_title; else { ?>
-
-ID ), $matches ) )
- echo esc_html( strtoupper( $matches[1] ) );
- else
- echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) );
-?>
-
-row_actions( $this->_get_row_actions( $post, $att_title ) );
-?>
- |
-comments_bubble( $post->ID, $pending_comments );
- case 'author':
-?>
- > |
-';
+ }
- case 'tags':
-?>
- >slug'> " . esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'post_tag', 'display' ) ) . "";
- echo join( ', ', $out );
+ /**
+ * Handles output for the default column.
+ *
+ * @since 4.3.0
+ * @access public
+ *
+ * @param WP_Post $post The current WP_Post object.
+ * @param string $column_name Current column name.
+ */
+ public function column_default( $post, $column_name ) {
+ if ( 'categories' === $column_name ) {
+ $taxonomy = 'category';
+ } elseif ( 'tags' === $column_name ) {
+ $taxonomy = 'post_tag';
+ } elseif ( 0 === strpos( $column_name, 'taxonomy-' ) ) {
+ $taxonomy = substr( $column_name, 9 );
} else {
- _e( 'No Tags' );
+ $taxonomy = false;
}
-?>
- |
-
- >post_excerpt : ''; ?> |
-post_date && 'date' == $column_name ) {
- $t_time = $h_time = __( 'Unpublished' );
- } else {
- $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );
- $m_time = $post->post_date;
- $time = get_post_time( 'G', true, $post, false );
- if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {
- if ( $t_diff < 0 )
- $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );
- else
- $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );
+ if ( $taxonomy ) {
+ $terms = get_the_terms( $post->ID, $taxonomy );
+ if ( is_array( $terms ) ) {
+ $out = array();
+ foreach ( $terms as $t ) {
+ $posts_in_term_qv = array();
+ $posts_in_term_qv['taxonomy'] = $taxonomy;
+ $posts_in_term_qv['term'] = $t->slug;
+
+ $out[] = sprintf( '%s',
+ esc_url( add_query_arg( $posts_in_term_qv, 'upload.php' ) ),
+ esc_html( sanitize_term_field( 'name', $t->name, $t->term_id, $taxonomy, 'display' ) )
+ );
+ }
+ /* translators: used between list items, there is a space after the comma */
+ echo join( __( ', ' ), $out );
} else {
- $h_time = mysql2date( __( 'Y/m/d' ), $m_time );
+ echo '—' . get_taxonomy( $taxonomy )->labels->no_terms . '';
}
- }
-?>
- > |
-post_parent > 0 ) {
- if ( get_post( $post->post_parent ) ) {
- $title =_draft_or_post_title( $post->post_parent );
- }
-?>
- >
- ,
-
- |
-
- >
- |
-
- >
-
-ID );
+ /**
+ * Fires for each custom column in the Media list table.
+ *
+ * Custom columns are registered using the {@see 'manage_media_columns'} filter.
+ *
+ * @since 2.5.0
+ *
+ * @param string $column_name Name of the custom column.
+ * @param int $post_id Attachment ID.
+ */
+ do_action( 'manage_media_custom_column', $column_name, $post->ID );
+ }
- $this->comments_bubble( $post->ID, $pending_comments );
-?>
-
- |
-
- >
-
- |
-posts, 'ID' );
+ reset( $wp_query->posts );
+
+ $this->comment_pending_count = get_pending_comments_num( $post_ids );
+
+ add_filter( 'the_title','esc_html' );
+
+ while ( have_posts() ) : the_post();
+ if (
+ ( $this->is_trash && $post->post_status != 'trash' )
+ || ( ! $this->is_trash && $post->post_status === 'trash' )
+ ) {
+ continue;
+ }
+ $post_owner = ( get_current_user_id() == $post->post_author ) ? 'self' : 'other';
+ ?>
+
+ single_row_columns( $post ); ?>
+
+
-
-detached ) {
if ( current_user_can( 'edit_post', $post->ID ) )
- $actions['edit'] = '
' . __( 'Edit' ) . '';
+ $actions['edit'] = '
' . __( 'Edit' ) . '';
if ( current_user_can( 'delete_post', $post->ID ) )
if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) {
- $actions['trash'] = "
ID ) . "'>" . __( 'Trash' ) . "";
+ $actions['trash'] = "
ID ) . "'>" . __( 'Trash' ) . "";
} else {
$delete_ays = !MEDIA_TRASH ? " onclick='return showNotice.warn();'" : '';
- $actions['delete'] = "
ID ) . "'>" . __( 'Delete Permanently' ) . "";
+ $actions['delete'] = "
ID ) . "'>" . __( 'Delete Permanently' ) . "";
}
$actions['view'] = '
' . __( 'View' ) . '';
if ( current_user_can( 'edit_post', $post->ID ) )
@@ -348,15 +647,15 @@ foreach ( $columns as $column_name => $column_display_name ) {
}
else {
if ( current_user_can( 'edit_post', $post->ID ) && !$this->is_trash )
- $actions['edit'] = '
' . __( 'Edit' ) . '';
+ $actions['edit'] = '
' . __( 'Edit' ) . '';
if ( current_user_can( 'delete_post', $post->ID ) ) {
if ( $this->is_trash )
- $actions['untrash'] = "
ID ) . "'>" . __( 'Restore' ) . "";
+ $actions['untrash'] = "
ID ) . "'>" . __( 'Restore' ) . "";
elseif ( EMPTY_TRASH_DAYS && MEDIA_TRASH )
- $actions['trash'] = "
ID ) . "'>" . __( 'Trash' ) . "";
+ $actions['trash'] = "
ID ) . "'>" . __( 'Trash' ) . "";
if ( $this->is_trash || !EMPTY_TRASH_DAYS || !MEDIA_TRASH ) {
$delete_ays = ( !$this->is_trash && !MEDIA_TRASH ) ? " onclick='return showNotice.warn();'" : '';
- $actions['delete'] = "
ID ) . "'>" . __( 'Delete Permanently' ) . "";
+ $actions['delete'] = "
ID ) . "'>" . __( 'Delete Permanently' ) . "";
}
}
if ( !$this->is_trash ) {
@@ -365,10 +664,37 @@ foreach ( $columns as $column_name => $column_display_name ) {
}
}
- $actions = apply_filters( 'media_row_actions', $actions, $post, $this->detached );
+ /**
+ * Filter the action links for each attachment in the Media list table.
+ *
+ * @since 2.8.0
+ *
+ * @param array $actions An array of action links for each attachment.
+ * Default 'Edit', 'Delete Permanently', 'View'.
+ * @param WP_Post $post WP_Post object for the current attachment.
+ * @param bool $detached Whether the list table contains media not attached
+ * to any posts. Default true.
+ */
+ return apply_filters( 'media_row_actions', $actions, $post, $this->detached );
+ }
- return $actions;
+ /**
+ * Generates and displays row action links.
+ *
+ * @since 4.3.0
+ * @access protected
+ *
+ * @param object $post Attachment being acted upon.
+ * @param string $column_name Current column name.
+ * @param string $primary Primary column name.
+ * @return string Row actions output for media attachments.
+ */
+ protected function handle_row_actions( $post, $column_name, $primary ) {
+ if ( $primary !== $column_name ) {
+ return '';
+ }
+
+ $att_title = _draft_or_post_title();
+ return $this->row_actions( $this->_get_row_actions( $post, $att_title ) );
}
}
-
-?>