web-dev-qa-db-ja.com

WordPress Multisite管理プラグインリストからプラグインを隠す方法

私は自分のプラグインリストからプラグインを隠すために次のスニペットを使います:

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');

これは動作しますが、私がWordPress MSでこれを使用したとき、それはすべてのサイトではなくネットワーク管理者のために動作します。

私はNetwork Adminがこのタスクにactive_sitewide_pluginsフックを使うことを知りました、しかしそれをする本当の方法を見つけることができません。

このサイトによると

FYI =>私が開発したプラグインでエラーを引き起こしていて、WordPressの腸、特にWordPressマルチサイトのまわりでトローリングしてしまいました。

WordPressのシングルサイトには「get_option」という「active_plugins」というサイトがあります。 WPマルチサイトの場合は、get_site_option、active_sitewide_pluginsです。問題は、シングルサイトがキーとして、プラグインのロード順序を表す数字を含む配列を使用することです。このような:

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

一方、WP multisiteは、プラグイン名をキーとして、整数値を値として持つ連想配列を使用します。このような:

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

より広い問題はプラグインのロード順を操作することでした。配列の種類が異なることを理解したら、is_mutisite()条件を追加して配列を適切に操作しました。配列の種類が異なる理由を見つけたら、お知らせします。

何か案は?

1
Hardeep Asrani

all_plugins というフィルタがありますが、これは私にとってはうまくいくと思われます。

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;
}

もちろん、akismet/akismet.phpをプラグインファイルへのパスに置き換えます。 (私のサイトのリストの最初のプラグインであるため、私はAkismetを選びました。)

この関数は、Network> PluginsおよびSite> Pluginsの両方のリストで、問題のプラグインの存在を隠します。

2
Pat J