[ Index ]

PHP Cross Reference of BuddyPress

title

Body

[close]

/src/bp-core/admin/ -> bp-core-admin-tools.php (source)

   1  <?php
   2  /**
   3   * BuddyPress Tools panel.
   4   *
   5   * @package BuddyPress
   6   * @subpackage Core
   7   * @since 2.0.0
   8   */
   9  
  10  // Exit if accessed directly.
  11  defined( 'ABSPATH' ) || exit;
  12  
  13  /**
  14   * Render the BuddyPress Tools page.
  15   *
  16   * @since 2.0.0
  17   */
  18  function bp_core_admin_tools() {
  19      ?>
  20      <div class="wrap">
  21  
  22          <h1 class="wp-heading-inline"><?php esc_html_e( 'BuddyPress Tools', 'buddypress' ) ?></h1>
  23          <hr class="wp-header-end">
  24  
  25          <p><?php esc_html_e( 'BuddyPress keeps track of various relationships between members, groups, and activity items. Occasionally these relationships become out of sync, most often after an import, update, or migration.', 'buddypress' ); ?></p>
  26          <p><?php esc_html_e( 'Use the tools below to manually recalculate these relationships.', 'buddypress' ); ?>
  27          </p>
  28          <p class="description"><?php esc_html_e( 'Some of these tools create substantial database overhead. Avoid running more than one repair job at a time.', 'buddypress' ); ?></p>
  29  
  30          <form class="settings" method="post" action="">
  31  
  32              <fieldset>
  33                  <legend><?php esc_html_e( 'Repair tools', 'buddypress' ) ?></legend>
  34  
  35                  <div class="checkbox">
  36                  <?php foreach ( bp_admin_repair_list() as $item ) : ?>
  37                      <label for="<?php echo esc_attr( str_replace( '_', '-', $item[0] ) ); ?>"><input type="checkbox" class="checkbox" name="<?php echo esc_attr( $item[0] ) . '" id="' . esc_attr( str_replace( '_', '-', $item[0] ) ); ?>" value="1" /> <?php echo esc_html( $item[1] ); ?></label>
  38                  <?php endforeach; ?>
  39                  </div>
  40  
  41                  <p class="submit">
  42                      <input class="button-primary" type="submit" name="bp-tools-submit" value="<?php esc_attr_e( 'Repair Items', 'buddypress' ); ?>" />
  43                      <?php wp_nonce_field( 'bp-do-counts' ); ?>
  44                  </p>
  45  
  46              </fieldset>
  47  
  48          </form>
  49  
  50      </div>
  51  
  52      <?php
  53  }
  54  
  55  /**
  56   * Handle the processing and feedback of the admin tools page.
  57   *
  58   * @since 2.0.0
  59   */
  60  function bp_admin_repair_handler() {
  61      if ( ! bp_is_post_request() || empty( $_POST['bp-tools-submit'] ) ) {
  62          return;
  63      }
  64  
  65      check_admin_referer( 'bp-do-counts' );
  66  
  67      // Bail if user cannot moderate.
  68      $capability = bp_core_do_network_admin() ? 'manage_network_options' : 'manage_options';
  69      if ( ! bp_current_user_can( $capability ) ) {
  70          return;
  71      }
  72  
  73      wp_cache_flush();
  74      $messages = array();
  75  
  76      foreach ( (array) bp_admin_repair_list() as $item ) {
  77          if ( isset( $item[2] ) && isset( $_POST[$item[0]] ) && 1 === absint( $_POST[$item[0]] ) && is_callable( $item[2] ) ) {
  78              $messages[] = call_user_func( $item[2] );
  79          }
  80      }
  81  
  82      if ( count( $messages ) ) {
  83          foreach ( $messages as $message ) {
  84              bp_admin_tools_feedback( $message[1] );
  85          }
  86      }
  87  }
  88  add_action( bp_core_admin_hook(), 'bp_admin_repair_handler' );
  89  
  90  /**
  91   * Get the array of the repair list.
  92   *
  93   * @return array
  94   */
  95  function bp_admin_repair_list() {
  96      $repair_list = array();
  97  
  98      // Members:
  99      // - member count
 100      // - last_activity migration (2.0).
 101      $repair_list[20] = array(
 102          'bp-total-member-count',
 103          __( 'Repair total members count.', 'buddypress' ),
 104          'bp_admin_repair_count_members',
 105      );
 106  
 107      $repair_list[25] = array(
 108          'bp-last-activity',
 109          __( 'Repair member "last activity" data.', 'buddypress' ),
 110          'bp_admin_repair_last_activity',
 111      );
 112  
 113      // Friends:
 114      // - user friend count.
 115      if ( bp_is_active( 'friends' ) ) {
 116          $repair_list[0] = array(
 117              'bp-user-friends',
 118              __( 'Repair total friends count for each member.', 'buddypress' ),
 119              'bp_admin_repair_friend_count',
 120          );
 121      }
 122  
 123      // Groups:
 124      // - user group count.
 125      if ( bp_is_active( 'groups' ) ) {
 126          $repair_list[10] = array(
 127              'bp-group-count',
 128              __( 'Repair total groups count for each member.', 'buddypress' ),
 129              'bp_admin_repair_group_count',
 130          );
 131      }
 132  
 133      // Blogs:
 134      // - user blog count.
 135      if ( bp_is_active( 'blogs' ) ) {
 136          $repair_list[90] = array(
 137              'bp-blog-records',
 138              __( 'Repopulate site tracking records.', 'buddypress' ),
 139              'bp_admin_repair_blog_records',
 140          );
 141      }
 142  
 143      // Emails:
 144      // - reinstall emails.
 145      $repair_list[100] = array(
 146          'bp-reinstall-emails',
 147          __( 'Reinstall emails (delete and restore from defaults).', 'buddypress' ),
 148          'bp_admin_reinstall_emails',
 149      );
 150  
 151      // Invitations:
 152      // - maybe create the database table and migrate any existing group invitations.
 153      $repair_list[110] = array(
 154          'bp-invitations-table',
 155          __( 'Create the database table for Invitations and migrate existing group invitations if needed.', 'buddypress' ),
 156          'bp_admin_invitations_table',
 157      );
 158  
 159      ksort( $repair_list );
 160  
 161      /**
 162       * Filters the array of the repair list.
 163       *
 164       * @since 2.0.0
 165       *
 166       * @param array $repair_list Array of values for the Repair list options.
 167       */
 168      return (array) apply_filters( 'bp_repair_list', $repair_list );
 169  }
 170  
 171  /**
 172   * Recalculate friend counts for each user.
 173   *
 174   * @since 2.0.0
 175   *
 176   * @return array
 177   */
 178  function bp_admin_repair_friend_count() {
 179      global $wpdb;
 180  
 181      if ( ! bp_is_active( 'friends' ) ) {
 182          return;
 183      }
 184  
 185      /* translators: %s: the result of the action performed by the repair tool */
 186      $statement = __( 'Counting the number of friends for each user&hellip; %s', 'buddypress' );
 187      $result    = __( 'Failed!', 'buddypress' );
 188  
 189      $sql_delete = "DELETE FROM {$wpdb->usermeta} WHERE meta_key IN ( 'total_friend_count' );";
 190      if ( is_wp_error( $wpdb->query( $sql_delete ) ) ) {
 191          return array( 1, sprintf( $statement, $result ) );
 192      }
 193  
 194      $bp = buddypress();
 195  
 196      // Walk through all users on the site.
 197      $total_users = $wpdb->get_row( "SELECT count(ID) as c FROM {$wpdb->users}" )->c;
 198  
 199      $updated = array();
 200      if ( $total_users > 0 ) {
 201          $per_query = 500;
 202          $offset = 0;
 203          while ( $offset < $total_users ) {
 204              // Only bother updating counts for users who actually have friendships.
 205              $friendships = $wpdb->get_results( $wpdb->prepare( "SELECT initiator_user_id, friend_user_id FROM {$bp->friends->table_name} WHERE is_confirmed = 1 AND ( ( initiator_user_id > %d AND initiator_user_id <= %d ) OR ( friend_user_id > %d AND friend_user_id <= %d ) )", $offset, $offset + $per_query, $offset, $offset + $per_query ) );
 206  
 207              // The previous query will turn up duplicates, so we
 208              // filter them here.
 209              foreach ( $friendships as $friendship ) {
 210                  if ( ! isset( $updated[ $friendship->initiator_user_id ] ) ) {
 211                      BP_Friends_Friendship::total_friend_count( $friendship->initiator_user_id );
 212                      $updated[ $friendship->initiator_user_id ] = 1;
 213                  }
 214  
 215                  if ( ! isset( $updated[ $friendship->friend_user_id ] ) ) {
 216                      BP_Friends_Friendship::total_friend_count( $friendship->friend_user_id );
 217                      $updated[ $friendship->friend_user_id ] = 1;
 218                  }
 219              }
 220  
 221              $offset += $per_query;
 222          }
 223      } else {
 224          return array( 2, sprintf( $statement, $result ) );
 225      }
 226  
 227      return array( 0, sprintf( $statement, __( 'Complete!', 'buddypress' ) ) );
 228  }
 229  
 230  /**
 231   * Recalculate group counts for each user.
 232   *
 233   * @since 2.0.0
 234   *
 235   * @return array
 236   */
 237  function bp_admin_repair_group_count() {
 238      global $wpdb;
 239  
 240      if ( ! bp_is_active( 'groups' ) ) {
 241          return;
 242      }
 243  
 244      /* translators: %s: the result of the action performed by the repair tool */
 245      $statement = __( 'Counting the number of groups for each user&hellip; %s', 'buddypress' );
 246      $result    = __( 'Failed!', 'buddypress' );
 247  
 248      $sql_delete = "DELETE FROM {$wpdb->usermeta} WHERE meta_key IN ( 'total_group_count' );";
 249      if ( is_wp_error( $wpdb->query( $sql_delete ) ) ) {
 250          return array( 1, sprintf( $statement, $result ) );
 251      }
 252  
 253      $bp = buddypress();
 254  
 255      // Walk through all users on the site.
 256      $total_users = $wpdb->get_row( "SELECT count(ID) as c FROM {$wpdb->users}" )->c;
 257  
 258      if ( $total_users > 0 ) {
 259          $per_query = 500;
 260          $offset = 0;
 261          while ( $offset < $total_users ) {
 262              // But only bother to update counts for users that have groups.
 263              $users = $wpdb->get_col( $wpdb->prepare( "SELECT user_id FROM {$bp->groups->table_name_members} WHERE is_confirmed = 1 AND is_banned = 0 AND user_id > %d AND user_id <= %d", $offset, $offset + $per_query ) );
 264  
 265              foreach ( $users as $user ) {
 266                  BP_Groups_Member::refresh_total_group_count_for_user( $user );
 267              }
 268  
 269              $offset += $per_query;
 270          }
 271      } else {
 272          return array( 2, sprintf( $statement, $result ) );
 273      }
 274  
 275      return array( 0, sprintf( $statement, __( 'Complete!', 'buddypress' ) ) );
 276  }
 277  
 278  /**
 279   * Recalculate user-to-blog relationships and useful blog meta data.
 280   *
 281   * @since 2.1.0
 282   *
 283   * @return array
 284   */
 285  function bp_admin_repair_blog_records() {
 286  
 287      /* translators: %s: the result of the action performed by the repair tool */
 288      $statement = __( 'Repopulating Blogs records&hellip; %s', 'buddypress' );
 289  
 290      // Default to failure text.
 291      $result    = __( 'Failed!',   'buddypress' );
 292  
 293      // Default to unrepaired.
 294      $repair    = false;
 295  
 296      // Run function if blogs component is active.
 297      if ( bp_is_active( 'blogs' ) ) {
 298          $repair = bp_blogs_record_existing_blogs();
 299      }
 300  
 301      // Setup success/fail messaging.
 302      if ( true === $repair ) {
 303          $result = __( 'Complete!', 'buddypress' );
 304      }
 305  
 306      // All done!
 307      return array( 0, sprintf( $statement, $result ) );
 308  }
 309  
 310  /**
 311   * Recalculate the total number of active site members.
 312   *
 313   * @since 2.0.0
 314   */
 315  function bp_admin_repair_count_members() {
 316      /* translators: %s: the result of the action performed by the repair tool */
 317      $statement = __( 'Counting the number of active members on the site&hellip; %s', 'buddypress' );
 318      delete_transient( 'bp_active_member_count' );
 319      bp_core_get_active_member_count();
 320      return array( 0, sprintf( $statement, __( 'Complete!', 'buddypress' ) ) );
 321  }
 322  
 323  /**
 324   * Repair user last_activity data.
 325   *
 326   * Re-runs the migration from usermeta introduced in BP 2.0.
 327   *
 328   * @since 2.0.0
 329   */
 330  function bp_admin_repair_last_activity() {
 331      /* translators: %s: the result of the action performed by the repair tool */
 332      $statement = __( 'Determining last activity dates for each user&hellip; %s', 'buddypress' );
 333      bp_last_activity_migrate();
 334      return array( 0, sprintf( $statement, __( 'Complete!', 'buddypress' ) ) );
 335  }
 336  
 337  /**
 338   * Create the invitations database table if it does not exist.
 339   * Migrate outstanding group invitations if needed.
 340   *
 341   * @since 6.0.0
 342   *
 343   * @return array
 344   */
 345  function bp_admin_invitations_table() {
 346      global $wpdb;
 347  
 348      require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
 349      require_once( buddypress()->plugin_dir . '/bp-core/admin/bp-core-admin-schema.php' );
 350  
 351      /* translators: %s: the result of the action performed by the repair tool */
 352      $statement = __( 'Creating the Invitations database table if it does not exist&hellip; %s', 'buddypress' );
 353      $result    = __( 'Failed to create table!', 'buddypress' );
 354  
 355      bp_core_install_invitations();
 356  
 357      // Check for existence of invitations table.
 358      $bp_prefix  = bp_core_get_table_prefix();
 359      $table_name = "{$bp_prefix}bp_invitations";
 360      $query = $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $table_name ) );
 361      if ( ! $wpdb->get_var( $query ) == $table_name ) {
 362          // Early return if table creation failed.
 363          return array( 2, sprintf( $statement, $result ) );
 364      } else {
 365          $result = __( 'Created invitations table!', 'buddypress' );
 366      }
 367  
 368      // Migrate group invitations if needed.
 369      if ( bp_is_active( 'groups' ) ) {
 370          $bp = buddypress();
 371  
 372          /* translators: %s: the result of the action performed by the repair tool */
 373          $migrate_statement = __( 'Migrating group invitations&hellip; %s', 'buddypress' );
 374          $migrate_result    = __( 'Failed to migrate invitations!', 'buddypress' );
 375  
 376          bp_groups_migrate_invitations();
 377  
 378          // Check that there are no outstanding group invites in the group_members table.
 379          $records = $wpdb->get_results( "SELECT id FROM {$bp->groups->table_name_members} WHERE is_confirmed = 0 AND is_banned = 0" );
 380          if ( empty( $records ) ) {
 381              $migrate_result = __( 'Migrated invitations!', 'buddypress' );
 382              return array( 0, sprintf( $statement . ' ' . $migrate_statement , $result, $migrate_result ) );
 383          } else {
 384              return array( 2, sprintf( $statement . ' ' . $migrate_statement , $result, $migrate_result ) );
 385          }
 386      }
 387  
 388      // Return a "create-only" success message.
 389      return array( 0, sprintf( $statement, $result ) );
 390  }
 391  
 392  /**
 393   * Assemble admin notices relating success/failure of repair processes.
 394   *
 395   * @since 2.0.0
 396   *
 397   * @param string      $message Feedback message.
 398   * @param string|bool $class   Unused.
 399   * @return false|Closure
 400   */
 401  function bp_admin_tools_feedback( $message, $class = false ) {
 402      if ( is_string( $message ) ) {
 403          $message = '<p>' . $message . '</p>';
 404          $class = $class ? $class : 'updated';
 405      } elseif ( is_wp_error( $message ) ) {
 406          $errors = $message->get_error_messages();
 407  
 408          switch ( count( $errors ) ) {
 409              case 0:
 410                  return false;
 411  
 412              case 1:
 413                  $message = '<p>' . $errors[0] . '</p>';
 414                  break;
 415  
 416              default:
 417                  $message = '<ul>' . "\n\t" . '<li>' . implode( '</li>' . "\n\t" . '<li>', $errors ) . '</li>' . "\n" . '</ul>';
 418                  break;
 419          }
 420  
 421          $class = $class ? $class : 'error';
 422      } else {
 423          return false;
 424      }
 425  
 426      $message = '<div id="message" class="' . esc_attr( $class ) . ' notice is-dismissible">' . $message . '</div>';
 427      $message = str_replace( "'", "\'", $message );
 428      $lambda  = function() use ( $message ) { echo $message; };
 429  
 430      add_action( bp_core_do_network_admin() ? 'network_admin_notices' : 'admin_notices', $lambda );
 431  
 432      return $lambda;
 433  }
 434  
 435  /**
 436   * Render the Available Tools page.
 437   *
 438   * We register this page on Network Admin as a top-level home for our
 439   * BuddyPress tools. This displays the default content.
 440   *
 441   * @since 2.0.0
 442   */
 443  function bp_core_admin_available_tools_page() {
 444      ?>
 445      <div class="wrap">
 446          <h1 class="wp-heading-inline"><?php esc_html_e( 'Tools', 'buddypress' ) ?></h1>
 447          <hr class="wp-header-end">
 448  
 449          <?php
 450  
 451          /**
 452           * Fires inside the markup used to display the Available Tools page.
 453           *
 454           * @since 2.0.0
 455           */
 456          do_action( 'bp_network_tool_box' ); ?>
 457  
 458      </div>
 459      <?php
 460  }
 461  
 462  /**
 463   * Render an introduction of BuddyPress tools on Available Tools page.
 464   *
 465   * @since 2.0.0
 466   */
 467  function bp_core_admin_available_tools_intro() {
 468      $query_arg = array(
 469          'page' => 'bp-tools'
 470      );
 471  
 472      $page = bp_core_do_network_admin() ? 'admin.php' : 'tools.php' ;
 473      $url  = add_query_arg( $query_arg, bp_get_admin_url( $page ) );
 474      ?>
 475      <div class="card tool-box">
 476          <h2><?php esc_html_e( 'BuddyPress Tools', 'buddypress' ) ?></h2>
 477          <p>
 478              <?php esc_html_e( 'BuddyPress keeps track of various relationships between users, groups, and activity items. Occasionally these relationships become out of sync, most often after an import, update, or migration.', 'buddypress' ); ?>
 479              <?php
 480              printf(
 481                  /* translators: %s: the link to the BuddyPress repair tools */
 482                  esc_html_x( 'Use the %s to repair these relationships.', 'buddypress tools intro', 'buddypress' ),
 483                  '<a href="' . esc_url( $url ) . '">' . esc_html__( 'BuddyPress Tools', 'buddypress' ) . '</a>'
 484              );
 485              ?>
 486          </p>
 487      </div>
 488      <?php
 489  }
 490  
 491  /**
 492   * Delete emails and restore from defaults.
 493   *
 494   * @since 2.5.0
 495   *
 496   * @return array
 497   */
 498  function bp_admin_reinstall_emails() {
 499      $switched = false;
 500  
 501      // Switch to the root blog, where the email posts live.
 502      if ( ! bp_is_root_blog() ) {
 503          switch_to_blog( bp_get_root_blog_id() );
 504          bp_register_taxonomies();
 505  
 506          $switched = true;
 507      }
 508  
 509      $emails = get_posts( array(
 510          'fields'           => 'ids',
 511          'post_status'      => 'publish',
 512          'post_type'        => bp_get_email_post_type(),
 513          'posts_per_page'   => 200,
 514          'suppress_filters' => false,
 515      ) );
 516  
 517      if ( $emails ) {
 518          foreach ( $emails as $email_id ) {
 519              wp_trash_post( $email_id );
 520          }
 521      }
 522  
 523      // Make sure we have no orphaned email type terms.
 524      $email_types = get_terms( bp_get_email_tax_type(), array(
 525          'fields'                 => 'ids',
 526          'hide_empty'             => false,
 527          'update_term_meta_cache' => false,
 528      ) );
 529  
 530      if ( $email_types ) {
 531          foreach ( $email_types as $term_id ) {
 532              wp_delete_term( (int) $term_id, bp_get_email_tax_type() );
 533          }
 534      }
 535  
 536      require_once( buddypress()->plugin_dir . '/bp-core/admin/bp-core-admin-schema.php' );
 537      bp_core_install_emails();
 538  
 539      if ( $switched ) {
 540          restore_current_blog();
 541      }
 542  
 543      return array( 0, __( 'Emails have been successfully reinstalled.', 'buddypress' ) );
 544  }
 545  
 546  /**
 547   * Add notice on the "Tools > BuddyPress" page if more sites need recording.
 548   *
 549   * This notice only shows up in the network admin dashboard.
 550   *
 551   * @since 2.6.0
 552   */
 553  function bp_core_admin_notice_repopulate_blogs_resume() {
 554      $screen = get_current_screen();
 555      if ( 'tools_page_bp-tools-network' !== $screen->id ) {
 556          return;
 557      }
 558  
 559      if ( '' === bp_get_option( '_bp_record_blogs_offset' ) ) {
 560          return;
 561      }
 562  
 563      echo '<div class="error"><p>' . __( 'It looks like you have more sites to record. Resume recording by checking the "Repopulate site tracking records" option.', 'buddypress' ) . '</p></div>';
 564  }
 565  add_action( 'network_admin_notices', 'bp_core_admin_notice_repopulate_blogs_resume' );
 566  
 567  /**
 568   * Add BuddyPress debug info to the WordPress Site Health info screen.
 569   *
 570   * @since 5.0.0
 571   *
 572   * @param  array $debug_info The Site's debug info.
 573   * @return array             The Site's debug info, including the BuddyPress specific ones.
 574   */
 575  function bp_core_admin_debug_information( $debug_info = array() ) {
 576      global $wp_settings_fields;
 577      $active_components = array_intersect_key( bp_core_get_components(), buddypress()->active_components );
 578      $bp_settings       = array();
 579  
 580      foreach ( $wp_settings_fields['buddypress'] as $section => $settings ) {
 581          $prefix       = '';
 582          $component_id = str_replace( 'bp_', '', $section );
 583  
 584          if ( isset( $active_components[ $component_id ]['title'] ) ) {
 585              $prefix = $active_components[ $component_id ]['title'] .': ';
 586          }
 587  
 588          foreach( $settings as $bp_setting ) {
 589              $reverse = (
 590                  strpos( $bp_setting['id'], 'hide' ) !== false ||
 591                  strpos( $bp_setting['id'], 'restrict' ) !== false ||
 592                  strpos( $bp_setting['id'], 'disable' ) !== false
 593              );
 594  
 595              if ( ! isset( $bp_setting['id'] ) || '_bp_theme_package_id' === $bp_setting['id'] ) {
 596                  continue;
 597              }
 598  
 599              $bp_setting_value = bp_get_option( $bp_setting['id'] );
 600              if ( '0' === $bp_setting_value || '1' === $bp_setting_value ) {
 601                  if ( ( $reverse && '0' === $bp_setting_value ) || ( ! $reverse && '1' === $bp_setting_value ) ) {
 602                      $bp_setting_value = __( 'Yes', 'buddypress' );
 603                  } else {
 604                      $bp_setting_value = __( 'No', 'buddypress' );
 605                  }
 606              }
 607  
 608              // Make sure to show the setting is reversed when site info is copied to clipboard.
 609              $bp_settings_id = $bp_setting['id'];
 610              if ( $reverse ) {
 611                  $bp_settings_id = '! ' . $bp_settings_id;
 612              }
 613  
 614              $bp_settings[ $bp_settings_id ] = array(
 615                  'label' => $prefix . $bp_setting['title'],
 616                  'value' => $bp_setting_value,
 617              );
 618          }
 619      }
 620  
 621      $debug_info['buddypress'] = array(
 622          'label'  => __( 'BuddyPress', 'buddypress' ),
 623          'fields' => array_merge(
 624              array(
 625                  'version' => array(
 626                      'label' => __( 'Version', 'buddypress' ),
 627                      'value' => bp_get_version(),
 628                  ),
 629                  'active_components' => array(
 630                      'label' => __( 'Active components', 'buddypress' ),
 631                      'value' => implode( wp_list_pluck( $active_components, 'title' ), ', ' ),
 632                  ),
 633                  'template_pack' => array(
 634                      'label' => __( 'Active template pack', 'buddypress' ),
 635                      'value' => bp_get_theme_compat_name() . ' ' . bp_get_theme_compat_version(),
 636                  ),
 637              ),
 638              $bp_settings
 639          )
 640      );
 641  
 642      return $debug_info;
 643  }
 644  add_filter( 'debug_information', 'bp_core_admin_debug_information' );


Generated: Wed Sep 23 01:01:33 2020 Cross-referenced by PHPXref 0.7.1