'posts',
'screen' => \WP_Screen::get( 'edit' ),
)
);
}
/**
* Prepares the list of items for displaying.
*/
public function prepare_items() {
global $mode, $avail_post_stati, $wp_query, $per_page;
$mode = 'excerpt';
$post_data = array(
'post_type' => 'post',
'post_format' => 'status',
'post_status' => 'private',
'post_author' => get_current_user_id(),
);
$avail_post_stati = get_available_post_statuses( $post_data['post_type'] );
if ( ! empty( $_REQUEST['post_status'] ) && in_array( $_REQUEST['post_status'], $avail_post_stati ) ) {
$post_data['post_status'] = $_REQUEST['post_status'];
} elseif ( isset( $_REQUEST['all_posts'] ) ) {
unset( $post_data['post_status'] );
}
wp( $post_data );
$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 );
$this->is_trash = 'trash' === $post_data['post_status'];
}
/**
* Gets the post status counts.
*
* @param string $post_type The post type.
*
* @return object The counts.
*/
protected function get_post_status_counts( $post_type ) {
global $wpdb;
$counts = array();
$post_status_counts = $wpdb->get_results(
$wpdb->prepare(
"SELECT posts.post_status, COUNT(posts.ID) AS count
FROM {$wpdb->posts} AS posts
JOIN {$wpdb->term_relationships} AS relationships
JOIN {$wpdb->term_taxonomy} AS taxonomy
JOIN {$wpdb->terms} AS terms
WHERE posts.post_author = %d
AND posts.post_type = %s
AND relationships.object_id = posts.ID
AND relationships.term_taxonomy_id = taxonomy.term_taxonomy_id
AND taxonomy.taxonomy = 'post_format'
AND terms.slug = 'post-format-status'
GROUP BY posts.post_status",
get_current_user_id(),
$post_type
)
);
foreach ( $post_status_counts as $row ) {
$counts[ $row->post_status ] = $row->count;
}
return (object) $counts;
}
/**
* The no items text.
*/
public function no_items() {
if (
( ! isset( $_REQUEST['post_status'] ) && ! isset( $_REQUEST['all_posts'] ) )
|| ( isset( $_REQUEST['post_status'] ) && 'draft' === $_REQUEST['post_status'] )
) {
esc_html_e( 'No unpublished automatically generated statuses found.', 'friends' );
} else {
esc_html_e( 'No automatically generated statuses found.', 'friends' );
}
}
/**
* Helper to create links to edit.php with params.
*
* @param string[] $args Associative array of URL parameters for the link.
* @param string $label Link text.
* @param string $class_attribute Optional. Class attribute. Default empty string.
* @return string The formatted link string.
*/
protected function get_edit_link( $args, $label, $class_attribute = '' ) {
$args = array_merge(
array(
'post_type' => 'post',
'post_format' => 'status',
'post_author' => get_current_user_id(),
),
$args
);
$url = add_query_arg( $args, self_admin_url( 'admin.php?page=friends-auto-status' ) );
$url = remove_query_arg( 'post_type', $url );
$class_html = '';
$aria_current = '';
if ( ! empty( $class_attribute ) ) {
$class_html = sprintf(
' class="%s"',
esc_attr( $class_attribute )
);
if ( 'current' === $class_attribute ) {
$aria_current = ' aria-current="page"';
}
}
return sprintf(
'%s',
esc_url( $url ),
$class_html,
$aria_current,
$label
);
}
/**
* Handles the title column output.
*
* @global string $mode List table view mode.
*
* @param \WP_Post $post The current \WP_Post object.
*/
public function column_title( $post ) {
if ( current_user_can( 'read_post', $post->ID ) ) {
echo wp_kses(
get_the_content(),
array(
'img' => array( 'src' => array() ),
'a' => array( 'href' => array() ),
)
);
}
get_inline_data( $post );
}
/**
* Gets the list of views available on this table.
*
* The format is an associative array:
* - `'id' => 'link'`
*
* @return array
*/
protected function get_views() {
global $locked_post_status, $avail_post_stati;
$post_type = $this->screen->post_type;
if ( ! empty( $locked_post_status ) ) {
return array();
}
$status_links = array();
$num_posts = $this->get_post_status_counts( $post_type );
$total_posts = array_sum( (array) $num_posts );
$class = '';
$current_user_id = get_current_user_id();
$all_args = array(
'post_type' => $post_type,
'all_posts' => 1,
);
$mine = '';
// 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 ) {
if ( isset( $num_posts->$state ) ) {
$total_posts -= $num_posts->$state;
}
}
if ( empty( $class ) && ( $this->is_base_request() || isset( $_REQUEST['all_posts'] ) ) ) {
$class = 'current';
}
$all_inner_html = sprintf(
/* translators: %s: Number of posts. */
_nx( // phpcs:ignore WordPress.WP.I18n.MissingArgDomain
'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, true ) || empty( $num_posts->$status_name ) ) {
continue;
}
if ( isset( $_REQUEST['post_status'] ) && $status_name === $_REQUEST['post_status'] ) {
$class = 'current';
} elseif ( ! isset( $_REQUEST['post_status'] ) && ! isset( $_REQUEST['all_posts'] ) && 'draft' === $status_name ) {
$class = 'current';
}
$status_args = array(
'post_status' => $status_name,
'post_type' => $post_type,
);
$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'] ) ? 'current' : '';
$sticky_args = array(
'post_type' => $post_type,
'show_sticky' => 1,
);
$sticky_inner_html = sprintf(
/* translators: %s: Number of posts. */
_nx( // phpcs:ignore WordPress.WP.I18n.MissingArgDomain
'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 ), true );
$status_links = array_merge( array_slice( $status_links, 0, $split ), $sticky_link, array_slice( $status_links, $split ) );
}
return $status_links;
}
/**
* Retrieves the list of bulk actions available for this table.
*
* @return array
*/
protected function get_bulk_actions() {
$actions = array();
$post_type_obj = get_post_type_object( $this->screen->post_type );
if ( current_user_can( $post_type_obj->cap->publish_posts ) ) {
$actions['publish'] = __( 'Publish' ); // phpcs:ignore WordPress.WP.I18n.MissingArgDomain
}
if ( current_user_can( $post_type_obj->cap->edit_posts ) ) {
if ( $this->is_trash ) {
$actions['untrash'] = __( 'Restore' ); // phpcs:ignore WordPress.WP.I18n.MissingArgDomain
} else {
if ( apply_filters( 'friends_debug', false ) ) {
$actions['edit'] = __( 'Edit' ); // phpcs:ignore WordPress.WP.I18n.MissingArgDomain
}
$actions['publish-private'] = __( 'Publish Privately' ); // phpcs:ignore WordPress.WP.I18n.MissingArgDomain
}
}
if ( current_user_can( $post_type_obj->cap->delete_posts ) ) {
if ( $this->is_trash || ! EMPTY_TRASH_DAYS ) {
$actions['delete'] = __( 'Delete permanently' ); // phpcs:ignore WordPress.WP.I18n.MissingArgDomain
} else {
$actions['trash'] = __( 'Move to Trash' ); // phpcs:ignore WordPress.WP.I18n.MissingArgDomain
}
}
return $actions;
}
/**
* Generates the extra table navigation above or below the table
*
* @param string $which The location of the bulk actions: 'top' or 'bottom'.
*/
protected function extra_tablenav( $which ) {
}
}