%s capability has been created.', 'groups' ), $capability->capability ? stripslashes( wp_filter_nohtml_kses( $capability->capability ) ) : '' ) ); } break; case 'edit' : if ( !( $capability_id = groups_admin_capabilities_edit_submit() ) ) { return groups_admin_capabilities_edit( groups_sanitize_post( 'capability-id-field' ) ); } else { $capability = Groups_Capability::read( $capability_id ); Groups_Admin::add_message( sprintf( /* translators: capability name */ __( 'The %s capability has been updated.', 'groups' ), $capability->capability ? stripslashes( wp_filter_nohtml_kses( $capability->capability ) ) : '' ) ); } break; case 'remove' : if ( $capability_id = groups_admin_capabilities_remove_submit() ) { Groups_Admin::add_message( __( 'The capability has been deleted.', 'groups' ) ); } break; // bulk actions on groups: capabilities case 'groups-action' : if ( groups_verify_post_nonce( GROUPS_ADMIN_GROUPS_ACTION_NONCE, 'admin' ) ) { $capability_ids = groups_sanitize_post( 'capability_ids' ); $bulk = groups_sanitize_post( 'bulk' ); if ( is_array( $capability_ids ) && ( $bulk !== null ) ) { foreach ( $capability_ids as $capability_id ) { $bulk_action = groups_sanitize_post( 'bulk-action' ); switch ( $bulk_action ) { case 'remove' : if ( isset( $_POST['confirm'] ) ) { groups_admin_capabilities_bulk_remove_submit(); } else { return groups_admin_capabilities_bulk_remove(); } break; } break; } } } break; } } else if ( isset ( $_GET['action'] ) ) { // handle action request - show form switch ( groups_sanitize_get( 'action' ) ) { case 'add' : return groups_admin_capabilities_add(); break; case 'edit' : if ( isset( $_GET['capability_id'] ) ) { return groups_admin_capabilities_edit( groups_sanitize_get( 'capability_id' ) ); } break; case 'remove' : if ( isset( $_GET['capability_id'] ) ) { return groups_admin_capabilities_remove( groups_sanitize_get( 'capability_id' ) ); } break; case 'refresh' : if ( check_admin_referer( 'refresh' ) ) { $n = Groups_WordPress::refresh_capabilities(); if ( $n > 0 ) { /* translators: count */ $output .= '

' . esc_html( sprintf( _n( 'One capability has been added.', '%d capabilities have been added.', $n, 'groups' ), $n ) ) . '

'; // phpcs:ignore WordPress.WP.I18n.MissingSingularPlaceholder } else { $output .= '

' . esc_html__( 'No new capabilities have been found.', 'groups' ) . '

'; } } else { wp_die( esc_html__( 'A Duck!', 'groups' ) ); } break; } } // // capabilities table // if ( isset( $_POST['clear_filters'] ) || isset( $_POST['capability_id'] ) || isset( $_POST['capability'] ) ) { if ( !groups_verify_post_nonce( GROUPS_ADMIN_CAPABILITIES_FILTER_NONCE, 'admin' ) ) { wp_die( esc_html__( 'Access denied.', 'groups' ) ); } } // filters $capability_id = Groups_Options::get_user_option( 'capabilities_capability_id', null ); $capability = Groups_Options::get_user_option( 'capabilities_capability', null ); if ( isset( $_POST['clear_filters'] ) ) { Groups_Options::delete_user_option( 'capabilities_capability_id' ); Groups_Options::delete_user_option( 'capabilities_capability' ); $capability_id = null; $capability = null; } else if ( isset( $_POST['submitted'] ) ) { // filter by name if ( !empty( $_POST['capability'] ) ) { $capability = groups_sanitize_post( 'capability' ); Groups_Options::update_user_option( 'capabilities_capability', $capability ); } // filter by capability id if ( !empty( $_POST['capability_id'] ) ) { $capability_id = intval( groups_sanitize_post( 'capability_id' ) ); Groups_Options::update_user_option( 'capabilities_capability_id', $capability_id ); } else if ( isset( $_POST['capability_id'] ) ) { // empty && isset => '' => all $capability_id = null; Groups_Options::delete_user_option( 'capabilities_capability_id' ); } } if ( isset( $_POST['row_count'] ) ) { if ( !groups_verify_post_nonce( GROUPS_ADMIN_CAPABILITIES_NONCE, 'admin' ) ) { wp_die( esc_html__( 'Access denied.', 'groups' ) ); } } if ( isset( $_POST['paged'] ) ) { if ( !groups_verify_post_nonce( GROUPS_ADMIN_CAPABILITIES_NONCE, 'admin' ) ) { wp_die( esc_html__( 'Access denied.', 'groups' ) ); } } $current_url = groups_get_current_url(); $current_url = remove_query_arg( 'paged', $current_url ); $current_url = remove_query_arg( 'action', $current_url ); $current_url = remove_query_arg( 'capability_id', $current_url ); $capability_table = _groups_get_tablename( 'capability' ); $output .= '
' . '

' . esc_html__( 'Capabilities', 'groups' ) . // add capability sprintf( '', esc_attr__( 'Click to add a new capability', 'groups' ), esc_url( $current_url . '&action=add' ) ) . sprintf( '%s', esc_attr__( 'Add', 'groups' ), esc_url( GROUPS_PLUGIN_URL . 'images/add.png' ) ) . sprintf( '%s', esc_html__( 'New Capability', 'groups' ) ) . '' . // refresh capabilities sprintf( '', esc_attr__( 'Click to refresh capabilities', 'groups' ), esc_url( wp_nonce_url( $current_url . '&action=refresh', 'refresh' ) ) ) . sprintf( '%s', esc_attr__( 'Refresh', 'groups' ), esc_url( GROUPS_PLUGIN_URL . 'images/refresh.png' ) ) . sprintf( '%s', esc_html__( 'Refresh', 'groups' ) ) . '' . '

'; $output .= Groups_Admin::render_messages(); $row_count = intval( groups_sanitize_post( 'row_count' ) ?? 0 ); if ($row_count <= 0) { $row_count = Groups_Options::get_user_option( 'capabilities_per_page', GROUPS_CAPABILITIES_PER_PAGE ); } else { Groups_Options::update_user_option('capabilities_per_page', $row_count ); } $offset = intval( groups_sanitize_get( 'offset' ) ?? 0 ); if ( $offset < 0 ) { $offset = 0; } $paged = intval( groups_sanitize_request( 'paged' ) ?? 0 ); if ( $paged < 0 ) { $paged = 0; } $orderby = groups_sanitize_get( 'orderby' ); switch ( $orderby ) { case 'capability_id' : case 'capability' : case 'description' : break; default: $orderby = 'name'; } $order = groups_sanitize_get( 'order' ); switch ( $order ) { case 'asc' : case 'ASC' : $switch_order = 'DESC'; break; case 'desc' : case 'DESC' : $switch_order = 'ASC'; break; default: $order = 'ASC'; $switch_order = 'DESC'; } $filters = array( " 1=%d " ); $filter_params = array( 1 ); if ( $capability_id ) { $filters[] = " $capability_table.capability_id = %d "; $filter_params[] = $capability_id; } if ( $capability ) { $filters[] = " $capability_table.capability LIKE %s "; $filter_params[] = '%' . $wpdb->esc_like( $capability ) . '%'; } if ( !empty( $filters ) ) { // @phpstan-ignore empty.variable $filters = " WHERE " . implode( " AND ", $filters ); } else { $filters = ''; } $count_query = $wpdb->prepare( "SELECT COUNT(*) FROM $capability_table $filters", $filter_params ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare $count = $wpdb->get_var( $count_query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared if ( $count > $row_count ) { $paginate = true; } else { $paginate = false; } $pages = ceil ( $count / $row_count ); if ( $paged > $pages ) { $paged = $pages; } if ( $paged != 0 ) { $offset = ( $paged - 1 ) * $row_count; } $query = $wpdb->prepare( // nosemgrep: audit.php.wp.security.sqli.input-in-sinks "SELECT * FROM $capability_table $filters ORDER BY $orderby $order LIMIT $row_count OFFSET $offset", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare $filter_params ); // nosemgrep: audit.php.wp.security.sqli.input-in-sinks $results = $wpdb->get_results( $query, OBJECT ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $column_display_names = array( 'capability_id' => __( 'ID', 'groups' ), 'capability' => __( 'Capability', 'groups' ), 'description' => __( 'Description', 'groups' ) ); $output .= '
'; $output .= '
' . '
' . '
' . '' . esc_html__( 'Filters', 'groups' ) . '' . '' . ' ' . '' . ' ' . wp_nonce_field( 'admin', GROUPS_ADMIN_CAPABILITIES_FILTER_NONCE, true, false ) . '' . ' ' . '' . '' . '
' . '
' . '
'; $output .= '
'; $output .= '
'; $output .= '
'; $output .= '
'; $output .= ''; $output .= ''; $output .= '
'; // .alignleft.actions $output .= '
'; // .capabilities-bulk-container if ( $paginate ) { require_once GROUPS_CORE_LIB . '/class-groups-pagination.php'; $pagination = new Groups_Pagination( $count, null, $row_count ); $output .= $pagination->pagination( 'top' ); } $output .= '
'; $output .= ''; $output .= ''; $output .= ''; $output .= '
'; // .page-options.right $output .= '
'; // .tablenav.top $output .= wp_nonce_field( 'admin', GROUPS_ADMIN_GROUPS_ACTION_NONCE, true, false ); $output .= wp_nonce_field( 'admin', GROUPS_ADMIN_CAPABILITIES_NONCE, true, false ); $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; foreach ( $column_display_names as $key => $column_display_name ) { $options = array( 'orderby' => $key, 'order' => $switch_order ); $class = $key; if ( !in_array($key, array( 'capabilities', 'edit', 'remove' ) ) ) { if ( strcmp( $key, $orderby ) == 0 ) { $lorder = strtolower( $order ); $class = "$key manage-column sorted $lorder"; } else { $class = "$key manage-column sortable"; } $column_display_name = sprintf( '%s'. '' . ''. ''. '' . // .sorting-indicators '', esc_url( add_query_arg( $options, $current_url ) ), esc_html( $column_display_name ) ); } else { $column_display_name = esc_html( $column_display_name ); } $output .= sprintf( '', esc_attr( $class ), $column_display_name ); } $output .= ''; $output .= ''; $output .= ''; if ( count( $results ) > 0 ) { for ( $i = 0; $i < count( $results ); $i++ ) { $result = $results[$i]; // Construct the "edit" URL. $edit_url = add_query_arg( array( 'capability_id' => intval( $result->capability_id ), 'action' => 'edit', 'paged' => $paged ), $current_url ); // Construct the "delete" URL. $delete_url = add_query_arg( array( 'capability_id' => intval( $result->capability_id ), 'action' => 'remove', 'paged' => $paged ), $current_url ); // Construct row actions for this group. $row_actions = '
' . '' . '' . '' . __( 'Edit', 'groups' ) . ''; if ( $result->capability !== Groups_Post_Access::READ_POST_CAPABILITY ) { $row_actions .= ' | '. '' . '' . '' . '' . __( 'Remove', 'groups' ) . '' . ''; } $row_actions .= '
'; // .row-actions $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; } } else { $output .= ''; } $output .= ''; $output .= '
%s
'; $output .= ''; $output .= ''; $output .= $result->capability_id; $output .= ''; $output .= sprintf( '%s', esc_url( $edit_url ), $result->capability ? stripslashes( wp_filter_nohtml_kses( $result->capability ) ) : '' ); $output .= $row_actions; $output .= ''; $output .= $result->description ? stripslashes( wp_filter_nohtml_kses( $result->description ) ) : ''; $output .= '
' . esc_html__( 'There are no results.', 'groups' ) . '
'; $output .= Groups_UIE::render_add_titles( '.capabilities-overview table td' ); $output .= '
'; // #groups-action if ( $paginate ) { require_once GROUPS_CORE_LIB . '/class-groups-pagination.php'; $pagination = new Groups_Pagination($count, null, $row_count); $output .= '
'; $output .= $pagination->pagination( 'bottom' ); $output .= '
'; } $output .= '
'; // .capabilities-overview $output .= '
'; // .manage-capabilities echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } // function groups_admin_capabilities()