web-dev-qa-db-fra.com

Comment masquer un plugin dans la liste des plugins admin de WordPress Multisite

J'utilise l'extrait de code suivant pour masquer les plugins de ma liste de plugins:

function hide_plugin_trickspanda() {
  global $wp_list_table;
  $hidearr = array('plugin-directory/plugin-file.php');
  $myplugins = $wp_list_table->items;
  foreach ($myplugins as $key => $val) {
    if (in_array($key,$hidearr)) {
      unset($wp_list_table->items[$key]);
    }
  }
}

add_action('pre_current_active_plugins', 'hide_plugin_trickspanda');

Cela fonctionne, mais lorsque je l’utilise sur un WordPress MS, cela fonctionne pour tous les sites, sauf l’administrateur réseau.

J'ai découvert que l'administrateur de réseau utilise le hook active_sitewide_plugins pour cette tâche, mais je ne trouve aucun moyen de le faire.

Selon ce site :

FYI => Je tirais une erreur avec un plugin que j'ai développé et que j'ai fini par traîner dans les entrailles de WordPress, en particulier WordPress multisite.

Un seul site WordPress possède un site get_option ‘active_plugins’. Pour WP multi-site, il s’agit de get_site_option ‘active_sitewide_plugins '. Le problème est que, sur un seul site, un tableau avec des nombres - représentant l'ordre de chargement du plugin - est défini comme clé. Comme ça:

[0] => hello-dolly/hello.php

D'autre part, WP multisite utilise un tableau associatif avec le nom du plug-in comme clé et un entier comme valeur. Comme ça:

[hello-dolly/hello.php] => 1369572703

La question plus large était de manipuler l'ordre de chargement des plugins. Une fois que j'ai compris que les types de tableaux étaient différents, j'ai ajouté une conditionnelle is_mutisite () et manipulé les tableaux de manière appropriée. Quand je saurai pourquoi les types de tableaux sont différents, je vous le ferai savoir.

Des idées?

1
Hardeep Asrani

Il y a un filtre appelé all_plugins qui semble faire l'affaire pour moi:

add_filter( 'all_plugins', 'wpse156903_hide_plugins' );
function wpse156903_hide_plugins( (array) $plugins ) {

    // let's hide akismet
    if( in_array( 'akismet/akismet.php', array_keys( $plugins ) ) ) {
        unset( $plugins['akismet/akismet.php'] );
    }

    // hide multiple plugins
    $hidearr = array(
        'plugin1/plugin-file.php',
        'plugin2/plugin-file2.php',
        // and so on
    );
    foreach( $hidearr as $hide_me ) {
        if( in_array( $hide_me, array_keys( $plugins ) ) ) {
            unset( $plugins[$hide_me] );
        }
    }
    return $plugins;
}

Bien sûr, vous devriez remplacer akismet/akismet.php par le chemin de votre fichier de plugin. (J'ai choisi Akismet parce que c'est le premier plugin de la liste sur mon site.)

Cette fonction masque l'existence du plug-in en question dans les listes Réseau> Plugins et Site> Plugins .

2
Pat J