BP_Groups_List_Table
List table class for the Groups component admin page.
Description Description
Source Source
File: bp-groups/classes/class-bp-groups-list-table.php
class BP_Groups_List_Table extends WP_List_Table { /** * The type of view currently being displayed. * * E.g. "All", "Pending", "Approved", "Spam"... * * @since 1.7.0 * @var string */ public $view = 'all'; /** * Group counts for each group type. * * @since 1.7.0 * @var int */ public $group_counts = 0; /** * Multidimensional array of group visibility (status) types and their groups. * * @link https://buddypress.trac.wordpress.org/ticket/6277 * @var array */ public $group_type_ids = array(); /** * Constructor * * @since 1.7.0 */ public function __construct() { // Define singular and plural labels, as well as whether we support AJAX. parent::__construct( array( 'ajax' => false, 'plural' => 'groups', 'singular' => 'group', ) ); // Add Group Type column and bulk change controls. if ( bp_groups_get_group_types() ) { // Add Group Type column. add_filter( 'bp_groups_list_table_get_columns', array( $this, 'add_type_column' ) ); add_filter( 'bp_groups_admin_get_group_custom_column', array( $this, 'column_content_group_type' ), 10, 3 ); // Add the bulk change select. add_action( 'bp_groups_list_table_after_bulk_actions', array( $this, 'add_group_type_bulk_change_select' ) ); } } /** * Set up items for display in the list table. * * Handles filtering of data, sorting, pagination, and any other data * manipulation required prior to rendering. * * @since 1.7.0 */ public function prepare_items() { global $groups_template; $screen = get_current_screen(); // Option defaults. $include_id = false; $search_terms = false; // Set current page. $page = $this->get_pagenum(); // Set per page from the screen options. $per_page = $this->get_items_per_page( str_replace( '-', '_', "{$screen->id}_per_page" ) ); // Sort order. $order = 'DESC'; if ( !empty( $_REQUEST['order'] ) ) { $order = ( 'desc' == strtolower( $_REQUEST['order'] ) ) ? 'DESC' : 'ASC'; } // Order by - default to newest. $orderby = 'last_activity'; if ( ! empty( $_REQUEST['orderby'] ) ) { switch ( $_REQUEST['orderby'] ) { case 'name' : $orderby = 'name'; break; case 'id' : $orderby = 'date_created'; break; case 'members' : $orderby = 'total_member_count'; break; case 'last_active' : $orderby = 'last_activity'; break; } } // Are we doing a search? if ( !empty( $_REQUEST['s'] ) ) $search_terms = $_REQUEST['s']; // Check if user has clicked on a specific group (if so, fetch only that group). if ( !empty( $_REQUEST['gid'] ) ) $include_id = (int) $_REQUEST['gid']; // Set the current view. if ( isset( $_GET['group_status'] ) && in_array( $_GET['group_status'], array( 'public', 'private', 'hidden' ) ) ) { $this->view = $_GET['group_status']; } // We'll use the ids of group status types for the 'include' param. $this->group_type_ids = BP_Groups_Group::get_group_type_ids(); // Pass a dummy array if there are no groups of this type. $include = false; if ( 'all' != $this->view && isset( $this->group_type_ids[ $this->view ] ) ) { $include = ! empty( $this->group_type_ids[ $this->view ] ) ? $this->group_type_ids[ $this->view ] : array( 0 ); } // Get group type counts for display in the filter tabs. $this->group_counts = array(); foreach ( $this->group_type_ids as $group_type => $group_ids ) { $this->group_counts[ $group_type ] = count( $group_ids ); } // Group types $group_type = false; if ( isset( $_GET['bp-group-type'] ) && null !== bp_groups_get_group_type_object( $_GET['bp-group-type'] ) ) { $group_type = $_GET['bp-group-type']; } // If we're viewing a specific group, flatten all activities into a single array. if ( $include_id ) { $groups = array( (array) groups_get_group( $include_id ) ); } else { $groups_args = array( 'include' => $include, 'per_page' => $per_page, 'page' => $page, 'orderby' => $orderby, 'order' => $order ); if ( $group_type ) { $groups_args['group_type'] = $group_type; } $groups = array(); if ( bp_has_groups( $groups_args ) ) { while ( bp_groups() ) { bp_the_group(); $groups[] = (array) $groups_template->group; } } } // Set raw data to display. $this->items = $groups; // Store information needed for handling table pagination. $this->set_pagination_args( array( 'per_page' => $per_page, 'total_items' => $groups_template->total_group_count, 'total_pages' => ceil( $groups_template->total_group_count / $per_page ) ) ); } /** * Get an array of all the columns on the page. * * @since 1.7.0 * * @return array Array of column headers. */ public function get_column_info() { $this->_column_headers = array( $this->get_columns(), array(), $this->get_sortable_columns(), $this->get_default_primary_column_name(), ); return $this->_column_headers; } /** * Get name of default primary column * * @since 2.3.3 * * @return string */ protected function get_default_primary_column_name() { // Comment column is mapped to Group's name. return 'comment'; } /** * Display a message on screen when no items are found ("No groups found"). * * @since 1.7.0 */ public function no_items() { _e( 'No groups found.', 'buddypress' ); } /** * Output the Groups data table. * * @since 1.7.0 */ public function display() { $this->display_tablenav( 'top' ); ?> <h2 class="screen-reader-text"><?php /* translators: accessibility text */ _e( 'Groups list', 'buddypress' ); ?></h2> <table class="wp-list-table <?php echo implode( ' ', $this->get_table_classes() ); ?>" cellspacing="0"> <thead> <tr> <?php $this->print_column_headers(); ?> </tr> </thead> <tbody id="the-comment-list"> <?php $this->display_rows_or_placeholder(); ?> </tbody> <tfoot> <tr> <?php $this->print_column_headers( false ); ?> </tr> </tfoot> </table> <?php $this->display_tablenav( 'bottom' ); } /** * Extra controls to be displayed between bulk actions and pagination * * @since 2.7.0 * @access protected * * @param string $which */ protected function extra_tablenav( $which ) { /** * Fires just after the bulk action controls in the WP Admin groups list table. * * @since 2.7.0 * * @param string $which The location of the extra table nav markup: 'top' or 'bottom'. */ do_action( 'bp_groups_list_table_after_bulk_actions', $which ); } /** * Generate content for a single row of the table. * * @since 1.7.0 * * @param object|array $item The current group item in the loop. */ public function single_row( $item = array() ) { static $even = false; $row_classes = array(); if ( $even ) { $row_classes = array( 'even' ); } else { $row_classes = array( 'alternate', 'odd' ); } /** * Filters the classes applied to a single row in the groups list table. * * @since 1.9.0 * * @param array $row_classes Array of classes to apply to the row. * @param string $value ID of the current group being displayed. */ $row_classes = apply_filters( 'bp_groups_admin_row_class', $row_classes, $item['id'] ); $row_class = ' class="' . implode( ' ', $row_classes ) . '"'; echo '<tr' . $row_class . ' id="group-' . esc_attr( $item['id'] ) . '" data-parent_id="' . esc_attr( $item['id'] ) . '" data-root_id="' . esc_attr( $item['id'] ) . '">'; echo $this->single_row_columns( $item ); echo '</tr>'; $even = ! $even; } /** * Get the list of views available on this table (e.g. "all", "public"). * * @since 1.7.0 */ public function get_views() { $url_base = bp_get_admin_url( 'admin.php?page=bp-groups' ); ?> <h2 class="screen-reader-text"><?php /* translators: accessibility text */ _e( 'Filter groups list', 'buddypress' ); ?></h2> <ul class="subsubsub"> <li class="all"><a href="<?php echo esc_url( $url_base ); ?>" class="<?php if ( 'all' == $this->view ) echo 'current'; ?>"><?php _e( 'All', 'buddypress' ); ?></a> |</li> <li class="public"><a href="<?php echo esc_url( add_query_arg( 'group_status', 'public', $url_base ) ); ?>" class="<?php if ( 'public' == $this->view ) echo 'current'; ?>"><?php printf( _n( 'Public <span class="count">(%s)</span>', 'Public <span class="count">(%s)</span>', $this->group_counts['public'], 'buddypress' ), number_format_i18n( $this->group_counts['public'] ) ); ?></a> |</li> <li class="private"><a href="<?php echo esc_url( add_query_arg( 'group_status', 'private', $url_base ) ); ?>" class="<?php if ( 'private' == $this->view ) echo 'current'; ?>"><?php printf( _n( 'Private <span class="count">(%s)</span>', 'Private <span class="count">(%s)</span>', $this->group_counts['private'], 'buddypress' ), number_format_i18n( $this->group_counts['private'] ) ); ?></a> |</li> <li class="hidden"><a href="<?php echo esc_url( add_query_arg( 'group_status', 'hidden', $url_base ) ); ?>" class="<?php if ( 'hidden' == $this->view ) echo 'current'; ?>"><?php printf( _n( 'Hidden <span class="count">(%s)</span>', 'Hidden <span class="count">(%s)</span>', $this->group_counts['hidden'], 'buddypress' ), number_format_i18n( $this->group_counts['hidden'] ) ); ?></a></li> <?php /** * Fires inside listing of views so plugins can add their own. * * @since 1.7.0 * * @param string $url_base Current URL base for view. * @param string $view Current view being displayed. */ do_action( 'bp_groups_list_table_get_views', $url_base, $this->view ); ?> </ul> <?php } /** * Get bulk actions for single group row. * * @since 1.7.0 * * @return array Key/value pairs for the bulk actions dropdown. */ public function get_bulk_actions() { /** * Filters the list of bulk actions to display on a single group row. * * @since 1.7.0 * * @param array $value Array of bulk actions to display. */ return apply_filters( 'bp_groups_list_table_get_bulk_actions', array( 'delete' => __( 'Delete', 'buddypress' ) ) ); } /** * Get the table column titles. * * @since 1.7.0 * * @see WP_List_Table::single_row_columns() * * @return array Array of column titles. */ public function get_columns() { /** * Filters the titles for the columns for the groups list table. * * @since 2.0.0 * * @param array $value Array of slugs and titles for the columns. */ return apply_filters( 'bp_groups_list_table_get_columns', array( 'cb' => '<input name type="checkbox" />', 'comment' => _x( 'Name', 'Groups admin Group Name column header', 'buddypress' ), 'description' => _x( 'Description', 'Groups admin Group Description column header', 'buddypress' ), 'status' => _x( 'Status', 'Groups admin Privacy Status column header', 'buddypress' ), 'members' => _x( 'Members', 'Groups admin Members column header', 'buddypress' ), 'last_active' => _x( 'Last Active', 'Groups admin Last Active column header', 'buddypress' ) ) ); } /** * Get the column names for sortable columns. * * Note: It's not documented in WP, but the second item in the * nested arrays below is $desc_first. Normally, we would set * last_active to be desc_first (since you're generally interested in * the *most* recently active group, not the *least*). But because * the default sort for the Groups admin screen is DESC by last_active, * we want the first click on the Last Active column header to switch * the sort order - ie, to make it ASC. Thus last_active is set to * $desc_first = false. * * @since 1.7.0 * * @return array Array of sortable column names. */ public function get_sortable_columns() { /** * Filters the column names for the sortable columns. * * @since 5.0.0 * * @param array $value Array of keys and their values. */ return apply_filters( 'bp_groups_list_table_get_sortable_columns', array( 'gid' => array( 'gid', false ), 'comment' => array( 'name', false ), 'members' => array( 'members', false ), 'last_active' => array( 'last_active', false ), ) ); } /** * Override WP_List_Table::row_actions(). * * Basically a duplicate of the row_actions() method, but removes the * unnecessary <button> addition. * * @since 2.3.3 * @since 2.3.4 Visibility set to public for compatibility with WP < 4.0.0. * * @param array $actions The list of actions. * @param bool $always_visible Whether the actions should be always visible. * @return string */ public function row_actions( $actions, $always_visible = false ) { $action_count = count( $actions ); $i = 0; if ( !$action_count ) return ''; $out = '<div class="' . ( $always_visible ? 'row-actions visible' : 'row-actions' ) . '">'; foreach ( $actions as $action => $link ) { ++$i; ( $i == $action_count ) ? $sep = '' : $sep = ' | '; $out .= "<span class='$action'>$link$sep</span>"; } $out .= '</div>'; return $out; } /** * Markup for the Checkbox column. * * @since 1.7.0 * * @see WP_List_Table::single_row_columns() * * @param array $item A singular item (one full row). */ public function column_cb( $item = array() ) { /* translators: accessibility text */ printf( '<label class="screen-reader-text" for="gid-%1$d">' . __( 'Select group %1$d', 'buddypress' ) . '</label><input type="checkbox" name="gid[]" value="%1$d" id="gid-%1$d" />', $item['id'] ); } /** * Markup for the Group ID column. * * @since 1.7.0 * * @see WP_List_Table::single_row_columns() * * @param array $item A singular item (one full row). */ public function column_gid( $item = array() ) { echo '<strong>' . absint( $item['id'] ) . '</strong>'; } /** * Name column, and "quick admin" rollover actions. * * Called "comment" in the CSS so we can re-use some WP core CSS. * * @since 1.7.0 * * @see WP_List_Table::single_row_columns() * * @param array $item A singular item (one full row). */ public function column_comment( $item = array() ) { // Preorder items: Edit | Delete | View. $actions = array( 'edit' => '', 'delete' => '', 'view' => '', ); // We need the group object for some BP functions. $item_obj = (object) $item; // Build actions URLs. $base_url = bp_get_admin_url( 'admin.php?page=bp-groups&gid=' . $item['id'] ); $delete_url = wp_nonce_url( $base_url . "&action=delete", 'bp-groups-delete' ); $edit_url = $base_url . '&action=edit'; $view_url = bp_get_group_permalink( $item_obj ); /** * Filters the group name for a group's column content. * * @since 1.7.0 * * @param string $value Name of the group being rendered. * @param array $item Array for the current group item. */ $group_name = apply_filters_ref_array( 'bp_get_group_name', array( $item['name'], $item ) ); // Rollover actions. // Edit. $actions['edit'] = sprintf( '<a href="%s">%s</a>', esc_url( $edit_url ), __( 'Edit', 'buddypress' ) ); // Delete. $actions['delete'] = sprintf( '<a href="%s">%s</a>', esc_url( $delete_url ), __( 'Delete', 'buddypress' ) ); // Visit. $actions['view'] = sprintf( '<a href="%s">%s</a>', esc_url( $view_url ), __( 'View', 'buddypress' ) ); /** * Filters the actions that will be shown for the column content. * * @since 1.7.0 * * @param array $value Array of actions to be displayed for the column content. * @param array $item The current group item in the loop. */ $actions = apply_filters( 'bp_groups_admin_comment_row_actions', array_filter( $actions ), $item ); // Get group name and avatar. $avatar = ''; if ( buddypress()->avatar->show_avatars ) { $avatar = bp_core_fetch_avatar( array( 'item_id' => $item['id'], 'object' => 'group', 'type' => 'thumb', 'avatar_dir' => 'group-avatars', 'alt' => sprintf( __( 'Group logo of %s', 'buddypress' ), $group_name ), 'width' => '32', 'height' => '32', 'title' => $group_name ) ); } $content = sprintf( '<strong><a href="%s">%s</a></strong>', esc_url( $edit_url ), $group_name ); echo $avatar . ' ' . $content . ' ' . $this->row_actions( $actions ); } /** * Markup for the Description column. * * @since 1.7.0 * * @param array $item Information about the current row. */ public function column_description( $item = array() ) { /** * Filters the markup for the Description column. * * @since 1.0.0 * * @param string $value Markup for the Description column. * @param array $item The current group item in the loop. */ echo apply_filters_ref_array( 'bp_get_group_description', array( $item['description'], $item ) ); } /** * Markup for the Status column. * * @since 1.7.0 * * @param array $item Information about the current row. */ public function column_status( $item = array() ) { $status = $item['status']; $status_desc = ''; // @todo This should be abstracted out somewhere for the whole // Groups component. switch ( $status ) { case 'public' : $status_desc = __( 'Public', 'buddypress' ); break; case 'private' : $status_desc = __( 'Private', 'buddypress' ); break; case 'hidden' : $status_desc = __( 'Hidden', 'buddypress' ); break; } /** * Filters the markup for the Status column. * * @since 1.7.0 * * @param string $status_desc Markup for the Status column. * @parma array $item The current group item in the loop. */ echo apply_filters_ref_array( 'bp_groups_admin_get_group_status', array( $status_desc, $item ) ); } /** * Markup for the Number of Members column. * * @since 1.7.0 * * @param array $item Information about the current row. */ public function column_members( $item = array() ) { $count = groups_get_groupmeta( $item['id'], 'total_member_count' ); /** * Filters the markup for the number of Members column. * * @since 1.7.0 * * @param int $count Markup for the number of Members column. * @parma array $item The current group item in the loop. */ echo apply_filters_ref_array( 'bp_groups_admin_get_group_member_count', array( (int) $count, $item ) ); } /** * Markup for the Last Active column. * * @since 1.7.0 * * @param array $item Information about the current row. */ public function column_last_active( $item = array() ) { $last_active = groups_get_groupmeta( $item['id'], 'last_activity' ); /** * Filters the markup for the Last Active column. * * @since 1.7.0 * * @param string $last_active Markup for the Last Active column. * @parma array $item The current group item in the loop. */ echo apply_filters_ref_array( 'bp_groups_admin_get_group_last_active', array( $last_active, $item ) ); } /** * Allow plugins to add their custom column. * * @since 2.0.0 * * @param array $item Information about the current row. * @param string $column_name The column name. * @return string */ public function column_default( $item = array(), $column_name = '' ) { /** * Filters a string to allow plugins to add custom column content. * * @since 2.0.0 * * @param string $value Empty string. * @param string $column_name Name of the column being rendered. * @param array $item The current group item in the loop. */ return apply_filters( 'bp_groups_admin_get_group_custom_column', '', $column_name, $item ); } // Group Types /** * Add group type column to the WordPress admin groups list table. * * @since 2.7.0 * * @param array $columns Groups table columns. * * @return array $columns */ public function add_type_column( $columns = array() ) { $columns['bp_group_type'] = _x( 'Group Type', 'Label for the WP groups table group type column', 'buddypress' ); return $columns; } /** * Markup for the Group Type column. * * @since 2.7.0 * * @param string $retval Empty string. * @param string $column_name Name of the column being rendered. * @param array $item The current group item in the loop. * @return string */ public function column_content_group_type( $retval = '', $column_name, $item ) { if ( 'bp_group_type' !== $column_name ) { return $retval; } add_filter( 'bp_get_group_type_directory_permalink', array( $this, 'group_type_permalink_use_admin_filter' ), 10, 2 ); $retval = bp_get_group_type_list( $item['id'], array( 'parent_element' => '', 'label_element' => '', 'label' => '', 'show_all' => true ) ); remove_filter( 'bp_get_group_type_directory_permalink', array( $this, 'group_type_permalink_use_admin_filter' ), 10 ); /** * Filters the markup for the Group Type column. * * @since 2.7.0 * * @param string $retval Markup for the Group Type column. * @parma array $item The current group item in the loop. */ echo apply_filters_ref_array( 'bp_groups_admin_get_group_type_column', array( $retval, $item ) ); } /** * Filters the group type list permalink in the Group Type column. * * Changes the group type permalink to use the admin URL. * * @since 2.7.0 * * @param string $retval Current group type permalink. * @param object $type Group type object. * @return string */ public function group_type_permalink_use_admin_filter( $retval, $type ) { return add_query_arg( array( 'bp-group-type' => urlencode( $type->name ) ) ); } /** * Markup for the Group Type bulk change select. * * @since 2.7.0 * * @param string $which The location of the extra table nav markup: 'top' or 'bottom'. */ public function add_group_type_bulk_change_select( $which ) { // `$which` is only passed in WordPress 4.6+. Avoid duplicating controls in earlier versions. static $displayed = false; if ( version_compare( bp_get_major_wp_version(), '4.6', '<' ) && $displayed ) { return; } $displayed = true; $id_name = 'bottom' === $which ? 'bp_change_type2' : 'bp_change_type'; $types = bp_groups_get_group_types( array(), 'objects' ); ?> <div class="alignleft actions"> <label class="screen-reader-text" for="<?php echo $id_name; ?>"><?php _e( 'Change group type to…', 'buddypress' ) ?></label> <select name="<?php echo $id_name; ?>" id="<?php echo $id_name; ?>" style="display:inline-block;float:none;"> <option value=""><?php _e( 'Change group type to…', 'buddypress' ) ?></option> <?php foreach( $types as $type ) : ?> <option value="<?php echo esc_attr( $type->name ); ?>"><?php echo esc_html( $type->labels['singular_name'] ); ?></option> <?php endforeach; ?> <option value="remove_group_type"><?php _e( 'No Group Type', 'buddypress' ) ?></option> </select> <?php wp_nonce_field( 'bp-bulk-groups-change-type-' . bp_loggedin_user_id(), 'bp-bulk-groups-change-type-nonce' ); submit_button( __( 'Change', 'buddypress' ), 'button', 'bp_change_group_type', false ); ?> </div> <?php } }
Changelog Changelog
Version | Description |
---|---|
1.7.0 | Introduced. |
Methods Methods
- __construct — Constructor
- add_group_type_bulk_change_select — Markup for the Group Type bulk change select.
- add_type_column — Add group type column to the WordPress admin groups list table.
- column_cb — Markup for the Checkbox column.
- column_comment — Name column, and "quick admin" rollover actions.
- column_content_group_type — Markup for the Group Type column.
- column_default — Allow plugins to add their custom column.
- column_description — Markup for the Description column.
- column_gid — Markup for the Group ID column.
- column_last_active — Markup for the Last Active column.
- column_members — Markup for the Number of Members column.
- column_status — Markup for the Status column.
- display — Output the Groups data table.
- extra_tablenav — Extra controls to be displayed between bulk actions and pagination
- get_bulk_actions — Get bulk actions for single group row.
- get_column_info — Get an array of all the columns on the page.
- get_columns — Get the table column titles.
- get_default_primary_column_name — Get name of default primary column
- get_sortable_columns — Get the column names for sortable columns.
- get_views — Get the list of views available on this table (e.g. "all", "public").
- group_type_permalink_use_admin_filter — Filters the group type list permalink in the Group Type column.
- no_items — Display a message on screen when no items are found ("No groups found").
- prepare_items — Set up items for display in the list table.
- row_actions — Override WP_List_Table::row_actions().
- single_row — Generate content for a single row of the table.