it-swarm.dev

Optionsfeld aus dem Backend entfernen/entfernen Einstellungen-> Allgemein?

Ich versuche herauszufinden, wie ich Einstellungen entfernen kann, die von meinen Admins mit mehreren Standorten nicht geändert werden sollen. In Einstellungen-> Allgemein möchte ich diese Optionen (zusammen mit dem Text) entfernen/verbergen:

  • Slogan
  • Sprache der Site
  • Datumsformat
  • Zeitformat
  • Woche beginnt am

Ich würde das gerne mit PHP machen, wenn es etwas gibt, in das ich mich einklinken kann, um sie zu deaktivieren? Mit CSS weiß ich, dass es möglich ist. Mit CSS sind sie jedoch über die Einstellungen der Browser-Entwickler erreichbar.

Irgendeine Idee, wie das geht?

3
joq3

Leider ist der HTML-Code für diese Felder in der wp-admin/options-general.php-Datei fest codiert, und es gibt keine Filter, die verhindern, dass sie angezeigt werden.

Das nächstbeste ist wahrscheinlich, sie zu deaktivieren. So würde ich es angehen:

Schritt 1: Hinzufügen eines Teils von js/jQuery zur Seite mit den allgemeinen Optionen, die auf die zu deaktivierenden Eingaben/Auswahlen abzielen, und Hinzufügen des Attributs disabled zu diesen.

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

Wo im obigen Beispiel ersetzen Sie "path/to/disabler_script.js" durch den korrekten Pfad zur folgenden Datei:

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

Bisher haben wir es einem "kreativen" Administrator schwer gemacht, Dinge in diese Felder einzugeben, aber sie könnten es trotzdem in den Browser hacken. Also, Schritt 2, müssen wir die Dinge auf dem Server festbinden. Hier gibt uns WP eine kleine Hilfe, da diese Einstellungen in der Optionsverarbeitung alle auf der weißen Liste stehen und wir tun einen Filter haben, um die Whitelist aufzuheben:

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

Wenn das Formular für allgemeine Einstellungen zurückgegeben wird, werden nur die Whitelist-Optionen verarbeitet, auch wenn andere Optionen gehackt und gesendet wurden.

2
Caspar