web-dev-qa-db-fra.com

remove_meta_box pour tous les types de post ne semble pas fonctionner

Pour supprimer une metabox de tous les types de publication à la fois, l'utilisation de foreach semble être la chose logique à faire. Cependant, cela ne fonctionne pas toujours et je ne comprends pas pourquoi.

Par exemple, si vous affichez le message "Post", le texte suivant supprime uniquement la variable trackbacksdiv:

function remove_metabox_from_all_post_types() {
$post_types = get_post_types();
foreach ( $post_types as $post_type )
            remove_meta_box('trackbacksdiv', $post_type, 'normal');
            remove_meta_box('postcustom', $post_type, 'normal');
            remove_meta_box('authordiv', $post_type, 'normal');
            remove_meta_box('postexcerpt', $post_type, 'normal');

}
add_action('admin_menu', 'remove_metabox_from_all_post_types', 999);

Bien que cela les supprime tous lors de l'affichage du type de message "Post":

function remove_metabox_from_all_post_types() {
$post_types = get_post_types();
foreach ( $post_types as $post_type )
            remove_meta_box('trackbacksdiv', 'post', 'normal');
            remove_meta_box('postcustom', 'post', 'normal');
            remove_meta_box('authordiv', 'post', 'normal');
            remove_meta_box('postexcerpt', 'post', 'normal');

}
add_action('admin_menu', 'remove_metabox_from_all_post_types', 999);

Je penserais que get_post_types est déclenché après que les métaboxes soient enregistrés, mais c'est la seule raison pour laquelle je peux deviner que cela ne fonctionne pas dans le premier sens, à moins que ce ne soit une erreur de syntaxe négligente que je ne récupère pas. J'ai aussi essayé d'utiliser le hook do_metaboxes actions mais cela n'a pas changé.

Des idées?

2
Bryan Willis

Rappelez-vous "Goto Fail" d'Apple?

Situation similaire:

C'est ce que fait votre code lorsque l'indentation est corrigée:

 foreach ( $post_types as $post_type )
        remove_meta_box('trackbacksdiv', $post_type, 'normal');

 remove_meta_box('postcustom', $post_type, 'normal');
 remove_meta_box('authordiv', $post_type, 'normal');
 remove_meta_box('postexcerpt', $post_type, 'normal');

Donc, il devrait faire le travail pour trackbacksdiv, mais pas pour le reste car les appels de fonction sont en dehors de foreach et $post_type n'est pas défini.

Si vous remplacez $post_type par post, cela fonctionne car, bien, les arguments de la fonction sont complets.

Enveloppez votre foreach dans { } et essayez à nouveau.

7
ungestaltbar

Veuillez noter que cela ne devrait pas être la réponse acceptée, il ne s'agit que d'une extension de la réponse donnée par @ungestaltbar , veuillez donc, @ willow, accepter l'autre réponse et si vous avez jugé ma réponse utile, donnez-moi simplement un vote positif :-)

Le problème le plus important qui devrait résoudre votre problème a été abordé dans l’autre réponse, mais j’aimerais souligner d’autres problèmes, car j’ai personnellement l’impression que votre code n’est pas totalement optimisé et qu’il n’est pas nécessaire de le faire.

Dans l'état actuel de votre code, vous avez les problèmes suivants:

  • votre code s'exécute sur chaque chargement de page sur front-end, sans nécessité. Vous voudriez seulement que votre code soit exécuté sur un écran d’administrateur, back-end. Pour cela, vous pouvez utiliser la balise is_admin() conditionnelle pour vérifier si vous êtes sur un écran d'administrateur.

  • get_post_types gets all types post, ce qui est inutile, vous voulez seulement obtenir les types public post

  • Si vous avez besoin de ce code pour s'exécuter uniquement pour admin ( current_user_can('manage_options') ) ou non-admin (!current_user_can('manage_options')), vous devez spécifier ceci

  • Le bon point à utiliser ici serait add_meta_boxes auquel raccorder votre fonction. Cela garantira que toutes les boîtes de méta sont chargées avant d'être supprimées.

Donc, en mettant tout cela ensemble, votre code devrait ressembler à ceci

function remove_metabox_from_all_post_types() {
    if( is_admin() && current_user_can('manage_options') ) {
    $args = array(
       'public'   => true,
    );
    $output = 'names'; // names or objects, note names is the default
    $operator = 'and'; // 'and' or 'or'

    $post_types = get_post_types( $args, $output, $operator ); 
        foreach ( $post_types  as $post_type ) {
            remove_meta_box('trackbacksdiv', $post_type, 'normal');
            remove_meta_box('postcustom', $post_type, 'normal');
            remove_meta_box('authordiv', $post_type, 'normal');
            remove_meta_box('postexcerpt', $post_type, 'normal');
        }
    }
}
add_action('add_meta_boxes', 'remove_metabox_from_all_post_types', 999);
5
Pieter Goosen