felixarntz/global-admin

View on GitHub
wp-global-admin/multi-network-compat.php

Summary

Maintainability
A
55 mins
Test Coverage
<?php
/**
 * Compatibility with WP Multi Network plugin
 *
 * @package WPGlobalAdmin
 * @since 1.0.0
 */

foreach ( array( 'add_network', 'delete_network' ) as $action ) {
    add_action( $action, 'wp_maybe_update_global_network_counts' );
}

unset( $action );

/**
 * Adjusts the global administrator capabilities.
 *
 * @since 1.0.0
 * @access private
 *
 * @param array $global_capabilities List of global capabilities.
 * @return array Modified list of global capabilities.
 */
function _ga_add_global_multinetwork_capabilities( $global_capabilities ) {
    $global_capabilities[] = 'manage_networks';

    return $global_capabilities;
}
add_filter( 'global_admin_capabilities', '_ga_add_global_multinetwork_capabilities' );

/**
 * Adjusts the network menus for WP Multi Network to be in the global administration panel.
 *
 * @since 1.0.0
 * @access private
 */
function _ga_adjust_multinetwork_menus() {
    $admin = wpmn()->admin;
    if ( is_null( $admin ) ) {
        return;
    }

    remove_action( 'admin_menu', array( $admin, 'admin_menu' ) );
    remove_action( 'network_admin_menu', array( $admin, 'network_admin_menu' ) );
    remove_action( 'network_admin_menu', array( $admin, 'network_admin_menu_separator' ) );

    if ( is_multinetwork() ) {
        add_action( 'global_admin_menu', array( $admin, 'network_admin_menu' ) );
        add_action( 'global_admin_menu', '_ga_adjust_multinetwork_menu_position', 11 );
    }
}
add_action( 'init', '_ga_adjust_multinetwork_menus' );

/**
 * Adjusts the position of the Networks admin menu in the global administration panel.
 *
 * @since 1.0.0
 * @access private
 */
function _ga_adjust_multinetwork_menu_position() {
    global $menu;

    if ( ! isset( $menu[-1] ) ) {
        return;
    }

    $networks_menu = $menu[-1];
    if ( 'networks' !== $networks_menu[2] ) {
        return;
    }

    unset( $menu[-1] );

    if ( isset( $menu[5] ) ) {
        $position = 5 + substr( base_convert( md5( $networks_menu[2] . $networks_menu[0] ), 16, 10 ) , -5 ) * 0.00001;
        $menu[ "$position" ] = $networks_menu;
    } else {
        $menu[5] = $networks_menu;
    }
}

/**
 * Adjusts the URL to the networks admin page to be part of the global administration panel.
 *
 * @since 1.0.0
 * @access private
 *
 * @param string $url  The original URL.
 * @param array  $args Additional query arguments for the URL.
 * @return string The adjusted URL.
 */
function _ga_adjust_multinetwork_admin_url( $url, $args ) {
    if ( ! is_multinetwork() ) {
        return $url;
    }

    $args = wp_parse_args( $args, array(
        'page' => 'networks',
    ) );

    return add_query_arg( $args, global_admin_url( 'admin.php' ) );
}
add_filter( 'edit_networks_screen_url', '_ga_adjust_multinetwork_admin_url', 10, 2 );

/**
 * Adjusts the networks list URL within the global administration panel.
 *
 * @since 1.0.0
 * @access private
 *
 * @param string $list_url Networks list URL, or empty string if not set.
 * @return string Adjusted networks list URL.
 */
function _ga_adjust_multinetwork_list_url( $list_url ) {
    return global_admin_url( 'admin.php?page=networks' );
}
add_filter( 'global_right_now_networks_url', '_ga_adjust_multinetwork_list_url' );

/**
 * Adjusts the Add Network URL within the global administration panel.
 *
 * @since 1.0.0
 * @access private
 *
 * @param string $add_url Add Network URL, or empty string if not set.
 * @return string Adjusted Add Network URL.
 */
function _ga_adjust_multinetwork_add_url( $add_url ) {
    return global_admin_url( 'admin.php?page=add-new-network' );
}
add_filter( 'global_right_now_add_network_url', '_ga_adjust_multinetwork_add_url' );

/**
 * Adjusts the edit URL for a network within the global administration panel.
 *
 * @since 1.0.0
 * @access private
 *
 * @param string $edit_url   Network edit URL, or empty string if not set.
 * @param int    $network_id Network ID.
 * @return string Adjusted network edit URL.
 */
function _ga_adjust_multinetwork_edit_url( $edit_url, $network_id ) {
    return global_admin_url( 'admin.php?page=networks&id=' . $network_id . '&action=edit_network' );
}
add_filter( 'global_user_list_edit_network_url', '_ga_adjust_multinetwork_edit_url', 10, 2 );

/**
 * Adjusts the detection of which networks belong to a user.
 *
 * Users who are a global admin have full capabilities on all networks.
 *
 * @since 1.0.0
 * @access private
 *
 * @param array|null $networks Original array of network IDs or null.
 * @param int        $user_id  User ID to get networks for.
 * @return array|false Array of network IDs or false if no IDs.
 */
function _ga_user_has_networks( $networks, $user_id ) {
    if ( ! is_multinetwork() ) {
        return $networks;
    }

    $all_networks = get_networks( array(
        'fields' => 'ids',
    ) );

    $user = get_user_by( 'id', $user_id );

    if ( $user->has_cap( 'manage_networks' ) ) {
        $user_networks = $all_networks;
    } else {
        $user = get_userdata( $user_id );
        $user_networks = array();
        foreach ( $all_networks as $network_id ) {
            $network_admins = get_network_option( $network_id, 'site_admins', array() );
            if ( in_array( $user->user_login, $network_admins, true ) ) {
                $user_networks[] = $network_id;
            }
        }
    }

    if ( empty( $user_networks ) ) {
        $user_networks = false;
    }

    return $user_networks;
}
add_filter( 'networks_pre_user_is_network_admin', '_ga_user_has_networks', 10, 2 );

// Internal filter.
add_filter( '_global_admin_show_admin_bar_networks', '__return_true' );