wp-global-admin.php
<?php
/**
* Plugin initialization file
*
* @package WPGlobalAdmin
* @since 1.0.0
*
* @wordpress-plugin
* Plugin Name: WP Global Admin
* Plugin URI: https://github.com/felixarntz/wp-global-admin
* Description: Introduces a global admin panel in WordPress.
* Version: 1.0.0-beta.1
* Author: Felix Arntz
* Author URI: https://leaves-and-love.net
* License: GNU General Public License v2 (or later)
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
* Text Domain: wp-global-admin
* Domain Path: /languages/
* Network: true
* Tags: global admin, network, multisite, multinetwork
*/
/**
* Loads the plugin textdomain.
*
* @since 1.0.0
*/
function ga_load_textdomain() {
load_plugin_textdomain( 'wp-global-admin', false, basename( dirname( __FILE__ ) ) . '/languages' );
}
/**
* Initializes the plugin.
*
* Loads the required files, registers the new DB table, global cache groups and global capabilities.
*
* @since 1.0.0
*/
function ga_init() {
if ( function_exists( 'go_init' ) ) {
require_once GA_PATH . 'wp-global-admin/wp-includes/load.php';
require_once GA_PATH . 'wp-global-admin/wp-includes/capabilities.php';
require_once GA_PATH . 'wp-global-admin/wp-includes/link-template.php';
require_once GA_PATH . 'wp-global-admin/wp-includes/admin-bar.php';
require_once GA_PATH . 'wp-global-admin/wp-includes/ms-functions.php';
require_once GA_PATH . 'wp-global-admin/wp-includes/ms-default-filters.php';
require_once GA_PATH . 'wp-global-admin/wp-includes/setup.php';
if ( is_admin() ) {
require_once GA_PATH . 'wp-global-admin/wp-admin/includes/hacks.php';
}
require_once ABSPATH . 'wp-admin/includes/plugin.php';
if ( is_plugin_active( 'wp-network-roles/wp-network-roles.php' ) ) {
require_once GA_PATH . 'wp-global-admin/network-roles-compat.php';
}
if ( is_plugin_active( 'wp-multi-network/wpmn-loader.php' ) ) {
require_once GA_PATH . 'wp-global-admin/multi-network-compat.php';
}
if ( is_plugin_active( 'wp-user-signups/wp-user-signups.php' ) ) {
require_once GA_PATH . 'wp-global-admin/user-signups-compat.php';
}
} else {
add_action( 'admin_notices', 'ga_requirements_notice_plugins' );
add_action( 'network_admin_notices', 'ga_requirements_notice_plugins' );
}
}
/**
* Shows an admin notice if the WordPress version installed is not supported.
*
* @since 1.0.0
*/
function ga_requirements_notice() {
$plugin_file = plugin_basename( __FILE__ );
if ( ! current_user_can( 'deactivate_plugin', $plugin_file ) ) {
return;
}
?>
<div class="notice notice-warning is-dismissible">
<p>
<?php
printf(
/* translators: %s: URL to deactivate plugin */
__( 'Please note: WP Global Admin requires WordPress 4.9 or higher. <a href="%s">Deactivate plugin</a>.', 'wp-global-admin' ),
wp_nonce_url(
add_query_arg(
array(
'action' => 'deactivate',
'plugin' => $plugin_file,
'plugin_status' => 'all',
),
network_admin_url( 'plugins.php' )
),
'deactivate-plugin_' . $plugin_file
)
);
?>
</p>
</div>
<?php
}
/**
* Shows an admin notice if the WP Global Options plugin is not installed and activated.
*
* @since 1.0.0
*/
function ga_requirements_notice_plugins() {
$plugin_file = plugin_basename( __FILE__ );
if ( ! current_user_can( 'install_plugins' ) ) {
return;
}
?>
<div class="notice notice-warning is-dismissible">
<p>
<?php
printf(
/* translators: %s: URL to deactivate plugin */
__( 'Please note: WP Global Admin requires the WP Global Options plugin to be installed and activated. <a href="%s">Install plugin</a>.', 'wp-global-admin' ),
wp_nonce_url(
add_query_arg(
array(
'action' => 'install-plugin',
'plugin' => 'wp-global-options',
),
network_admin_url( 'update.php' )
),
'install-plugin_wp-global-options'
)
);
?>
</p>
</div>
<?php
}
/**
* Ensures that this plugin gets activated in every new network by filtering the `active_sitewide_plugins` option.
*
* @since 1.0.0
*
* @param array $network_options All network options for the new network.
* @return array Modified network options including the plugin.
*/
function ga_activate_on_new_network( $network_options ) {
$plugin_file = plugin_basename( __FILE__ );
if ( ! isset( $network_options['active_sitewide_plugins'][ $plugin_file ] ) ) {
$network_options['active_sitewide_plugins'][ $plugin_file ] = time();
}
return $network_options;
}
/**
* Ensures that this plugin gets activated on a request to update the network-active plugins.
*
* @since 1.0.0
*
* @param array $plugins Associative array of `$plugin_basename => $time` pairs.
* @return array Modified array.
*/
function ga_activate_on_update_request( $plugins ) {
$network_options = ga_activate_on_new_network( array(
'active_sitewide_plugins' => $plugins,
) );
remove_filter( 'pre_update_site_option_active_sitewide_plugins', 'ga_activate_on_update_request' );
return $network_options['active_sitewide_plugins'];
}
/**
* Adds the hook to ensure that this plugin gets activated in every network created by WP Multi Network.
*
* @since 1.0.0
*/
function ga_activate_on_new_wpmn_network_add_hook() {
add_filter( 'pre_update_site_option_active_sitewide_plugins', 'ga_activate_on_update_request' );
}
/**
* Hooks in plugin initialization functionality.
*
* @since 1.0.0
*/
function ga_add_hooks() {
$file = wp_normalize_path( __FILE__ );
$mu_plugin_dir = wp_normalize_path( WPMU_PLUGIN_DIR );
$is_mu_plugin = (bool) preg_match( '#^' . preg_quote( $mu_plugin_dir, '#' ) . '/#', $file );
$plugin_hook = $is_mu_plugin ? 'muplugins_loaded' : 'plugins_loaded';
add_action( $plugin_hook, 'ga_load_textdomain', 1 );
if ( version_compare( $GLOBALS['wp_version'], '4.9', '<' ) ) {
add_action( 'admin_notices', 'ga_requirements_notice' );
add_action( 'network_admin_notices', 'ga_requirements_notice' );
return;
}
define( 'GA_PATH', plugin_dir_path( __FILE__ ) );
define( 'GA_URL', plugin_dir_url( __FILE__ ) );
add_action( $plugin_hook, 'ga_init' );
if ( ! $is_mu_plugin ) {
add_filter( 'populate_network_meta', 'ga_activate_on_new_network', 10, 1 );
add_action( 'add_network', 'ga_activate_on_new_wpmn_network_add_hook', 10, 0 );
}
}
ga_add_hooks();