web-dev-qa-db-fra.com

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

J'aimerais pouvoir masquer les méta-boîtes à l'aide d'options d'écran, au lieu de les supprimer ou de les limiter à des 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 clique 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 d'envie de savoir.

Des idées?

20
developdaly

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, déposez simplement ce qui suit 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_values ​​enregistrées dans la table wp_usermeta.

Il existe deux manières d’utiliser cette fonction: vous pouvez soit vous connecter à "user_register", soit à "admin_init".

L'utilisation de 'user_register' présente l'avantage que cette fonction ne sera activée que lorsqu'un nouvel utilisateur est enregistré (donc moins de temps système). Cependant, 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 d’administrateur.

23
drebabels

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 modifié ses préférences dans les options de l'écran.

16
Rarst

J'ai des commentaires de code sur trois solutions déjà posté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 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 respecter cela. Non, je n'ai pas écrit ce code! Ça devrait être facile ... :)

Les trois solutions affichées:

1. La solution hidden_meta_boxes de WraithKenny est celle qui annule 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 précis. Vous avez spécifié le type de post_type dans vos appels add_meta_box(). Vous pouvez essayer de les faire correspondre, ou simplement de les dériver 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 utilisateur. 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 probablement même pour plusieurs sites. Voir wp-admin/includes/ajax-actions.php pour savoir pourquoi: update_user_option possède le paramètre global 'true'.

6
kitchin
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écoche" la métabox (la rendant masquée) à chaque chargement de page (sans pour autant mettre à jour la base de données). Si vous ne le souhaitez que pour new users jusqu'à ce qu'ils cochez la case eux-mêmes, utilisez la réponse de Rarst.

1
WraithKenny