WP Manifestindependent plugin directory
manifest / utilities / wordpress-mu-loader

WP Plugin MU Loader

Loads regular plugins from the plugins directory as must-use plugins, enforcing their activity while maintaining the typical update flow.

by Austin Passy · github.com/thefrosty/wordpress-mu-loader · website

3stars
0forks

Install

No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:

wp plugin install https://github.com/thefrosty/wordpress-mu-loader/archive/refs/heads/main.zip

Readme

WP Plugin MU Loader

Installation

composer require thefrosty/wordpress-mu-loader:^1.1

Loads regular plugins from the plugins' directory as "must-use plugins", enforcing their activity while maintaining the typical update flow. This file will take care of all necessary logic, including preventing activation/deactivation/deletion of those plugins as regular plugins.

Benefits

  • Enforce plugins to be active throughout the entire installation.
  • Continue receiving automated update notifications.
  • Be able to comfortably update those plugins from the WordPress dashboard.
  • The plugin activation, deactivation, and uninstallation routines are executed as usual.

Requirements

  • WordPress >= 6.3
  • PHP >= 8.0

Usage

  • You can then pass basenames of the plugins you would like to load as MU plugins to the constructor call in the wp_plugin_mu_loader() function, as an array.
  • A plugin basename consists of the plugin directory name, a trailing slash, and the plugin main file name, for example wordpress-seo/wp-seo.php, jetpack/jetpack.php, or woocommerce/woocommerce.php.
  • Alternatively, if you don't want to tweak the code of the function itself, you can also access the loader from the outside: Retrieve the instance via wp_plugin_mu_loader() and then call its load_plugin() method, passing a single plugin basename string to it.

Example

wp_plugin_mu_loader()->loadPlugin( 'custom-login/custom-login.php' );

OR, create a git managed mu-plugin:

<?php declare(strict_types=1);
/**
 * @wordpress-muplugin
 * Plugin Name: WordPress Plugins as Must-use
 * Description: Require regular WordPress plugins as "must-use" plugins.
 * Version: 1.0.0
 * Author: Austin Passy
 * Author URI: https://github.com/thefrosty
 */

namespace TheFrosty;

use InvalidArgumentException;
use RuntimeException;
use function add_action;
use function array_filter;
use function array_walk;
use function file_exists;
use function function_exists;
use function wp_plugin_mu_loader;
use const WPMU_PLUGIN_DIR;

/**
 * Returns an array of basename formatted plugins to set as "must-use".
 * @return array
 */
function getRequiredPlugins(): array
{
    // Add plugins to the array here...
    return array_filter([
        'disable-emojis/disable-emojis.php',
        'soil/soil.php',
        'custom-login/custom-login.php',
        'wp-login-locker/wp-login-locker.php',
    ]);
}

add_action('muplugins_loaded', static function (): void {
    if (
        !function_exists('wp_plugin_mu_loader') &&
        // You only need the file_exists/require if not using autoloading...
        file_exists(WPMU_PLUGIN_DIR . '/wordpress-mu-loader/wp-plugin-mu-loader.php')
    ) {
        require_once WPMU_PLUGIN_DIR . '/wordpress-mu-loader/wp-plugin-mu-loader.php';
    }
    $loader = wp_plugin_mu_loader()
    $plugins = getRequiredPlugins();
    array_walk($plugins, static function (string $plugin_basename) use ($loader): void {
        try {
            $loader->loadPlugin($plugin_basename);
        } catch (InvalidArgumentException|RuntimeException $exception) {
            // Log something here?
        }
    });
});

Read the full README on GitHub →

Releases

TagPublished
1.2.2 Jun 9, 2026
1.2.1 Dec 18, 2025
1.2.0 Dec 14, 2025
1.1.0 Dec 6, 2024
1.0.1 Jan 27, 2023
1.0.0 Jul 4, 2022

These releases are tags only. The author does not attach a packaged zip, so there are no download counts to report.