File "class-bbp-admin.php"
Full Path: /home/jlklyejr/public_html/wp-content/test/test/test/wp-content/plugins/bbpress/includes/admin/classes/class-bbp-admin.php
File size: 44.82 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/**
* Main bbPress Admin Class
*
* @package bbPress
* @subpackage Administration
*/
// Exit if accessed directly
defined( 'ABSPATH' ) || exit;
if ( ! class_exists( 'BBP_Admin' ) ) :
/**
* Loads bbPress plugin admin area
*
* @package bbPress
* @subpackage Administration
* @since 2.0.0 bbPress (r2464)
*/
class BBP_Admin {
/** Directory *************************************************************/
/**
* @var string Path to the bbPress admin directory
*/
public $admin_dir = '';
/** URLs ******************************************************************/
/**
* @var string URL to the bbPress admin directory
*/
public $admin_url = '';
/**
* @var string URL to the bbPress images directory
*/
public $images_url = '';
/**
* @var string URL to the bbPress admin styles directory
*/
public $styles_url = '';
/**
* @var string URL to the bbPress admin css directory
*/
public $css_url = '';
/**
* @var string URL to the bbPress admin js directory
*/
public $js_url = '';
/** Capability ************************************************************/
/**
* @var bool Minimum capability to access Tools and Settings
*/
public $minimum_capability = 'keep_gate';
/** Separator *************************************************************/
/**
* @var bool Whether or not to add an extra top level menu separator
*/
public $show_separator = false;
/** Tools *****************************************************************/
/**
* @var array Array of available repair tools
*/
public $tools = array();
/** Notices ***************************************************************/
/**
* @var array Array of notices to output to the current user
*/
public $notices = array();
/** Functions *************************************************************/
/**
* The main bbPress admin loader
*
* @since 2.0.0 bbPress (r2515)
*/
public function __construct() {
$this->setup_globals();
$this->includes();
$this->setup_actions();
}
/**
* Admin globals
*
* @since 2.0.0 bbPress (r2646)
*
* @access private
*/
private function setup_globals() {
$bbp = bbpress();
$this->admin_dir = trailingslashit( $bbp->includes_dir . 'admin' ); // Admin path
$this->admin_url = trailingslashit( $bbp->includes_url . 'admin' ); // Admin url
// Assets
$this->css_url = trailingslashit( $this->admin_url . 'assets/css' ); // Admin css URL
$this->js_url = trailingslashit( $this->admin_url . 'assets/js' ); // Admin js URL
$this->styles_url = trailingslashit( $this->admin_url . 'styles' ); // Admin styles URL
// Deprecated
$this->images_url = trailingslashit( $this->admin_url . 'images' ); // Admin images URL
}
/**
* Include required files
*
* @since 2.0.0 bbPress (r2646)
*
* @access private
*/
private function includes() {
// Tools
require $this->admin_dir . 'tools.php';
require $this->admin_dir . 'tools/common.php';
require $this->admin_dir . 'tools/converter.php';
require $this->admin_dir . 'tools/repair.php';
require $this->admin_dir . 'tools/upgrade.php';
require $this->admin_dir . 'tools/reset.php';
require $this->admin_dir . 'tools/help.php';
// Components
require $this->admin_dir . 'settings.php';
require $this->admin_dir . 'common.php';
require $this->admin_dir . 'metaboxes.php';
require $this->admin_dir . 'forums.php';
require $this->admin_dir . 'topics.php';
require $this->admin_dir . 'replies.php';
require $this->admin_dir . 'users.php';
}
/**
* Setup the admin hooks, actions and filters
*
* @since 2.0.0 bbPress (r2646)
*
* @access private
*/
private function setup_actions() {
// Bail to prevent interfering with the deactivation process
if ( bbp_is_deactivation() ) {
return;
}
/** General Actions ***************************************************/
add_action( 'bbp_admin_menu', array( $this, 'admin_menus' ) );
add_action( 'bbp_admin_head', array( $this, 'admin_head' ) );
add_action( 'bbp_register_admin_styles', array( $this, 'register_admin_styles' ) );
add_action( 'bbp_register_admin_scripts', array( $this, 'register_admin_scripts' ) );
add_action( 'bbp_register_admin_settings', array( $this, 'register_admin_settings' ) );
// Enqueue styles & scripts
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_styles' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
/** Notices ***********************************************************/
add_action( 'bbp_admin_init', array( $this, 'setup_notices' ) );
add_action( 'bbp_admin_init', array( $this, 'hide_notices' ) );
add_action( 'bbp_admin_notices', array( $this, 'output_notices' ) );
/** Upgrades **********************************************************/
add_action( 'bbp_admin_init', array( $this, 'add_upgrade_count' ) );
/** Ajax **************************************************************/
// No _nopriv_ equivalent - users must be logged in
add_action( 'wp_ajax_bbp_suggest_topic', array( $this, 'suggest_topic' ) );
add_action( 'wp_ajax_bbp_suggest_user', array( $this, 'suggest_user' ) );
/** Filters ***********************************************************/
// Modify admin links
add_filter( 'plugin_action_links', array( $this, 'modify_plugin_action_links' ), 10, 2 );
// Map settings capabilities
add_filter( 'bbp_map_meta_caps', array( $this, 'map_settings_meta_caps' ), 10, 4 );
// Allow keymasters to save forums settings
add_filter( 'option_page_capability_bbpress', array( $this, 'option_page_capability_bbpress' ) );
/** Network Admin *****************************************************/
// Add menu item to settings menu
add_action( 'network_admin_menu', array( $this, 'network_admin_menus' ) );
/** Dependencies ******************************************************/
// Allow plugins to modify these actions
do_action_ref_array( 'bbp_admin_loaded', array( &$this ) );
}
/**
* Setup general admin area notices.
*
* @since 2.6.0 bbPress (r6701)
*/
public function setup_notices() {
// Avoid malformed notices variable
if ( ! is_array( $this->notices ) ) {
$this->notices = array();
}
// Get page
$page = ! empty( $_GET['page'] )
? sanitize_key( $_GET['page'] )
: false;
// Pending database upgrades!
if ( ( 'bbp-upgrade' !== $page ) && bbp_get_pending_upgrades() && current_user_can( 'bbp_tools_upgrade_page' ) ) {
// Link to upgrade page
$upgrade_url = add_query_arg( array( 'page' => 'bbp-upgrade', 'status' => 'pending' ), admin_url( 'tools.php' ) );
$dismiss_url = wp_nonce_url( add_query_arg( array( 'bbp-hide-notice' => 'bbp-skip-upgrades' ) ), 'bbp-hide-notice' );
$upgrade_link = '<a href="' . esc_url( $upgrade_url ) . '">' . esc_html__( 'Learn More', 'bbpress' ) . '</a>';
$dismiss_link = '<a href="' . esc_url( $dismiss_url ) . '">' . esc_html__( 'Hide For Now', 'bbpress' ) . '</a>';
$bbp_dashicon = '<span class="bbpress-logo-icon"></span>';
$message = $bbp_dashicon . sprintf(
esc_html__( 'bbPress requires a manual database upgrade. %s or %s.', 'bbpress' ),
$upgrade_link,
$dismiss_link
);
// Add tools feedback
$this->add_notice( $message, 'notice-bbpress', false );
}
}
/**
* Handle hiding of general admin area notices.
*
* @since 2.6.0 bbPress (r6701)
*/
public function hide_notices() {
// Hiding a notice?
$hiding_notice = ! empty( $_GET['bbp-hide-notice'] )
? sanitize_key( $_GET['bbp-hide-notice'] )
: false;
// Bail if not hiding a notice
if ( empty( $hiding_notice ) ) {
return;
}
// Bail if user cannot visit upgrade page (cannot clear notice either!)
if ( ! current_user_can( 'bbp_tools_upgrade_page' ) ) {
return;
}
// Check the admin referer
check_admin_referer( 'bbp-hide-notice' );
// Maybe delete notices
switch ( $hiding_notice ) {
// Skipped upgrade notice
case 'bbp-skip-upgrades' :
bbp_clear_pending_upgrades();
break;
}
}
/**
* Output all admin area notices
*
* @since 2.6.0 bbPress (r6771)
*/
public function output_notices() {
// Bail if no notices
if ( empty( $this->notices ) || ! is_array( $this->notices ) ) {
return;
}
// Start an output buffer
ob_start();
// Loop through notices, and add them to buffer
foreach ( $this->notices as $notice ) {
echo $notice;
}
// Output the current buffer
echo ob_get_clean();
}
/**
* Add a notice to the notices array
*
* @since 2.6.0 bbPress (r6771)
*
* @param string|WP_Error $message A message to be displayed or {@link WP_Error}
* @param string $class Optional. A class to be added to the message div
* @param bool $is_dismissible Optional. True to dismiss, false to persist
*
* @return void
*/
public function add_notice( $message, $class = false, $is_dismissible = true ) {
// One message as string
if ( is_string( $message ) ) {
$message = '<p>' . $this->esc_notice( $message ) . '</p>';
$default_class ='updated';
// Messages as objects
} elseif ( is_wp_error( $message ) ) {
$errors = $message->get_error_messages();
switch ( count( $errors ) ) {
case 0:
return false;
case 1:
$message = '<p>' . $this->esc_notice( $errors[0] ) . '</p>';
break;
default:
$escaped = array_map( array( $this, 'esc_notice' ), $errors );
$message = '<ul>' . "\n\t" . '<li>' . implode( '</li>' . "\n\t" . '<li>', $escaped ) . '</li>' . "\n" . '</ul>';
break;
}
$default_class = 'is-error';
// Message is an unknown format, so bail
} else {
return false;
}
// CSS Classes
$classes = ! empty( $class )
? array( $class )
: array( $default_class );
// Add dismissible class
if ( ! empty( $is_dismissible ) ) {
array_push( $classes, 'is-dismissible' );
}
// Assemble the message
$message = '<div id="message" class="notice ' . implode( ' ', array_map( 'sanitize_html_class', $classes ) ) . '">' . $message . '</div>';
$message = str_replace( "'", "\'", $message );
// Avoid malformed notices variable
if ( ! is_array( $this->notices ) ) {
$this->notices = array();
}
// Add notice to notices array
$this->notices[] = $message;
}
/**
* Escape message string output
*
* @since 2.6.0 bbPress (r6775)
*
* @param string $message
*
* @return string
*/
private function esc_notice( $message = '' ) {
// Get allowed HTML
$tags = wp_kses_allowed_html();
// Allow spans with classes in notices
$tags['span'] = array(
'class' => 1
);
// Parse the message and remove unsafe tags
$text = wp_kses( $message, $tags );
// Return the message text
return $text;
}
/**
* Maybe append the pending upgrade count to the "Tools" menu.
*
* @since 2.6.0 bbPress (r6896)
*
* @global menu $menu
*/
public function add_upgrade_count() {
global $menu;
// Skip if no menu (AJAX, shortinit, etc...)
if ( empty( $menu ) ) {
return;
}
// Loop through menus, and maybe add the upgrade count
foreach ( $menu as $menu_index => $menu_item ) {
$found = array_search( 'tools.php', $menu_item, true );
if ( false !== $found ) {
$menu[ $menu_index ][ 0 ] = bbp_maybe_append_pending_upgrade_count( $menu[ $menu_index ][ 0 ] );
continue;
}
}
}
/**
* Add the admin menus
*
* @since 2.0.0 bbPress (r2646)
*/
public function admin_menus() {
// Default hooks array
$hooks = array();
// Get the tools pages
$tools = bbp_get_tools_admin_pages();
// Loop through tools and check
if ( ! empty( $tools ) ) {
foreach ( $tools as $tool ) {
// Try to add the admin page
$page = add_management_page(
$tool['name'],
$tool['name'],
$tool['cap'],
$tool['page'],
$tool['func']
);
// Add page to hook if user can view it
if ( false !== $page ) {
$hooks[] = $page;
}
}
// Fudge the highlighted subnav item when on a bbPress admin page
if ( ! empty( $hooks ) ) {
foreach ( $hooks as $hook ) {
add_action( "admin_head-{$hook}", 'bbp_tools_modify_menu_highlight' );
}
}
}
// Forums Tools Root
add_management_page(
esc_html__( 'Forums', 'bbpress' ),
bbp_maybe_append_pending_upgrade_count( esc_html__( 'Forums', 'bbpress' ) ),
'bbp_tools_page',
'bbp-repair',
'bbp_admin_repair_page'
);
// Are settings enabled?
if ( 'basic' === bbp_settings_integration() ) {
add_options_page(
esc_html__( 'Forums', 'bbpress' ),
esc_html__( 'Forums', 'bbpress' ),
'bbp_settings_page',
'bbpress',
'bbp_admin_settings'
);
}
// These are later removed in admin_head
if ( current_user_can( 'bbp_about_page' ) ) {
// About
add_dashboard_page(
esc_html__( 'Welcome to bbPress', 'bbpress' ),
esc_html__( 'Welcome to bbPress', 'bbpress' ),
'bbp_about_page',
'bbp-about',
array( $this, 'about_screen' )
);
// Credits
add_dashboard_page(
esc_html__( 'Welcome to bbPress', 'bbpress' ),
esc_html__( 'Welcome to bbPress', 'bbpress' ),
'bbp_about_page',
'bbp-credits',
array( $this, 'credits_screen' )
);
}
// Bail if plugin is not network activated
if ( ! is_plugin_active_for_network( bbpress()->basename ) ) {
return;
}
add_submenu_page(
'index.php',
esc_html__( 'Update Forums', 'bbpress' ),
esc_html__( 'Update Forums', 'bbpress' ),
'manage_network',
'bbp-update',
array( $this, 'update_screen' )
);
}
/**
* Add the network admin menus
*
* @since 2.1.0 bbPress (r3689)
*/
public function network_admin_menus() {
// Bail if plugin is not network activated
if ( ! is_plugin_active_for_network( bbpress()->basename ) ) {
return;
}
add_submenu_page(
'upgrade.php',
esc_html__( 'Update Forums', 'bbpress' ),
esc_html__( 'Update Forums', 'bbpress' ),
'manage_network',
'bbpress-update',
array( $this, 'network_update_screen' )
);
}
/**
* Register the settings
*
* @since 2.0.0 bbPress (r2737)
*
* @todo Put fields into multidimensional array
*/
public static function register_admin_settings() {
// Bail if no sections available
$sections = bbp_admin_get_settings_sections();
if ( empty( $sections ) ) {
return false;
}
// Are we using settings integration?
$settings_integration = bbp_settings_integration();
// Loop through sections
foreach ( (array) $sections as $section_id => $section ) {
// Only proceed if current user can see this section
if ( ! current_user_can( $section_id ) ) {
continue;
}
// Only add section and fields if section has fields
$fields = bbp_admin_get_settings_fields_for_section( $section_id );
if ( empty( $fields ) ) {
continue;
}
// Overload the converter page
if ( ! empty( $section['page'] ) && ( ( 'converter' === $section['page'] ) || ( 'deep' === $settings_integration ) ) ) {
$page = $section['page'];
} else {
$page = 'bbpress';
}
// Add the section
add_settings_section( $section_id, $section['title'], $section['callback'], $page );
// Loop through fields for this section
foreach ( (array) $fields as $field_id => $field ) {
// Skip field if user is not capable
if ( ! empty( $field['capability'] ) && ! current_user_can( $field['capability'] ) ) {
continue;
}
// Add the field
if ( ! empty( $field['callback'] ) && ! empty( $field['title'] ) ) {
add_settings_field( $field_id, $field['title'], $field['callback'], $page, $section_id, $field['args'] );
}
// Register the setting
register_setting( $page, $field_id, $field['sanitize_callback'] );
}
}
}
/**
* Maps settings capabilities
*
* @since 2.2.0 bbPress (r4242)
*
* @param array $caps Capabilities for meta capability
* @param string $cap Capability name
* @param int $user_id User id
* @param array $args Arguments
*
* @return array Actual capabilities for meta capability
*/
public static function map_settings_meta_caps( $caps = array(), $cap = '', $user_id = 0, $args = array() ) {
// What capability is being checked?
switch ( $cap ) {
// Pages
case 'bbp_about_page' : // About and Credits
case 'bbp_tools_page' : // Tools Page
case 'bbp_tools_repair_page' : // Tools - Repair Page
case 'bbp_tools_upgrade_page' : // Tools - Upgrade Page
case 'bbp_tools_import_page' : // Tools - Import Page
case 'bbp_tools_reset_page' : // Tools - Reset Page
case 'bbp_settings_page' : // Settings Page
// Converter Sections
case 'bbp_converter_connection' : // Converter - Connection
case 'bbp_converter_options' : // Converter - Options
// Settings Sections
case 'bbp_settings_users' : // Settings - Users
case 'bbp_settings_features' : // Settings - Features
case 'bbp_settings_theme_compat' : // Settings - Theme compat
case 'bbp_settings_root_slugs' : // Settings - Root slugs
case 'bbp_settings_single_slugs' : // Settings - Single slugs
case 'bbp_settings_user_slugs' : // Settings - User slugs
case 'bbp_settings_per_page' : // Settings - Per page
case 'bbp_settings_per_rss_page' : // Settings - Per RSS page
$caps = array( bbp_admin()->minimum_capability );
break;
// Extend - BuddyPress
case 'bbp_settings_buddypress' :
if ( ( is_plugin_active( 'buddypress/bp-loader.php' ) && defined( 'BP_VERSION' ) && bp_is_root_blog() ) && is_super_admin() ) {
$caps = array( bbp_admin()->minimum_capability );
} else {
$caps = array( 'do_not_allow' );
}
break;
// Extend - Akismet
case 'bbp_settings_akismet' :
if ( ( is_plugin_active( 'akismet/akismet.php' ) && defined( 'AKISMET_VERSION' ) ) && is_super_admin() ) {
$caps = array( bbp_admin()->minimum_capability );
} else {
$caps = array( 'do_not_allow' );
}
break;
}
// Filter & return
return (array) apply_filters( 'bbp_map_settings_meta_caps', $caps, $cap, $user_id, $args );
}
/**
* Register the importers
*
* @since 2.0.0 bbPress (r2737)
*/
public function register_importers() {
// Leave if we're not in the import section
if ( ! defined( 'WP_LOAD_IMPORTERS' ) ) {
return;
}
// Load Importer API
require_once ABSPATH . 'wp-admin/includes/import.php';
// Load our importers
$importers = apply_filters( 'bbp_importers', array( 'bbpress' ) );
// Loop through included importers
foreach ( $importers as $importer ) {
// Allow custom importer directory
$import_dir = apply_filters( 'bbp_importer_path', $this->admin_dir . 'importers', $importer );
// Compile the importer path
$import_file = trailingslashit( $import_dir ) . $importer . '.php';
// If the file exists, include it
if ( file_exists( $import_file ) ) {
require $import_file;
}
}
}
/**
* Add Settings link to plugins area
*
* @since 2.0.0 bbPress (r2737)
*
* @param array $links Links array in which we would prepend our link
* @param string $file Current plugin basename
* @return array Processed links
*/
public static function modify_plugin_action_links( $links, $file ) {
// Return normal links if not bbPress
if ( plugin_basename( bbpress()->basename ) !== $file ) {
return $links;
}
// New links to merge into existing links
$new_links = array();
// Settings page link
if ( current_user_can( 'bbp_settings_page' ) ) {
$new_links['settings'] = '<a href="' . esc_url( add_query_arg( array( 'page' => 'bbpress' ), admin_url( 'options-general.php' ) ) ) . '">' . esc_html__( 'Settings', 'bbpress' ) . '</a>';
}
// About page link
if ( current_user_can( 'bbp_about_page' ) ) {
$new_links['about'] = '<a href="' . esc_url( add_query_arg( array( 'page' => 'bbp-about' ), admin_url( 'index.php' ) ) ) . '">' . esc_html__( 'About', 'bbpress' ) . '</a>';
}
// Add a few links to the existing links array
return array_merge( $links, $new_links );
}
/**
* Enqueue any admin scripts we might need
*
* @since 2.2.0 bbPress (r4260)
*/
public function enqueue_scripts() {
// Get the current screen
$current_screen = get_current_screen();
// Enqueue suggest for forum/topic/reply autocompletes
wp_enqueue_script( 'suggest' );
// Post type checker (only topics and replies)
if ( 'post' === $current_screen->base ) {
switch ( $current_screen->post_type ) {
case bbp_get_reply_post_type() :
case bbp_get_topic_post_type() :
// Enqueue the common JS
wp_enqueue_script( 'bbp-admin-common-js' );
// Topics admin
if ( bbp_get_topic_post_type() === $current_screen->post_type ) {
wp_enqueue_script( 'bbp-admin-topics-js' );
// Replies admin
} elseif ( bbp_get_reply_post_type() === $current_screen->post_type ) {
wp_enqueue_script( 'bbp-admin-replies-js' );
}
break;
}
// Enqueue the badge JS
} elseif ( in_array( $current_screen->id, array( 'dashboard_page_bbp-about', 'dashboard_page_bbp-credits' ), true ) ) {
wp_enqueue_script( 'bbp-admin-badge-js' );
}
}
/**
* Enqueue any admin scripts we might need
*
* @since 2.6.0 bbPress (r5224)
*/
public function enqueue_styles() {
wp_enqueue_style( 'bbp-admin-css' );
}
/**
* Remove the individual recount and converter menus.
* They are grouped together by h2 tabs
*
* @since 2.0.0 bbPress (r2464)
*/
public function admin_head() {
// Tools
foreach ( bbp_get_tools_admin_pages() as $tool ) {
remove_submenu_page( 'tools.php', $tool['page'] );
}
// About
remove_submenu_page( 'index.php', 'bbp-about' );
remove_submenu_page( 'index.php', 'bbp-credits' );
}
/**
* Registers the bbPress admin styling and color schemes
*
* Because wp-content can exist outside of the WordPress root, there is no
* way to be certain what the relative path of admin images is.
*
* @since 2.6.0 bbPress (r2521)
*/
public function register_admin_styles() {
// RTL and/or minified
$suffix = is_rtl() ? '-rtl' : '';
$suffix .= defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
// Get the version to use for JS
$version = bbp_get_version();
// Register admin CSS with dashicons dependency
wp_register_style( 'bbp-admin-css', $this->css_url . 'admin' . $suffix . '.css', array( 'dashicons' ), $version );
// Color schemes are not available when running out of src
if ( false !== strpos( plugin_basename( bbpress()->file ), 'src' ) ) {
return;
}
// Mint
wp_admin_css_color(
'bbp-mint',
esc_html_x( 'Mint', 'admin color scheme', 'bbpress' ),
$this->styles_url . 'mint/colors' . $suffix . '.css',
array( '#4f6d59', '#33834e', '#5FB37C', '#81c498' ),
array( 'base' => '#f1f3f2', 'focus' => '#fff', 'current' => '#fff' )
);
// Evergreen
wp_admin_css_color(
'bbp-evergreen',
esc_html_x( 'Evergreen', 'admin color scheme', 'bbpress' ),
$this->styles_url . 'evergreen/colors' . $suffix . '.css',
array( '#324d3a', '#446950', '#56b274', '#324d3a' ),
array( 'base' => '#f1f3f2', 'focus' => '#fff', 'current' => '#fff' )
);
}
/**
* Registers the bbPress admin color schemes
*
* Because wp-content can exist outside of the WordPress root there is no
* way to be certain what the relative path of the admin images is.
* We are including the two most common configurations here, just in case.
*
* @since 2.6.0 bbPress (r2521)
*/
public function register_admin_scripts() {
// Minified
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
// Get the version to use for JS
$version = bbp_get_version();
// Header JS
wp_register_script( 'bbp-admin-common-js', $this->js_url . 'common' . $suffix . '.js', array( 'jquery', 'suggest' ), $version );
wp_register_script( 'bbp-admin-topics-js', $this->js_url . 'topics' . $suffix . '.js', array( 'jquery' ), $version );
wp_register_script( 'bbp-admin-replies-js', $this->js_url . 'replies' . $suffix . '.js', array( 'jquery', 'suggest' ), $version );
wp_register_script( 'bbp-converter', $this->js_url . 'converter' . $suffix . '.js', array( 'jquery', 'postbox', 'dashboard' ), $version );
// Footer JS
wp_register_script( 'bbp-admin-badge-js', $this->js_url . 'badge' . $suffix . '.js', array(), $version, true );
}
/**
* Allow keymaster role to save Forums settings
*
* @since 2.3.0 bbPress (r4678)
*
* @param string $capability
* @return string Return minimum capability
*/
public function option_page_capability_bbpress( $capability = 'manage_options' ) {
$capability = $this->minimum_capability;
return $capability;
}
/** Ajax ******************************************************************/
/**
* Ajax action for facilitating the forum auto-suggest
*
* @since 2.2.0 bbPress (r4261)
*/
public function suggest_topic() {
// Do some very basic request checking
$request = ! empty( $_REQUEST['q'] )
? trim( $_REQUEST['q'] )
: '';
// Bail early if empty request
if ( empty( $request ) ) {
wp_die();
}
// Bail if user cannot moderate
if ( ! current_user_can( 'moderate' ) ) {
wp_die();
}
// Check the ajax nonce
check_ajax_referer( 'bbp_suggest_topic_nonce' );
// Allow the maximum number of results to be filtered
$number = (int) apply_filters( 'bbp_suggest_topic_count', 10 );
// Try to get some topics
$topics = get_posts( array(
's' => bbp_db()->esc_like( $_REQUEST['q'] ),
'post_type' => bbp_get_topic_post_type(),
'posts_per_page' => $number,
// Performance
'nopaging' => true,
'suppress_filters' => true,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
'ignore_sticky_posts' => true,
'no_found_rows' => true
) );
// If we found some topics, loop through and display them
if ( ! empty( $topics ) ) {
foreach ( (array) $topics as $post ) {
printf( esc_html__( '%1$s - %2$s', 'bbpress' ), bbp_get_topic_id( $post->ID ), bbp_get_topic_title( $post->ID ) . "\n" );
}
}
die();
}
/**
* Ajax action for facilitating the topic and reply author auto-suggest
*
* @since 2.4.0 bbPress (r5014)
*/
public function suggest_user() {
// Do some very basic request checking
$request = ! empty( $_REQUEST['q'] )
? trim( $_REQUEST['q'] )
: '';
// Bail early if empty request
if ( empty( $request ) ) {
wp_die();
}
// Bail if user cannot moderate
if ( ! current_user_can( 'moderate' ) ) {
wp_die();
}
// Check the ajax nonce
check_ajax_referer( 'bbp_suggest_user_nonce' );
// Fields to retrieve & search by
$fields = $search = array( 'ID', 'user_nicename' );
// Keymasters & Super-Mods can also search by email
if ( current_user_can( 'keep_gate' ) || bbp_allow_super_mods() ) {
// Add user_email to searchable columns
array_push( $search, 'user_email' );
// Unstrict to also allow some email characters
$strict = false;
// Strict sanitizing if not Keymaster or Super-Mod
} else {
$strict = true;
}
// Sanitize the request value (possibly not strictly)
$suggest = sanitize_user( $request, $strict );
// Bail if searching for invalid user string
if ( empty( $suggest ) ) {
wp_die();
}
// These single characters should not trigger a user query
$disallowed_single_chars = array( '@', '.', '_', '-', '+', '!', '#', '$', '%', '&', '\\', '*', '+', '/', '=', '?', '^', '`', '{', '|', '}', '~' );
// Bail if request is only for the above single characters
if ( in_array( $suggest, $disallowed_single_chars, true ) ) {
wp_die();
}
// Allow the maximum number of results to be filtered
$number = (int) apply_filters( 'bbp_suggest_user_count', 10 );
// Query database for users based on above criteria
$users_query = new WP_User_Query( array(
'search' => '*' . bbp_db()->esc_like( $suggest ) . '*',
'fields' => $fields,
'search_columns' => $search,
'orderby' => 'ID',
'number' => $number,
'count_total' => false
) );
// If we found some users, loop through and output them to the AJAX
if ( ! empty( $users_query->results ) ) {
foreach ( (array) $users_query->results as $user ) {
printf( esc_html__( '%1$s - %2$s', 'bbpress' ), bbp_get_user_id( $user->ID ), bbp_get_user_nicename( $user->ID, array( 'force' => $user->user_nicename ) ) . "\n" );
}
}
die();
}
/** About *****************************************************************/
/**
* Output the shared screen header for about_screen() & credits_screen()
*
* Contains title, subtitle, and badge area
*
* @since 2.6.0 bbPress (r6604)
*/
private function screen_header() {
list( $display_version ) = explode( '-', bbp_get_version() ); ?>
<h1 class="wp-heading-inline"><?php printf( esc_html__( 'Welcome to bbPress %s', 'bbpress' ), $display_version ); ?></h1>
<hr class="wp-header-end">
<div class="about-text"><?php printf( esc_html__( 'bbPress is fun to use, contains no artificial colors or preservatives, and is absolutely wonderful in every environment. Your community is going to love using it.', 'bbpress' ), $display_version ); ?></div>
<span class="bbp-hive" id="bbp-hive"></span>
<div class="bbp-badge" id="bbp-badge">
<span class="bbp-bee" id="bbp-bee"></span>
</div>
<?php
}
/**
* Output the about screen
*
* @since 2.2.0 bbPress (r4159)
*
* @todo Host this remotely.
*/
public function about_screen() {
?>
<div class="wrap about-wrap">
<?php $this->screen_header(); ?>
<h2 class="nav-tab-wrapper">
<a class="nav-tab nav-tab-active" href="<?php echo esc_url( add_query_arg( array( 'page' => 'bbp-about' ), admin_url( 'index.php' ) ) ); ?>">
<?php esc_html_e( 'What’s New', 'bbpress' ); ?>
</a><a class="nav-tab" href="<?php echo esc_url( add_query_arg( array( 'page' => 'bbp-credits' ), admin_url( 'index.php' ) ) ); ?>">
<?php esc_html_e( 'Credits', 'bbpress' ); ?>
</a>
</h2>
<div class="changelog">
<h3><?php esc_html_e( 'Forum Subscriptions', 'bbpress' ); ?></h3>
<div class="feature-section col two-col">
<div class="last-feature">
<h4><?php esc_html_e( 'Subscribe to Forums', 'bbpress' ); ?></h4>
<p><?php esc_html_e( 'Now your users can subscribe to new topics in specific forums.', 'bbpress' ); ?></p>
</div>
<div>
<h4><?php esc_html_e( 'Manage Subscriptions', 'bbpress' ); ?></h4>
<p><?php esc_html_e( 'Your users can manage all of their subscriptions in one convenient location.', 'bbpress' ); ?></p>
</div>
</div>
</div>
<div class="changelog">
<h3><?php esc_html_e( 'Converters', 'bbpress' ); ?></h3>
<div class="feature-section col one-col">
<div class="last-feature">
<p><?php esc_html_e( 'We’re all abuzz about the hive of new importers, AEF, Drupal, FluxBB, Kunena Forums for Joomla, MyBB, Phorum, PHPFox, PHPWind, PunBB, SMF, Xenforo and XMB. Existing importers are now sweeter than honey with improved importing stickies, topic tags, forum categories and the sting is now gone if you need to remove imported users.', 'bbpress' ); ?></p>
</div>
</div>
<div class="feature-section col three-col">
<div>
<h4><?php esc_html_e( 'Theme Compatibility', 'bbpress' ); ?></h4>
<p><?php esc_html_e( 'Better handling of styles and scripts in the template stack.', 'bbpress' ); ?></p>
</div>
<div>
<h4><?php esc_html_e( 'Polyglot support', 'bbpress' ); ?></h4>
<p><?php esc_html_e( 'bbPress fully supports automatic translation updates.', 'bbpress' ); ?></p>
</div>
<div class="last-feature">
<h4><?php esc_html_e( 'User capabilities', 'bbpress' ); ?></h4>
<p><?php esc_html_e( 'Roles and capabilities have been swept through, cleaned up, and simplified.', 'bbpress' ); ?></p>
</div>
</div>
</div>
<div class="return-to-dashboard">
<a href="<?php echo esc_url( add_query_arg( array( 'page' => 'bbpress' ), admin_url( 'options-general.php' ) ) ); ?>"><?php esc_html_e( 'Go to Forum Settings', 'bbpress' ); ?></a>
</div>
</div>
<?php
}
/**
* Output the credits screen
*
* @since 2.2.0 bbPress (r4159)
*
* @todo Host this remotely.
*/
public function credits_screen() {
?>
<div class="wrap about-wrap">
<?php $this->screen_header(); ?>
<h2 class="nav-tab-wrapper">
<a href="<?php echo esc_url( add_query_arg( array( 'page' => 'bbp-about' ), admin_url( 'index.php' ) ) ); ?>" class="nav-tab">
<?php esc_html_e( 'What’s New', 'bbpress' ); ?>
</a><a href="<?php echo esc_url( add_query_arg( array( 'page' => 'bbp-credits' ), admin_url( 'index.php' ) ) ); ?>" class="nav-tab nav-tab-active">
<?php esc_html_e( 'Credits', 'bbpress' ); ?>
</a>
</h2>
<p class="about-description"><?php esc_html_e( 'bbPress is created by a worldwide swarm of busy, busy bees.', 'bbpress' ); ?></p>
<h3 class="wp-people-group"><?php esc_html_e( 'Project Leaders', 'bbpress' ); ?></h3>
<ul class="wp-people-group " id="wp-people-group-project-leaders">
<li class="wp-person" id="wp-person-matt">
<a href="https://profiles.wordpress.org/matt" class="web"><img src="http://0.gravatar.com/avatar/767fc9c115a1b989744c755db47feb60?s=120" class="gravatar" alt="" />Matt Mullenweg</a>
<span class="title"><?php esc_html_e( 'Founding Developer', 'bbpress' ); ?></span>
</li>
<li class="wp-person" id="wp-person-johnjamesjacoby">
<a href="https://profiles.wordpress.org/johnjamesjacoby" class="web"><img src="http://0.gravatar.com/avatar/7a2644fb53ae2f7bfd7143b504af396c?s=120" class="gravatar" alt="" />John James Jacoby</a>
<span class="title"><?php esc_html_e( 'Lead Developer', 'bbpress' ); ?></span>
</li>
<li class="wp-person" id="wp-person-jmdodd">
<a href="https://profiles.wordpress.org/jmdodd" class="web"><img src="http://0.gravatar.com/avatar/6a7c997edea340616bcc6d0fe03f65dd?s=120" class="gravatar" alt="" />Jennifer M. Dodd</a>
<span class="title"><?php esc_html_e( 'Feature Virtuoso', 'bbpress' ); ?></span>
</li>
<li class="wp-person" id="wp-person-netweb">
<a href="https://profiles.wordpress.org/netweb" class="web"><img src="http://0.gravatar.com/avatar/97e1620b501da675315ba7cfb740e80f?s=120" class="gravatar" alt="" />Stephen Edgar</a>
<span class="title"><?php esc_html_e( 'Tool Maven', 'bbpress' ); ?></span>
</li>
</ul>
<h3 class="wp-people-group"><?php esc_html_e( 'Contributing Developers', 'bbpress' ); ?></h3>
<ul class="wp-people-group " id="wp-people-group-contributing-developers">
<li class="wp-person" id="wp-person-sergeybiryukov">
<a href="https://profiles.wordpress.org/SergeyBiryukov" class="web"><img src="http://0.gravatar.com/avatar/750b7b0fcd855389264c2b1294d61bd6?s=120" class="gravatar" alt="" />Sergey Biryukov</a>
<span class="title"><?php esc_html_e( 'Core Developer', 'bbpress' ); ?></span>
</li>
<li class="wp-person" id="wp-person-thebrandonallen">
<a href="https://profiles.wordpress.org/thebrandonallen" class="web"><img src="http://0.gravatar.com/avatar/6d3f77bf3c9ca94c406dea401b566950?s?s=120" class="gravatar" alt="" />Brandon Allen</a>
<span class="title"><?php esc_html_e( 'Core Developer', 'bbpress' ); ?></span>
</li>
</ul>
<h3 class="wp-people-group"><?php esc_html_e( 'Project Emeriti', 'bbpress' ); ?></h3>
<ul class="wp-people-group " id="wp-people-group-project-emeriti">
<li class="wp-person" id="wp-person-gautamgupta">
<a href="https://profiles.wordpress.org/gautamgupta" class="web"><img src="http://0.gravatar.com/avatar/b0810422cbe6e4eead4def5ae7a90b34?s=120" class="gravatar" alt="" />Gautam Gupta</a>
<span class="title"><?php esc_html_e( 'Feature Developer', 'bbpress' ); ?></span>
</li>
<li class="wp-person" id="wp-person-jaredatch">
<a href="https://profiles.wordpress.org/jaredatch" class="web"><img src="http://0.gravatar.com/avatar/e341eca9e1a85dcae7127044301b4363?s=120" class="gravatar" alt="" />Jared Atchison</a>
<span class="title"><?php esc_html_e( 'Integration Testing', 'bbpress' ); ?></span>
</li>
</ul>
<h3 class="wp-people-group"><?php esc_html_e( 'Contributors to bbPress 2.6', 'bbpress' ); ?></h3>
<p class="wp-credits-list">
<a href="https://profiles.wordpress.org/alex-ye">alex-ye</a>,
<a href="https://profiles.wordpress.org/ankit-k-gupta">ankit-k-gupta</a>,
<a href="https://profiles.wordpress.org/barryhughes-1">barryhughes-1</a>,
<a href="https://profiles.wordpress.org/boonebgorges">boonebgorges</a>,
<a href="https://profiles.wordpress.org/casiepa">casiepa</a>,
<a href="https://profiles.wordpress.org/cfinke">cfinke</a>,
<a href="https://profiles.wordpress.org/danielbachhuber">danielbachhuber</a>,
<a href="https://profiles.wordpress.org/dimitrovadrian">dimitrov.adrian</a>,
<a href="https://profiles.wordpress.org/DJPaul">DJPaul</a>,
<a href="https://profiles.wordpress.org/DrPepper75">DrPepper75</a>,
<a href="https://profiles.wordpress.org/eoigal">eoigal</a>,
<a href="https://profiles.wordpress.org/ericlewis">ericlewis</a>,
<a href="https://profiles.wordpress.org/extendwings">extendwings</a>,
<a href="https://profiles.wordpress.org/Faison">Faison</a>,
<a href="https://profiles.wordpress.org/gautamgupta">gautamgupta</a>,
<a href="https://profiles.wordpress.org/glynwintle">glynwintle</a>,
<a href="https://profiles.wordpress.org/gusrb84">gusrb84</a>,
<a href="https://profiles.wordpress.org/hellofromTonya">hellofromTonya</a>,
<a href="https://profiles.wordpress.org/icu0755">icu0755</a>,
<a href="https://profiles.wordpress.org/imath">imath</a>,
<a href="https://profiles.wordpress.org/jbrinley">jbrinley</a>,
<a href="https://profiles.wordpress.org/jdgrimes">jdgrimes</a>,
<a href="https://profiles.wordpress.org/jmdodd">jmdodd</a>,
<a href="https://profiles.wordpress.org/joedolson">joedolson</a>,
<a href="https://profiles.wordpress.org/johnbillion">johnbillion</a>,
<a href="https://profiles.wordpress.org/johnjamesjacoby">johnjamesjacoby</a>,
<a href="https://profiles.wordpress.org/jorbin">jorbin</a>,
<a href="https://profiles.wordpress.org/jreeve">jreeve</a>,
<a href="https://profiles.wordpress.org/kadamwhite ">kadamwhite</a>,
<a href="https://profiles.wordpress.org/karlgroves">karlgroves</a>,
<a href="https://profiles.wordpress.org/mat-lipe">mat-lipe</a>,
<a href="https://profiles.wordpress.org/mazengamal">mazengamal</a>,
<a href="https://profiles.wordpress.org/melchoyce">melchoyce</a>,
<a href="https://profiles.wordpress.org/mercime">mercime</a>,
<a href="https://profiles.wordpress.org/michaelbeil">michaelbeil</a>,
<a href="https://profiles.wordpress.org/mikelopez">mikelopez</a>,
<a href="https://profiles.wordpress.org/mordauk">mordauk</a>,
<a href="https://profiles.wordpress.org/mspecht">mspecht</a>,
<a href="https://profiles.wordpress.org/MZAWeb">MZAWeb</a>,
<a href="https://profiles.wordpress.org/netweb">netweb</a>,
<a href="https://profiles.wordpress.org/ocean90">ocean90</a>,
<a href="https://profiles.wordpress.org/offereins">offereins</a>,
<a href="https://profiles.wordpress.org/pareshradadiya">pareshradadiya</a>,
<a href="https://profiles.wordpress.org/r-a-y">r-a-y</a>,
<a href="https://profiles.wordpress.org/ramiy">ramiy</a>,
<a href="https://profiles.wordpress.org/robin-w">robin-w</a>,
<a href="https://profiles.wordpress.org/robkk">robkk</a>,
<a href="https://profiles.wordpress.org/ryelle">ryelle</a>,
<a href="https://profiles.wordpress.org/satollo">satollo</a>,
<a href="https://profiles.wordpress.org/SergeyBiryukov">Sergey Biryukov</a>,
<a href="https://profiles.wordpress.org/SGr33n">SGr33n</a>,
<a href="https://profiles.wordpress.org/stephdau">stephdau</a>,
<a href="https://profiles.wordpress.org/tharsheblows">tharsheblows</a>,
<a href="https://profiles.wordpress.org/thebrandonallen">thebrandonallen</a>,
<a href="https://profiles.wordpress.org/tobyhawkins">tobyhawkins</a>,
<a href="https://profiles.wordpress.org/tonyrix">tonyrix</a>,
<a href="https://profiles.wordpress.org/treyhunner">treyhunner</a>,
<a href="https://profiles.wordpress.org/tw2113">tw2113</a>,
<a href="https://profiles.wordpress.org/xknown">xknown</a>
</p>
<div class="return-to-dashboard">
<a href="<?php echo esc_url( add_query_arg( array( 'page' => 'bbpress' ), admin_url( 'options-general.php' ) ) ); ?>"><?php esc_html_e( 'Go to Forum Settings', 'bbpress' ); ?></a>
</div>
</div>
<?php
}
/** Updaters **************************************************************/
/**
* Update all bbPress forums across all sites
*
* @since 2.1.0 bbPress (r3689)
*/
public static function update_screen() {
// Get action
$action = isset( $_GET['action'] ) ? $_GET['action'] : ''; ?>
<div class="wrap">
<h1 class="wp-heading-inline"><?php esc_html_e( 'Update Forum', 'bbpress' ); ?></h1>
<hr class="wp-header-end">
<?php
// Taking action
switch ( $action ) {
case 'bbp-update' :
// Run the full updater
bbp_version_updater(); ?>
<p><?php esc_html_e( 'All done!', 'bbpress' ); ?></p>
<a class="button" href="index.php?page=bbp-update"><?php esc_html_e( 'Go Back', 'bbpress' ); ?></a>
<?php
break;
case 'show' :
default : ?>
<p><?php esc_html_e( 'You can update your forum through this page. Hit the link below to update.', 'bbpress' ); ?></p>
<p><a class="button" href="index.php?page=bbp-update&action=bbp-update"><?php esc_html_e( 'Update Forum', 'bbpress' ); ?></a></p>
<?php break;
} ?>
</div><?php
}
/**
* Update all bbPress forums across all sites
*
* @since 2.1.0 bbPress (r3689)
*/
public static function network_update_screen() {
$bbp_db = bbp_db();
// Get action
$action = isset( $_GET['action'] ) ? $_GET['action'] : ''; ?>
<div class="wrap">
<h1 class="wp-heading-inline"><?php esc_html_e( 'Update Forums', 'bbpress' ); ?></h1>
<hr class="wp-header-end">
<?php
// Taking action
switch ( $action ) {
case 'bbpress-update' :
// Site counter
$n = isset( $_GET['n'] ) ? intval( $_GET['n'] ) : 0;
// Get blogs 5 at a time
$blogs = $bbp_db->get_results( "SELECT * FROM {$bbp_db->blogs} WHERE site_id = '{$bbp_db->siteid}' AND spam = '0' AND deleted = '0' AND archived = '0' ORDER BY registered DESC LIMIT {$n}, 5", ARRAY_A );
// No blogs so all done!
if ( empty( $blogs ) ) : ?>
<p><?php esc_html_e( 'All done!', 'bbpress' ); ?></p>
<a class="button" href="update-core.php?page=bbpress-update"><?php esc_html_e( 'Go Back', 'bbpress' ); ?></a>
<?php
// Still have sites to loop through
else : ?>
<ul>
<?php foreach ( (array) $blogs as $details ) :
// Get site URLs
$site_url = get_site_url( $details['blog_id'] );
$admin_url = get_site_url( $details['blog_id'], 'wp-admin.php', 'admin' );
$remote_url = add_query_arg( array(
'page' => 'bbp-update',
'action' => 'bbp-update'
), $admin_url ); ?>
<li><?php echo esc_html( $site_url ); ?></li>
<?php
// Get the response of the bbPress update on this site
$response = wp_remote_get(
$remote_url,
array(
'timeout' => 30,
'httpversion' => '1.1'
)
);
// Site errored out, no response?
if ( is_wp_error( $response ) ) {
wp_die( sprintf( esc_html__( 'Warning! Problem updating %1$s. Your server may not be able to connect to sites running on it. Error message: %2$s', 'bbpress' ), $site_url, '<em>' . $response->get_error_message() . '</em>' ) );
}
// Switch to the new site
bbp_switch_to_site( $details[ 'blog_id' ] );
$basename = bbpress()->basename;
// Run the updater on this site
if ( is_plugin_active_for_network( $basename ) || is_plugin_active( $basename ) ) {
bbp_version_updater();
}
// Restore original site
bbp_restore_current_site();
// Do some actions to allow plugins to do things too
do_action( 'after_bbpress_upgrade', $response );
do_action( 'bbp_upgrade_site', $details[ 'blog_id' ] );
endforeach; ?>
</ul>
<p>
<?php esc_html_e( 'If your browser doesn’t start loading the next page automatically, click this link:', 'bbpress' ); ?>
<a class="button" href="update-core.php?page=bbpress-update&action=bbpress-update&n=<?php echo ( $n + 5 ); ?>"><?php esc_html_e( 'Next Forums', 'bbpress' ); ?></a>
</p>
<script type='text/javascript'>
<!--
function nextpage() {
location.href = 'update-core.php?page=bbpress-update&action=bbpress-update&n=<?php echo ( $n + 5 ) ?>';
}
setTimeout( 'nextpage()', 250 );
//-->
</script><?php
endif;
break;
case 'show' :
default : ?>
<p><?php esc_html_e( 'You can update all the forums on your network through this page. It works by calling the update script of each site automatically. Hit the link below to update.', 'bbpress' ); ?></p>
<p><a class="button" href="update-core.php?page=bbpress-update&action=bbpress-update"><?php esc_html_e( 'Update Forums', 'bbpress' ); ?></a></p>
<?php break;
} ?>
</div><?php
}
}
endif; // class_exists check