从后端设置->常规中删除/取消设置选项字段?

时间:2018-06-10 作者:joq3

我正在试图找出如何删除我不希望我的多站点管理员能够更改的设置。在设置->常规中,我想删除/隐藏这些选项(连同文本):

主题词,网站语言,日期格式,时间格式,一周从开始,如果有什么事情可以解决的话,我想用PHP做这个?使用CSS我知道这是可能的。但是CSS使它们可以通过浏览器开发设置访问。

你知道怎么做吗?

1 个回复
SO网友:Caspar

不幸的是,这些字段的html硬编码到wp-admin/options-general.php 文件,并且没有阻止它们显示的筛选器。

下一个最好的方法可能是禁用它们。以下是我的做法:

步骤1:向常规选项页面添加一点js/jQuery,该页面将针对要禁用的输入/选择,并添加disabled 归因于他们。

PHP:

add_action( \'admin_enqueue_scripts\', \'wpse_maybe_add_custom_disable_fields_js\' );
function wpse_maybe_add_custom_disable_fields_js() {
    if ( \'options-general\' == get_current_screen()->id && is_multisite() && ! current_user_can( \'manage_network_options\' ) ) {
        wp_enqueue_script( \'wpse_custom_disable_fields\', \'path/to/disabler_script.js\', array( \'jquery\' ), false, true );
    }
}
其中,在上面替换“path/to/disabler\\u脚本”。js`具有以下文件的正确路径:

JS公司:

(function ($) {
    var fieldsIds = [
        \'blogdescription\',
        \'WPLANG\',
        \'timezone_string\',
        \'date_format_custom_radio\',
        \'date_format_custom\',
        \'time_format_custom_radio\',
        \'time_format_custom\',
        \'start_of_week\'
    ];

    $(document).ready(function () {
        fieldsIds.forEach(function (el) {
            $(\'#\' + el).attr(\'disabled\', \'disabled\');
        });

        var radios = $(\'input[name="date_format"], input[name="time_format"]\');
        $.each(radios, function (index, el ) {
            $(el).attr(\'disabled\', \'diabled\');
        });

    });
})(jQuery);
到目前为止,我们已经让一个“有创意”的管理员很难在这些领域中输入内容,但他们仍然可以将其破解到浏览器中。因此,第2步,我们需要在服务器端进行绑定。在这里,WP给了我们一些帮助,因为这些设置在选项处理中都是白名单,我们确实有一个过滤器来取消白名单:

PHP:

add_filter( \'whitelist_options\', \'wpse_maybe_remove_settings_from_whitelist\' );
function wpse_maybe_remove_settings_from_whitelist( array $whitelist_options ) {
    if ( is_multisite() && ! current_user_can( \'manage_network_options\' ) ) {
        $whitelist_options[\'general\'] = array( \'blogname\', \'new_admin_email\' );
    }
    return $whitelist_options;
}
现在,当返回常规设置表单时,即使其他选项已被入侵并提交,也只会处理白名单上的选项。

结束