web-dev-qa-db-ja.com

バックエンドのSettings-> Generalからoptionsフィールドを削除/設定解除しますか?

私は、マルチサイト管理者が変更できないようにしたい設定を削除する方法を見つけようとしています。 [設定] - > [一般]で、これらのオプションを(テキストと共に)削除/非表示にします。

  • キャッチフレーズ
  • サイトの言語
  • 日付フォーマット
  • 時間フォーマット
  • 週の始まり

設定を解除するためにフックできるものがあれば、私はPHPでこれを行いたいですか? CSSを使用して私はそれが可能であることを知っています。しかしCSSはそれらをブラウザのdev設定を通して到達可能にします。

これを行う方法がありますか?

3
joq3

残念ながら、これらのフィールドの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_script.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は私たちに少し助けを与えます、なぜならそれらの設定はすべてオプション処理でホワイトリストに載っていて、私たちはdoそれらをホワイトリストから外すためのフィルタを持っています:

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

現在、一般設定フォームが返されると、他のオプションがハッキングされて送信された場合でも、ホワイトリストに登録されたオプションのみが処理されます。

2
Caspar