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

20

Je serais ravi de pouvoir masquer les méta-boîtes à l'aide des options d'écran, au lieu de les supprimer ou de les restreindre aux rôles d'utilisateur, le but est de simplement "décocher" la méta-boîte pour l'utilisateur.

Je vois comment cela serait délicat car tout code qui ferait un changement de base de données pour un utilisateur ne serait pas autorisé à s'exécuter à chaque fois qu'il accède à la page, car il se réinitialiserait simplement. Mais les gens plus intelligents que moi codent le noyau, alors peut-être qu'il y a un moyen. Et s'il y en a, je meurs d'envie de savoir.

Des idées?

developdaly
la source
Par nom d'utilisateur, vous devez créer votre propre plugin qui remplit tous les utilisateurs d'une case à côté de leur nom et se connecte à un filtre pour afficher les métadonnées ou plusieurs métadonnées.
Wyck
Par défaut, vous voulez dire qu'ils doivent être appliqués une fois lors de la création d'un nouvel utilisateur, n'est-ce pas?
Rarst

Réponses:

25

Vous faites référence aux métaboxes sur l'écran de publication d'administrateur à droite?

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

Fondamentalement, ce qui se passe, c'est que pour l'utilisateur actuellement connecté, vous modifiez des 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 vous connecter à 'admin_init'.

L'avantage d'utiliser 'user_register' est que cette fonction ne se déclenchera que lorsqu'un nouvel utilisateur sera enregistré (donc une surcharge plus faible). Cependant, cela ne fonctionnera pas pour les utilisateurs qui existent déjà.

Si vous souhaitez que cela fonctionne pour les utilisateurs qui existent déjà, connectez-vous à «admin_init». L'inconvénient est bien sûr que cette fonction se déclenche à chaque fois qu'un utilisateur accède à la page d'administration.

drebabels
la source
15
Ce n'est pas un travail de thème et n'appartient pas à un fichier functions.php.
fuxia
6
@toscho Je ne suis pas vraiment d'accord avec ça. Naturellement, vous pouvez mettre cela dans un plugin, mais si, par exemple, vous créez un thème pour vous-même ou peut-être pour un client qui n'a pas besoin de voir certaines cases, alors pourquoi ajouter la surcharge de gestion supplémentaire qui vient avec l'inclusion dans un plugin. En le déposant dans le fichier functions.php, vous vous assurez que l'expérience du thème est cohérente sans avoir à vous assurer qu'un plugin est installé et activé.
drebabels
10
Il n'y a pas de surcharge en utilisant un plugin. C'est un mythe qui doit mourir instantanément. De plus, votre restriction d'utilisation ne faisait pas partie de la question. Votre réponse est lue par des milliers de novices. Vous les aiderez avec le meilleur code que vous pouvez écrire, pas avec quelque chose qui fonctionne un peu dans certaines situations spécifiques. :)
fuxia
+1 Bonne réponse - parfois, vous souhaitez les définir explicitement. C'est une bonne base, et bien sûr, ce code peut être modifié facilement pour être appelé si nécessaire (en ajoutant un nouvel utilisateur, par exemple), de sorte que vous définissez vraiment les options "par défaut" et ne forcez pas les options sur les utilisateurs qui les changent. J'ajouterai ce code au functions.phpfichier de mon thème car les options par défaut sont pour un projet spécifique, qui est représenté / hébergé par le thème que je développe.
cwd
1
Quelques mois après la rédaction de cette réponse, les filtres ont été ajoutés au noyau, rendant cette réponse obsolète.
WraithKenny
16

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

Rarst
la source
7

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 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 meta_box spécifiques 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 proposées:

1. La hidden_meta_boxessolution de WraithKenny est celle qui remplace l'option user_option. Notez qu'il couvre tous les types de publication («publication», «page», «lien», «pièce jointe» et tous les types de publication personnalisés). C'est bien, sauf si vous voulez que ce soit précis. Vous avez spécifié les post_type dans vos add_meta_box()appels. Vous pouvez essayer de faire correspondre ceux-ci, ou tout simplement le faire car ceux qui ne correspondent pas seront ignorés. Si vous voulez connaître le post_type dans le filtre, vous pouvez utiliser le screenparamètre supplémentaire :

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_boxesrespecte 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 l'option user_option. Notez qu'il est codé en dur pour l'écran d'édition «post». Pour gérer l'écran d'édition de la page et d'autres post_types, encapsulez 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 );
       }
    }
 }

Ouais, ça get_user_metadevrait l'être get_user_option. Pour un site unique, cela n'a pas d'importance, et même pour plusieurs sites, cela n'a probablement pas d'importance. Voir wp-admin / includes / ajax-actions.php pour savoir pourquoi: update_user_optiona le "vrai" paramètre global.

kitchin
la source
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 hidden_meta_boxesfiltre qui "décocherait" la métaboxe (la rendant masquée) à chaque chargement de page (mais n'aurait pas du tout à mettre à jour la base de données). Si vous voulez simplement le désactiver pour les nouveaux utilisateurs jusqu'à ce qu'ils cochent la case eux-mêmes, utilisez la réponse de Rarst.

WraithKenny
la source