X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/a349837896628462bf8c9bdc27d1477a10fe03eb..607b7e02d77e7326161e8ec15639052d2040f745:/wp-admin/includes/class-wp-posts-list-table.php diff --git a/wp-admin/includes/class-wp-posts-list-table.php b/wp-admin/includes/class-wp-posts-list-table.php index 50054111..7ef790e3 100644 --- a/wp-admin/includes/class-wp-posts-list-table.php +++ b/wp-admin/includes/class-wp-posts-list-table.php @@ -1,40 +1,48 @@ isset( $args['screen'] ) ? $args['screen'] : null, ) ); - $post_type = $this->screen->post_type; + $post_type = $this->screen->post_type; $post_type_object = get_post_type_object( $post_type ); - if ( !current_user_can( $post_type_object->cap->edit_others_posts ) ) { - $exclude_states = get_post_stati( array( 'show_in_admin_all_list' => false ) ); - $this->user_posts_count = $wpdb->get_var( $wpdb->prepare( " - SELECT COUNT( 1 ) FROM $wpdb->posts - WHERE post_type = %s AND post_status NOT IN ( '" . implode( "','", $exclude_states ) . "' ) - AND post_author = %d - ", $post_type, get_current_user_id() ) ); - - if ( $this->user_posts_count && empty( $_REQUEST['post_status'] ) && empty( $_REQUEST['all_posts'] ) && empty( $_REQUEST['author'] ) && empty( $_REQUEST['show_sticky'] ) ) - $_GET['author'] = get_current_user_id(); + $exclude_states = get_post_stati( array( + 'show_in_admin_all_list' => false, + ) ); + $this->user_posts_count = intval( $wpdb->get_var( $wpdb->prepare( " + SELECT COUNT( 1 ) + FROM $wpdb->posts + WHERE post_type = %s + AND post_status NOT IN ( '" . implode( "','", $exclude_states ) . "' ) + AND post_author = %d + ", $post_type, get_current_user_id() ) ) ); + + if ( $this->user_posts_count && ! current_user_can( $post_type_object->cap->edit_others_posts ) && empty( $_REQUEST['post_status'] ) && empty( $_REQUEST['all_posts'] ) && empty( $_REQUEST['author'] ) && empty( $_REQUEST['show_sticky'] ) ) { + $_GET['author'] = get_current_user_id(); } - if ( 'post' == $post_type && $sticky_posts = get_option( 'sticky_posts' ) ) { + if ( 'post' === $post_type && $sticky_posts = get_option( 'sticky_posts' ) ) { $sticky_posts = implode( ', ', array_map( 'absint', (array) $sticky_posts ) ); $this->sticky_posts_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT( 1 ) FROM $wpdb->posts WHERE post_type = %s AND post_status NOT IN ('trash', 'auto-draft') AND ID IN ($sticky_posts)", $post_type ) ); } } - function ajax_user_can() { + /** + * Sets whether the table layout should be hierarchical or not. + * + * @since 4.2.0 + * + * @param bool $display Whether the table layout should be hierarchical. + */ + public function set_hierarchical_display( $display ) { + $this->hierarchical_display = $display; + } + + /** + * + * @return bool + */ + public function ajax_user_can() { return current_user_can( get_post_type_object( $this->screen->post_type )->cap->edit_posts ); } - function prepare_items() { + /** + * + * @global array $avail_post_stati + * @global WP_Query $wp_query + * @global int $per_page + * @global string $mode + */ + public function prepare_items() { global $avail_post_stati, $wp_query, $per_page, $mode; + // is going to call wp() $avail_post_stati = wp_edit_posts_query(); - $this->hierarchical_display = ( is_post_type_hierarchical( $this->screen->post_type ) && 'menu_order title' == $wp_query->query['orderby'] ); - - $total_items = $this->hierarchical_display ? $wp_query->post_count : $wp_query->found_posts; + $this->set_hierarchical_display( is_post_type_hierarchical( $this->screen->post_type ) && 'menu_order title' === $wp_query->query['orderby'] ); $post_type = $this->screen->post_type; $per_page = $this->get_items_per_page( 'edit_' . $post_type . '_per_page' ); + + /** This filter is documented in wp-admin/includes/post.php */ $per_page = apply_filters( 'edit_posts_per_page', $per_page, $post_type ); - if ( $this->hierarchical_display ) - $total_pages = ceil( $total_items / $per_page ); - else - $total_pages = $wp_query->max_num_pages; + if ( $this->hierarchical_display ) { + $total_items = $wp_query->post_count; + } elseif ( $wp_query->found_posts || $this->get_pagenum() === 1 ) { + $total_items = $wp_query->found_posts; + } else { + $post_counts = (array) wp_count_posts( $post_type, 'readable' ); + + if ( isset( $_REQUEST['post_status'] ) && in_array( $_REQUEST['post_status'] , $avail_post_stati ) ) { + $total_items = $post_counts[ $_REQUEST['post_status'] ]; + } elseif ( isset( $_REQUEST['show_sticky'] ) && $_REQUEST['show_sticky'] ) { + $total_items = $this->sticky_posts_count; + } elseif ( isset( $_GET['author'] ) && $_GET['author'] == get_current_user_id() ) { + $total_items = $this->user_posts_count; + } else { + $total_items = array_sum( $post_counts ); + + // Subtract post types that are not included in the admin all list. + foreach ( get_post_stati( array( 'show_in_admin_all_list' => false ) ) as $state ) { + $total_items -= $post_counts[ $state ]; + } + } + } - $mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode']; + if ( ! empty( $_REQUEST['mode'] ) ) { + $mode = $_REQUEST['mode'] === 'excerpt' ? 'excerpt' : 'list'; + set_user_setting( 'posts_list_mode', $mode ); + } else { + $mode = get_user_setting( 'posts_list_mode', 'list' ); + } - $this->is_trash = isset( $_REQUEST['post_status'] ) && $_REQUEST['post_status'] == 'trash'; + $this->is_trash = isset( $_REQUEST['post_status'] ) && $_REQUEST['post_status'] === 'trash'; $this->set_pagination_args( array( 'total_items' => $total_items, - 'total_pages' => $total_pages, 'per_page' => $per_page ) ); } - function has_items() { + /** + * + * @return bool + */ + public function has_items() { return have_posts(); } - function no_items() { - if ( isset( $_REQUEST['post_status'] ) && 'trash' == $_REQUEST['post_status'] ) + /** + * @access public + */ + public function no_items() { + if ( isset( $_REQUEST['post_status'] ) && 'trash' === $_REQUEST['post_status'] ) echo get_post_type_object( $this->screen->post_type )->labels->not_found_in_trash; else echo get_post_type_object( $this->screen->post_type )->labels->not_found; } - function get_views() { + /** + * Determine if the current view is the "All" view. + * + * @since 4.2.0 + * + * @return bool Whether the current view is the "All" view. + */ + protected function is_base_request() { + $vars = $_GET; + unset( $vars['paged'] ); + + if ( empty( $vars ) ) { + return true; + } elseif ( 1 === count( $vars ) && ! empty( $vars['post_type'] ) ) { + return $this->screen->post_type === $vars['post_type']; + } + + return 1 === count( $vars ) && ! empty( $vars['mode'] ); + } + + /** + * Helper to create links to edit.php with params. + * + * @since 4.4.0 + * @access protected + * + * @param array $args URL parameters for the link. + * @param string $label Link text. + * @param string $class Optional. Class attribute. Default empty string. + * @return string The formatted link string. + */ + protected function get_edit_link( $args, $label, $class = '' ) { + $url = add_query_arg( $args, 'edit.php' ); + + $class_html = ''; + if ( ! empty( $class ) ) { + $class_html = sprintf( + ' class="%s"', + esc_attr( $class ) + ); + } + + return sprintf( + '%s', + esc_url( $url ), + $class_html, + $label + ); + } + + /** + * + * @global array $locked_post_status This seems to be deprecated. + * @global array $avail_post_stati + * @return array + */ + protected function get_views() { global $locked_post_status, $avail_post_stati; $post_type = $this->screen->post_type; @@ -128,48 +271,110 @@ class WP_Posts_List_Table extends WP_List_Table { $status_links = array(); $num_posts = wp_count_posts( $post_type, 'readable' ); + $total_posts = array_sum( (array) $num_posts ); $class = ''; - $allposts = ''; $current_user_id = get_current_user_id(); + $all_args = array( 'post_type' => $post_type ); + $mine = ''; - if ( $this->user_posts_count ) { - if ( isset( $_GET['author'] ) && ( $_GET['author'] == $current_user_id ) ) - $class = ' class="current"'; - $status_links['mine'] = "" . sprintf( _nx( 'Mine (%s)', 'Mine (%s)', $this->user_posts_count, 'posts' ), number_format_i18n( $this->user_posts_count ) ) . ''; - $allposts = '&all_posts=1'; + // Subtract post types that are not included in the admin all list. + foreach ( get_post_stati( array( 'show_in_admin_all_list' => false ) ) as $state ) { + $total_posts -= $num_posts->$state; } - $total_posts = array_sum( (array) $num_posts ); + if ( $this->user_posts_count && $this->user_posts_count !== $total_posts ) { + if ( isset( $_GET['author'] ) && ( $_GET['author'] == $current_user_id ) ) { + $class = 'current'; + } - // Subtract post types that are not included in the admin all list. - foreach ( get_post_stati( array('show_in_admin_all_list' => false) ) as $state ) - $total_posts -= $num_posts->$state; + $mine_args = array( + 'post_type' => $post_type, + 'author' => $current_user_id + ); + + $mine_inner_html = sprintf( + _nx( + 'Mine (%s)', + 'Mine (%s)', + $this->user_posts_count, + 'posts' + ), + number_format_i18n( $this->user_posts_count ) + ); - $class = empty( $class ) && empty( $_REQUEST['post_status'] ) && empty( $_REQUEST['show_sticky'] ) ? ' class="current"' : ''; - $status_links['all'] = "" . sprintf( _nx( 'All (%s)', 'All (%s)', $total_posts, 'posts' ), number_format_i18n( $total_posts ) ) . ''; + $mine = $this->get_edit_link( $mine_args, $mine_inner_html, $class ); + + $all_args['all_posts'] = 1; + $class = ''; + } + + if ( empty( $class ) && ( $this->is_base_request() || isset( $_REQUEST['all_posts'] ) ) ) { + $class = 'current'; + } + + $all_inner_html = sprintf( + _nx( + 'All (%s)', + 'All (%s)', + $total_posts, + 'posts' + ), + number_format_i18n( $total_posts ) + ); + + $status_links['all'] = $this->get_edit_link( $all_args, $all_inner_html, $class ); + if ( $mine ) { + $status_links['mine'] = $mine; + } foreach ( get_post_stati(array('show_in_admin_status_list' => true), 'objects') as $status ) { $class = ''; $status_name = $status->name; - if ( !in_array( $status_name, $avail_post_stati ) ) + if ( ! in_array( $status_name, $avail_post_stati ) || empty( $num_posts->$status_name ) ) { continue; + } - if ( empty( $num_posts->$status_name ) ) - continue; + if ( isset($_REQUEST['post_status']) && $status_name === $_REQUEST['post_status'] ) { + $class = 'current'; + } - if ( isset($_REQUEST['post_status']) && $status_name == $_REQUEST['post_status'] ) - $class = ' class="current"'; + $status_args = array( + 'post_status' => $status_name, + 'post_type' => $post_type, + ); - $status_links[$status_name] = "" . sprintf( translate_nooped_plural( $status->label_count, $num_posts->$status_name ), number_format_i18n( $num_posts->$status_name ) ) . ''; + $status_label = sprintf( + translate_nooped_plural( $status->label_count, $num_posts->$status_name ), + number_format_i18n( $num_posts->$status_name ) + ); + + $status_links[ $status_name ] = $this->get_edit_link( $status_args, $status_label, $class ); } if ( ! empty( $this->sticky_posts_count ) ) { - $class = ! empty( $_REQUEST['show_sticky'] ) ? ' class="current"' : ''; - - $sticky_link = array( 'sticky' => "" . sprintf( _nx( 'Sticky (%s)', 'Sticky (%s)', $this->sticky_posts_count, 'posts' ), number_format_i18n( $this->sticky_posts_count ) ) . '' ); + $class = ! empty( $_REQUEST['show_sticky'] ) ? 'current' : ''; + + $sticky_args = array( + 'post_type' => $post_type, + 'show_sticky' => 1 + ); + + $sticky_inner_html = sprintf( + _nx( + 'Sticky (%s)', + 'Sticky (%s)', + $this->sticky_posts_count, + 'posts' + ), + number_format_i18n( $this->sticky_posts_count ) + ); + + $sticky_link = array( + 'sticky' => $this->get_edit_link( $sticky_args, $sticky_inner_html, $class ) + ); // Sticky comes after Publish, or if not listed, after All. $split = 1 + array_search( ( isset( $status_links['publish'] ) ? 'publish' : 'all' ), array_keys( $status_links ) ); @@ -179,44 +384,102 @@ class WP_Posts_List_Table extends WP_List_Table { return $status_links; } - function get_bulk_actions() { + /** + * + * @return array + */ + protected function get_bulk_actions() { $actions = array(); + $post_type_obj = get_post_type_object( $this->screen->post_type ); - if ( $this->is_trash ) - $actions['untrash'] = __( 'Restore' ); - else - $actions['edit'] = __( 'Edit' ); + if ( current_user_can( $post_type_obj->cap->edit_posts ) ) { + if ( $this->is_trash ) { + $actions['untrash'] = __( 'Restore' ); + } else { + $actions['edit'] = __( 'Edit' ); + } + } - if ( $this->is_trash || !EMPTY_TRASH_DAYS ) - $actions['delete'] = __( 'Delete Permanently' ); - else - $actions['trash'] = __( 'Move to Trash' ); + if ( current_user_can( $post_type_obj->cap->delete_posts ) ) { + if ( $this->is_trash || ! EMPTY_TRASH_DAYS ) { + $actions['delete'] = __( 'Delete Permanently' ); + } else { + $actions['trash'] = __( 'Move to Trash' ); + } + } return $actions; } - function extra_tablenav( $which ) { + /** + * Displays a categories drop-down for filtering on the Posts list table. + * + * @since 4.6.0 + * @access protected + * + * @global int $cat Currently selected category. + * + * @param string $post_type Post type slug. + */ + protected function categories_dropdown( $post_type ) { global $cat; + + /** + * Filters whether to remove the 'Categories' drop-down from the post list table. + * + * @since 4.6.0 + * + * @param bool $disable Whether to disable the categories drop-down. Default false. + * @param string $post_type Post type slug. + */ + if ( false !== apply_filters( 'disable_categories_dropdown', false, $post_type ) ) { + return; + } + + if ( is_object_in_taxonomy( $post_type, 'category' ) ) { + $dropdown_options = array( + 'show_option_all' => get_taxonomy( 'category' )->labels->all_items, + 'hide_empty' => 0, + 'hierarchical' => 1, + 'show_count' => 0, + 'orderby' => 'name', + 'selected' => $cat + ); + + echo ''; + wp_dropdown_categories( $dropdown_options ); + } + } + + /** + * @param string $which + */ + protected function extra_tablenav( $which ) { ?>