diff --git src/wp-admin/includes/user.php src/wp-admin/includes/user.php
index 7694889..ecfe9ba 100644
--- src/wp-admin/includes/user.php
+++ src/wp-admin/includes/user.php
@@ -991,8 +991,40 @@ function wp_privacy_process_personal_data_erasure_page( $response, $eraser_index
* @access private
*/
function _wp_privacy_hook_requests_page() {
- add_submenu_page( 'tools.php', __( 'Export Personal Data' ), __( 'Export Personal Data' ), 'export_others_personal_data', 'export_personal_data', '_wp_personal_data_export_page' );
- add_submenu_page( 'tools.php', __( 'Erase Personal Data' ), __( 'Erase Personal Data' ), 'erase_others_personal_data', 'remove_personal_data', '_wp_personal_data_removal_page' );
+
+ $export_count = 0;
+ if ( current_user_can( 'export_others_personal_data' ) ) {
+ $export_counts = (array) wp_count_user_requests( 'export_personal_data' );
+ if ( isset( $export_counts['request-confirmed'] ) ) {
+ $export_count = (int) $export_counts['request-confirmed'];
+ }
+ }
+
+ $erase_count = 0;
+ if ( current_user_can( 'erase_others_personal_data' ) ) {
+ $erase_counts = (array) wp_count_user_requests( 'remove_personal_data' );
+ if ( isset( $erase_counts['request-confirmed'] ) ) {
+ $erase_count = (int) $erase_counts['request-confirmed'];
+ }
+ }
+
+ $export_notice = sprintf(
+ '%d',
+ $export_count,
+ number_format_i18n( $export_count )
+ );
+
+ $erase_notice = sprintf(
+ '%d',
+ $erase_count,
+ number_format_i18n( $erase_count )
+ );
+
+ /* translators: %s Export bubble count notice */
+ add_submenu_page( 'tools.php', __( 'Export Personal Data' ), sprintf( __( 'Export Personal Data %s' ), $export_notice ), 'export_others_personal_data', 'export_personal_data', '_wp_personal_data_export_page' );
+
+ /* translators: %s Erase bubble count notice */
+ add_submenu_page( 'tools.php', __( 'Erase Personal Data' ), sprintf( __( 'Erase Personal Data %s' ), $erase_notice ), 'erase_others_personal_data', 'remove_personal_data', '_wp_personal_data_removal_page' );
}
// TODO: move the following classes in new files.
diff --git src/wp-admin/menu.php src/wp-admin/menu.php
index 0ad302e..4d0afb7 100644
--- src/wp-admin/menu.php
+++ src/wp-admin/menu.php
@@ -252,7 +252,31 @@ if ( current_user_can( 'list_users' ) ) {
}
}
-$menu[75] = array( __( 'Tools' ), 'edit_posts', 'tools.php', '', 'menu-top menu-icon-tools', 'menu-tools', 'dashicons-admin-tools' );
+$confirmed_export_request_count = 0;
+if ( current_user_can( 'export_others_personal_data' ) ) {
+ $export_request_counts = (array) wp_count_user_requests( 'export_personal_data' );
+ if ( isset( $export_request_counts['request-confirmed'] ) ) {
+ $confirmed_export_request_count = (int) $export_request_counts['request-confirmed'];
+ }
+}
+
+$confirmed_erase_request_count = 0;
+if ( current_user_can( 'erase_others_personal_data' ) ) {
+ $erase_request_counts = (array) wp_count_user_requests( 'remove_personal_data' );
+ if ( isset( $erase_request_counts['request-confirmed'] ) ) {
+ $confirmed_erase_request_count = (int) $erase_request_counts['request-confirmed'];
+ }
+}
+
+$confirmed_request_count = $confirmed_export_request_count + $confirmed_erase_request_count;
+
+$request_notice = sprintf(
+ '%d',
+ $confirmed_request_count,
+ number_format_i18n( $confirmed_request_count )
+);
+
+$menu[75] = array( sprintf( __( 'Tools %s' ), $request_notice ), 'edit_posts', 'tools.php', '', 'menu-top menu-icon-tools', 'menu-tools', 'dashicons-admin-tools' );
$submenu['tools.php'][5] = array( __( 'Available Tools' ), 'edit_posts', 'tools.php' );
$submenu['tools.php'][10] = array( __( 'Import' ), 'import', 'import.php' );
$submenu['tools.php'][15] = array( __( 'Export' ), 'export', 'export.php' );