web-dev-qa-db-fra.com

Empêcher les sites multisites d'utiliser un plugin

J'ai un plugin personnalisé que j'ai écrit pour gérer beaucoup de choses. Je veux utiliser ceci pour le site web principal.com. Je ne veux aucun des sites de sous-domaines, par exemple website.com/site1 pour avoir accès à ce plugin. Je pensais mettre en place quelque chose dans le plugin lui-même pour qu'il vérifie l'URL et ne fasse rien s'il ne s'agit pas du site principal, mais ce n'est pas ce que je veux vraiment. Je veux complètement cacher ce plugin de tous les sites Web sous. Je prévois d’avoir plusieurs plugins à l’avenir, donc j’aimerais avoir un contrôle sur les sites secondaires qui ont accès à des plugins particuliers.

Pour clarifier davantage. Je ne cherche pas à donner aux utilisateurs des options. Je veux décider des options des sous-sites. J'ai une solution sale que je n'aime pas.

if(get_site_url() != "http://website.com") exit;

Cela provoquera une exception fatale lorsque le plug-in est installé sur un site autre que le site principal, mais que c'est vraiment moche. Je veux un moyen plus propre de masquer ce plugin à partir du menu du plugin pour les sous-sites.

1
Dan Hastings

Le multisite est configuré pour le faire par défaut. Si vous installez simplement le plug-in sans l'activer sur le réseau, vous pouvez en limiter l'utilisation à un seul site du réseau.

Pour ce faire, vous devez être connecté avec un compte doté des droits de super administrateur. Installez le plug-in sur le tableau de bord mono-site> plugins; pas de la page des plugins d'administrateur réseau.

https://codex.wordpress.org/Multisite_Network_Administration#Plugins

Reportez-vous à la section Site spécifique pour plus de détails.

1
jdm2112

Vous pouvez filtrer l'option active_plugins et supprimer le plug-in que vous souhaitez ne jamais activer sur un site. Vous devrez cependant utiliser un plugin mu (wp-content/mu-plugins) car le filtrage de l'option est trop tardif depuis un plugin standard:

add_filter( 'option_active_plugins', function( $plugins ) {
    if ( get_current_blog_id() !== 1 ) {
        $plugin = 'plugin-name/plugin-name.php';
        $key = array_search( $plugin, $plugins );
        if ( $key !== false ) {
            unset( $plugins[ $key ] );
        }
    }

    return $plugins;
});

Notez que j'utilise get_current_blog_id() ici pour m'assurer que la logique ne casse pas si vous décidez d'ajouter HTTPS à votre site principal ou de modifier le nom de domaine.

Ensuite, vous voudrez probablement supprimer votre plugin de la liste que vos utilisateurs voient afin de ne pas le dérouter car rien ne se passera quand ils cliqueront sur le lien Activer:

add_filter( 'all_plugins', function( $plugins ) {
    if ( get_current_blog_id() !== 1 ) {
        $plugin = 'plugin-name/plugin-name.php';
        unset( $plugins[ $plugin ] );
    }

    return $plugins;
});

Une autre approche consiste à faire de votre plugin un mu-plugin, c’est-à-dire forcé et toujours actif sur l’ensemble du réseau, puis simplement dans votre fichier de plugin principal:

if ( get_current_blog_id() !== 1 )
    return; // Don't execute the rest of this file

// Your plugin stuff goes here

Le fichier sera donc analysé sur tous les sites du réseau, mais son exécution sera immédiatement renvoyée.

J'espère que cela pourra aider!

0
kovshenin