Skip to content

Instantly share code, notes, and snippets.

@afragen
Last active March 21, 2024 12:54
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save afragen/9117fd930d9be16be8a5f450b809dfa8 to your computer and use it in GitHub Desktop.
Save afragen/9117fd930d9be16be8a5f450b809dfa8 to your computer and use it in GitHub Desktop.
A generic mu-plugins loader for plugins stored in wp-content/plugins folder.
<?php
/**
* MU Loader
*
* @author Andy Fragen, Colin Stewart
* @license MIT
* @package mu-plugins
*/
/**
* Plugin Name: MU Loader
* Plugin URI: https://gist.github.com/afragen/9117fd930d9be16be8a5f450b809dfa8
* Description: An mu-plugin to load plugins as a must-use plugins. Disables normal plugin activation and deletion.
* Version: 0.5.0
* Author: WordPress Upgrade/Install Team
* License: MIT
* GitHub Plugin URI: https://gist.github.com/afragen/9117fd930d9be16be8a5f450b809dfa8
* Requires PHP: 8.0
* Requires WP: 5.9
*/
namespace WP_Plugin_Install_Team;
// If this file is called directly, abort.
if ( ! defined( 'WPINC' ) ) {
die;
}
/**
* Class MU_Loader
*/
class MU_Loader {
/**
* Holds array of plugin files.
*
* @var $plugin_files
*/
private static $plugin_files = array( 'woocommerce/woocommerce.php' );
/**
* Let's get going.
* Load the plugin and hooks.
*
* @return void
*/
public function run() {
foreach ( static::$plugin_files as $plugin_file ) {
$plugin_filepath = trailingslashit( WP_PLUGIN_DIR ) . $plugin_file;
if ( file_exists( $plugin_filepath ) ) {
require $plugin_filepath;
$this->load_hooks( $plugin_file );
}
}
add_filter( 'option_active_plugins', array( $this, 'set_as_active' ) );
}
/**
* Load action and filter hooks.
*
* Remove links and disable checkbox from Plugins page so user can't delete main plugin.
* Ensure plugin shows as active.
*
* @param string $plugin_file Plugin file.
* @return void
*/
public function load_hooks( $plugin_file ) {
add_filter( 'network_admin_plugin_action_links_' . $plugin_file, array( $this, 'mu_plugin_active' ) );
add_filter( 'plugin_action_links_' . $plugin_file, array( $this, 'mu_plugin_active' ) );
add_action( 'after_plugin_row_' . $plugin_file, array( $this, 'after_plugin_row_updates' ) );
add_action( 'after_plugin_row_meta', array( $this, 'display_as_mu_plugin' ), 10, 1 );
}
/**
* Make plugin row active and disable checkbox.
*
* @param string $plugin_file Plugin file.
* @return void
*/
public function after_plugin_row_updates( $plugin_file ) {
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
print "<script>jQuery('.inactive[data-plugin=\"{$plugin_file}\"]').attr('class','active');</script>";
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
print "<script>jQuery('.active[data-plugin=\"{$plugin_file}\"] .check-column input').attr( 'disabled','disabled' );</script>";
}
/**
* Add 'Activated as mu-plugin' to plugin row meta.
*
* @param string $plugin_file Plugin file.
* @return void
*/
public function display_as_mu_plugin( $plugin_file ) {
if ( in_array( $plugin_file, (array) static::$plugin_files, true ) ) {
printf(
'<br><span style="color:#a7aaad;">%s</span>',
esc_html__( 'Activated as mu-plugin', 'mu-loader' )
);
}
}
/**
* Unset action links.
*
* @param array $actions Link actions.
* @return array
*/
public function mu_plugin_active( $actions ) {
unset( $actions['activate'], $actions['delete'], $actions['deactivate'] );
return $actions;
}
/**
* Set mu-plugins as active.
*
* @param array $active_plugins Array of active plugins.
* @return array
*/
public function set_as_active( $active_plugins ) {
$active_plugins = array_merge( $active_plugins, static::$plugin_files );
return array_unique( $active_plugins );
}
}
( new MU_Loader() )->run();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment