Самый простой способ скрыть (некоторые) плагины WordPress от пользователей? - PullRequest
2 голосов
/ 14 сентября 2010

Я использую WordPress, чтобы мои пользователи создавали свой собственный сайт / блог.У меня есть настройка, которую я клонирую всем пользователям с некоторыми специальными пользовательскими ролями и стандартными плагинами.

Однако некоторые плагины не должны изменяться или инактивироваться пользователями.

Можно ли каким-либо образом выбрать, какие плагины могут использовать разные роли пользователей?Или простой способ скрыть некоторые плагины на странице плагинов, но они все еще работают как обычно?

Может быть, есть какой-нибудь плагин, который помогает мне сделать это?

Ответы [ 4 ]

7 голосов
/ 15 сентября 2010

Вы можете написать плагин, который использует фильтр-ловушку «all_plugins» для удаления из массива плагинов, которые вы не хотите отображать для определенного пользователя. Примерно так:

$plugin_credentials = array(
    'bob' => array(
            'Hello Dolly' => 1
    ),
    'jim' => array(
            'Akismet' => 1,
            'Hello Dolly' => 1,
    ),
    'admin' => "**ALL**"
);

function plugin_permissions($plugins)
{
        global $current_user, $plugin_credentials;

        $username = $current_user->user_login;

        if ($plugin_credentials[$username] == "**ALL**")
                return $plugins;

        $viewable_plugins = array();

        foreach ($plugins as $plugin) {
                if (isset($plugin_credentials[$username]) &&
                        isset($plugin_credentials[$username][$plugin['Name']]) &&
                        $plugin_credentials[$username][$plugin['Name']] == 1) {

                        array_push($viewable_plugins, $plugin);
                }
        }
        return $viewable_plugins;
}

add_filter('all_plugins', 'plugin_permissions');

Управление правами пользователей в самом плагине не идеально, но, вероятно, проще всего. Вы можете расширить эту идею, создавая страницы администратора для управления пользователями и их просматриваемыми плагинами в таблице базы данных где-то.

1 голос
/ 14 сентября 2010

Каждый плагин обычно указывает свою собственную роль / разрешение, что вы можете увидеть, если вы посмотрите на их add_submenu_page () или такие вызовы функций.Вы можете создавать новые роли для этих плагинов и заменять роли, указанные автором, но это также нарушит изменения при обновлении плагинов.

0 голосов
/ 17 января 2013

Я сделал новую версию на основе ответа @spuriousdata. Этот использует плагин slugs (имя файла без расширения), чтобы построить список ограничений. Этот способ проще, так как мы можем unset массив, используя первый уровень $key s.

Инструкции по настройке в самом коде.

<?php
/**
 * Plugin Name: Limit Plugins by User
 * Plugin URI: http://stackoverflow.com/q/14340131/1287812
 * Description: Show selected plugins for specific users. 
 * Based on the code by spuriousdata, http://stackoverflow.com/a/3713985.
 * Author: brasofilo
 * Author URI: http://wordpress.stackexchange.com/users/12615/brasofilo
 * Version: 1.0
 * License: GPLv2 or later
 */

add_filter( 'all_plugins', 'plugin_permissions_so_3707134' );

/**
 * Filter the list of plugins according to user_login
 *
 * Usage: configure the variable $plugin_credentials, which holds a list of users and their plugins.
 * To give full access, put a simple string "ALL"
 * To grant only for some plugins, create an array with the Plugin Slug, 
 *    which is the file name without extension (akismet.php, hello.php)
 *
 * @return array List of plugins
 */
function plugin_permissions_so_3707134( $plugins )
{
    // Config
    $plugin_credentials = array(
        'admin' => "ALL",
        'other-admin' => array(
            'akismet',
        ),
        'another-admin' => array(
            'akismet',
            'hello',
        ),
    );

    // Current user
    global $current_user;
    $username = $current_user->user_login;

    // Super admin, return everything
    if ( "ALL" == $plugin_credentials[ $username ] )
        return $plugins;

    // Filter the plugins of the user
    foreach ( $plugins as $key => $value ) 
    { 
        // Get the file name minus extension
        $plugin_slug = basename( $key, '.php' );

        // If not in the list of allowed plugins, remove from array
        if( !in_array( $plugin_slug, $plugin_credentials[ $username ] ) )
            unset( $plugins[ $key ] );
    }

    return $plugins;
}
0 голосов
/ 15 сентября 2010

Вы должны расслаивать пользователей.Удостоверьтесь, что пользователи Admin являются доверенными и знают, что не следует возиться с тем, что они не понимают.Остальные должны быть ограничены их ролями.Авторы, редакторы и т. Д. Например, если они являются частью сайта для написания статей, то им не нужно видеть остальное.Сделайте их автором и покончите с этим.

Это часть обучения клиентов.Если это меньший клиент с менее многослойными ролями, то сделайте им две учетные записи.Скажите им: «Это учетная запись, которой вы управляете сайтом, вы будете использовать это редко. И это учетная запись, которую вы будете использовать большую часть времени для написания и редактирования.Скорее всего, никогда не понадобится учетная запись администратора ".Вам не всегда повезет с таким подходом, но затрачивая меньше времени и усилий на хлам, вы не должны тратить время впустую.

...