Contourner la limite d'upload d'extension WordPress

J’ai récemment travaillé sur un site WordPress, pour un client qui n’avait pas la main sur le serveur hébergeant son site. Comme à mon habitude, je travaillais sur une copie locale du site, jusqu’au moment de la mise en prod.
Et là, surprise: la config PHP ne permet pas d’uploader des fichiers de plus de 2 Mo. Je ne peux donc pas installer mes extensions WordPress via l’interface classique de WordPress.


Pour palier à ce problème, voici un petit hack rapide, qui permet de contourner cette limitation: j’utilise une petite fonction PHP pour récupérer et installer les extensions que je veux, depuis une URL.

La fonction exécute l’installation seulement si le plugin n’est pas déjà installé, en utilisant le code standard de WordPress. L’exécution se fait à la prochaine visite d’une page admin, et affiche un retour visuel comme une installation via la page dédiée.
Il suffit d’ajouter le code dans le thème (dans ApparenceÉditeur de thème → fichier functions.php), se rendre sur n’importe quelle page, puis retirer le code du thème. Et voilà !
Il ne reste plus qu’à l’activer.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function ensures_plugin_is_installed($plugin_name, $plugin_url) {
include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
add_action('admin_notices', function() use ($plugin_name, $plugin_url) {
foreach (get_plugins() as $key => $value) {
if (strpos($key, $plugin_name . '/') === 0)
return; // the plugin is already installed
}
print('Will install plugin: ' . $plugin_url);

$upgrader = new Plugin_Upgrader();
$upgrader->install($plugin_url);
});
}

// How to use it:
$ebak_plugin_name = 'plugin-installed-from-public-url';
$ebak_plugin_url = "https://www.example.com/plugin/plugin-installed-from-public-url.zip";
ensures_plugin_is_installed($ebak_plugin_name, $ebak_plugin_url);

Bien sûr, c’est un hack très grossier, on peut améliorer le code. Mais ça fait ce que je veux, mon problème est résolu.