web-dev-qa-db-fra.com

Supprimer/désélectionner le champ des options du backend Settings-> General?

J'essaie de comprendre comment supprimer les paramètres que je ne souhaite pas que mes administrateurs multisites puissent modifier. Dans Paramètres-> Général, je souhaite supprimer/masquer ces options (avec le texte):

  • Slogan
  • Langue du site
  • Format de date
  • Format de l'heure
  • La semaine commence

Je voudrais faire ceci avec PHP, s'il y a quelque chose que je peux accrocher pour le désactiver? En utilisant CSS, je sais que c'est possible. Mais CSS les rend accessibles via les paramètres de développement du navigateur.

Une idée comment faire ça?

3
joq3

Malheureusement, le code HTML de ces champs est codé en dur dans le fichier wp-admin/options-general.php et aucun filtre ne les empêche de s'afficher.

La meilleure chose à faire est probablement de les désactiver. Voici comment je l'aborderais:

Étape 1: Ajout d’un peu de js/jQuery à la page des options générales qui ciblera les entrées/sélections que vous souhaitez désactiver et ajoutez-y l’attribut 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 );
    }
}

Où dans ce qui précède, vous remplacez 'chemin/vers/disabler_script.js` par le chemin correct vers le fichier suivant:

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

Jusqu'à présent, nous avons rendu difficile pour un administrateur "créatif" de saisir des éléments dans ces champs, mais ils pourraient toujours les pirater dans le navigateur. Alors, étape 2, nous devons arranger les choses du côté serveur. Ici, WP nous donne un petit coup de main, car ces réglages sont tous listés dans le traitement des options, et nous avons avons un filtre pour les retirer de la liste blanche:

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

Désormais, lorsque le formulaire des paramètres généraux est renvoyé, seules les options de la liste blanche sont traitées, même lorsque d'autres options ont été piratées et soumises.

2
Caspar