Comment définir les options d'écran par défaut?

19

J'aimerais pouvoir masquer les méta-boîtes à l'aide d'options d'écran, au lieu de les supprimer ou de les limiter aux rôles d'utilisateur. L'objectif est simplement de "décocher" la méta-boîte de l'utilisateur.

Je vois à quel point cela pourrait être délicat, car tout code qui modifierait une base de données pour un utilisateur ne serait pas autorisé à s'exécuter chaque fois qu'il cliquait sur la page, car il se réinitialiserait. Mais les gens plus intelligents que je code le noyau, alors peut-être il y a un moyen. Et s’il y en a, je meurs de savoir.

Des idées?

    
posée developdaly 22.04.2011 - 04:18

4 réponses

23

Vous faites référence aux métaboxes sur l'écran de publication de l'administrateur, n'est-ce pas?

Pour cela, vous n'avez pas besoin d'un plugin, il suffit de déposer les éléments suivants dans votre fichier functions.php.

// add_action('user_register', 'set_user_metaboxes');
add_action('admin_init', 'set_user_metaboxes');
function set_user_metaboxes($user_id=NULL) {

    // These are the metakeys we will need to update
    $meta_key['order'] = 'meta-box-order_post';
    $meta_key['hidden'] = 'metaboxhidden_post';

    // So this can be used without hooking into user_register
    if ( ! $user_id)
        $user_id = get_current_user_id(); 

    // Set the default order if it has not been set yet
    if ( ! get_user_meta( $user_id, $meta_key['order'], true) ) {
        $meta_value = array(
            'side' => 'submitdiv,formatdiv,categorydiv,postimagediv',
            'normal' => 'postexcerpt,tagsdiv-post_tag,postcustom,commentstatusdiv,commentsdiv,trackbacksdiv,slugdiv,authordiv,revisionsdiv',
            'advanced' => '',
        );
        update_user_meta( $user_id, $meta_key['order'], $meta_value );
    }

    // Set the default hiddens if it has not been set yet
    if ( ! get_user_meta( $user_id, $meta_key['hidden'], true) ) {
        $meta_value = array('postcustom','trackbacksdiv','commentstatusdiv','commentsdiv','slugdiv','authordiv','revisionsdiv');
        update_user_meta( $user_id, $meta_key['hidden'], $meta_value );
    }
}

En gros, ce qui se passe, c’est que, pour l’utilisateur actuellement connecté, vous modifiez certaines méta_valeurs enregistrées dans la table wp_usermeta.

Il existe deux façons d’utiliser cette fonction, vous pouvez soit vous connecter à "user_register", soit à "admin_init".

L'avantage d'utiliser "user_register" est que cette fonction ne se déclenche que lorsqu'un nouvel utilisateur est enregistré (donc moins de temps système). Toutefois, cela ne fonctionnera pas pour les utilisateurs existants.

Si vous voulez que cela fonctionne pour des utilisateurs existants, connectez-vous à 'admin_init'. Bien entendu, l’inconvénient est que cette fonction est activée à chaque fois que l’utilisateur accède à la page administrateur.

    
réponse donnée drebabels 14.06.2011 - 10:32
16

Il existe un filtre default_hidden_meta_boxes dans get_hidden_meta_boxes() qui permet de modifier ceux qui ne sont pas affichés tant que l'utilisateur n'a pas n'a pas modifié ses préférences dans les options de l'écran.

    
réponse donnée Rarst 24.08.2011 - 17:22
6

J'ai des commentaires de code sur trois solutions déjà publiées, mais aussi un commentaire général

Ils présentent un choix sous-optimal: soit remplacer le choix de la case à cocher Options d'écran de l'utilisateur; ou respectez-le, mais faites ignorer votre code si l'utilisateur a déjà modifié les cases à cocher, même pour d'autres méta_boxes, ou avant que votre code ne soit dans WP. Il semble que le choix respectueux ne soit utile que si tous vos utilisateurs sont nouveaux. La meilleure solution serait de définir une option utilisateur personnalisée pour déterminer si vos paramètres par défaut de la méta_box ont été modifiés par l'utilisateur, et le respecter. Non, je n'ai pas écrit ce code! Devrait être facile ...:)

Les trois solutions publiées:

1. La solution hidden_meta_boxes de WraithKenny est celle qui remplace l'option utilisateur. Notez qu'il couvre tous les types de publication ("publication", "page", "lien", "pièce jointe" et tous types de publication personnalisés). C'est bien sauf si vous voulez que ce soit spécifique. Vous avez spécifié le type de post_type dans vos appels add_meta_box() . Vous pouvez essayer de les faire correspondre, ou simplement les décaler, car ceux qui ne correspondent pas seront ignorés. Si vous souhaitez connaître le type de post_type dans le filtre, vous pouvez utiliser le paramètre supplémentaire screen :

add_filter('hidden_meta_boxes', 'foo_hidden_meta_boxes', 10, 2);
function foo_hidden_meta_boxes($hidden, $screen) {
    $post_type= $screen->id;
    switch ($post_type) {
        // case 'post', 'page', 'link', 'attachment', and any custom post types
        // $hidden[]= 'foo_box_id';
        // /or/
        // $hidden= array_diff($hidden, array('foo_box_id'));
    }
    return $hidden;
}

2. Comme le dit Rarst, default_hidden_meta_boxes respecte l’option user_option. Comme avec hidden_meta_boxes , vous pouvez utiliser le paramètre $ screen pour distinguer les post_types.

3. La fonction set_user_metaboxes () de Drebabels respecte également user_option. Notez qu'il est codé en dur pour l'écran d'édition "post". Pour gérer l'écran d'édition 'page' et d'autres post_types, placez le code dans cette boucle:

function set_user_metaboxes($user_id=NULL) {
    $post_types= array( 'post', 'page', 'link', 'attachment' );
    // add any custom post types here:
    // $post_types[]= 'my_custom_post_type';
    foreach ($post_types as $post_type) {

       // These are the metakeys we will need to update
       $meta_key= array(
           'order' => "meta-box-order_$post_type",
           'hidden' => "metaboxhidden_$post_type",
       );

       // The rest is the same as drebabels's code,
       // with '*_user_meta()' changed to '*_user_option()'

       // So this can be used without hooking into user_register
       if ( ! $user_id)
           $user_id = get_current_user_id(); 

       // Set the default order if it has not been set yet
       if ( ! get_user_option( $meta_key['order'], $user_id ) ) {
           $meta_value = array(
               'side' => 'submitdiv,formatdiv,categorydiv,postimagediv',
               'normal' => 'postexcerpt,tagsdiv-post_tag,postcustom,commentstatusdiv,commentsdiv,trackbacksdiv,slugdiv,authordiv,revisionsdiv',
               'advanced' => '',
           );
           update_user_option( $user_id, $meta_key['order'], $meta_value, true );
       }

       // Set the default hiddens if it has not been set yet
       if ( ! get_user_option( $meta_key['hidden'], $user_id ) ) {
           $meta_value = array('postcustom','trackbacksdiv','commentstatusdiv','commentsdiv','slugdiv','authordiv','revisionsdiv');
           update_user_option( $user_id, $meta_key['hidden'], $meta_value, true );
       }
    }
 }

Oui, get_user_meta devrait être get_user_option . Cela n'a pas d'importance pour un seul site, et même probablement pour plusieurs sites. Voir wp-admin / includes / ajax-actions.php pour savoir pourquoi: update_user_option a le paramètre global 'true'.

    
réponse donnée kitchin 23.06.2013 - 13:11
1
add_filter( 'hidden_meta_boxes', 'custom_hidden_meta_boxes' );
function custom_hidden_meta_boxes( $hidden ) {
    $hidden[] = 'your_metabox';
    return $hidden;
}

Il existe également un filtre hidden_meta_boxes qui "désactive" la métabox (la rendant masquée) à chaque chargement de page (sans pour autant mettre à jour la base de données). Si vous ne souhaitez que cela pour les nouveaux utilisateurs jusqu'à ce qu'ils aient coché la case eux-mêmes, utilisez la réponse de Rarst.

    
réponse donnée WraithKenny 01.03.2013 - 18:00

Lire d'autres questions sur les étiquettes