web-dev-qa-db-fra.com

Comment puis-je supprimer toutes les métaboxes pour un type de publication personnalisé?

Quel est un moyen efficace de supprimer toutes les boîtes de méta pour un type de message spécifique dans Wordpress?

La seule solution pour supprimer les métaboxes du tout que j'ai trouvée semble être la fonction remove_meta_box() , qui nécessite de supprimer l'identifiant du métabox. Je pourrais supprimer toutes les métaboxes par défaut comme ceci, ce serait un peu délicat mais pas impossible ou si difficile.

Cependant, comment pourrais-je supprimer systématiquement les plugins ou les fonctions de thème ajoutés dans les boîtes de méta-boîtes ailleurs? Celles-ci sont dynamiques et imprévisibles. Peut-être puis-je obtenir de manière fiable un résumé des boîtes de méta pour une page d'édition de types d'articles personnalisés et peut-être travailler à partir de là?

4
Megh

Si vous voulez cacher toutes les métaboxes pour tous les utilisateurs, vous pouvez le faire via le filtre get_user_option_metaboxhidden_{cpt}, default_hidden_meta_boxes ou hidden_meta_boxes, conformément au fichier /wp-admin/includes/screen.php.

Voici un exemple de type de poste post:

/**
 * Hide all metaboxes in the global $wp_meta_boxes
 */

add_filter( 'hidden_meta_boxes', function( $hidden, $screen, $use_defaults )
{
    global $wp_meta_boxes;
    $cpt = 'post'; // Modify this to your needs!

    if( $cpt === $screen->id && isset( $wp_meta_boxes[$cpt] ) )
    {
        $tmp = array();
        foreach( (array) $wp_meta_boxes[$cpt] as $context_key => $context_item )
        {
            foreach( $context_item as $priority_key => $priority_item )
            {
                foreach( $priority_item as $metabox_key => $metabox_item )
                    $tmp[] = $metabox_key;
            }
        }
        $hidden = $tmp;  // Override the current user option here.
    }
    return $hidden;
}, 10, 3 );
2
birgire

La source de remove_meta_box() devrait vous donner une idée raisonnable.

Les boîtes enregistrées sont stockées dans $wp_meta_boxes global. Effacer cette globale (par exemple en assignant un tableau vide) les empêchera de se déplacer.

La seule partie délicate serait de déterminer le contexte et le moment appropriés. Si vous le faites trop tôt, core ou un plugin pourrait ajouter des métaboxes après. Si vous le faites trop tard, certains se lanceront déjà dans la sortie.

1
Rarst

Comme @rarst l'a dit, la définition de $wp_meta_boxes global dans un tableau vide peut constituer une solution.

En ce qui concerne le problème timing, le meilleur endroit pour réinitialiser la variable est juste avant son utilisation. Les métaboxes sont imprimés via do_meta_boxes() function et à l'intérieur, il n'y a pas de crochets, mais il contient

get_user_option( "meta-box-order_$page" )

et get_user_option() déclenche le filtre 'get_user_option_{$option}' afin que vous puissiez l'utiliser pour effectuer votre nettoyage.

Quelque chose comme ça:

function remove_all_metaboxes($type) {
  add_filter("get_user_option_meta-box-order_{$type}", function() use($type) {
      global $wp_meta_boxes;
      $wp_meta_boxes[$type] = array();
      return array();
  }, PHP_INT_MAX);
}

Cependant, le problème timing n'est pas le seul.

L’autre problème est que, si vous définissez $wp_meta_boxes sur un tableau vide all / métaboxes sont supprimés, même ceux de base, par exemple. la boîte qui vous permet de sauvegarder le message.

La solution ne consiste donc pas à le définir sur un tableau vide, mais sur le tableau contenant les zones que vous souhaitez conserver.

Par exemple. pour ne conserver que la case avec le bouton Publier, utilisez:

function remove_all_metaboxes($type) {
  add_filter("get_user_option_meta-box-order_{$type}", function() use($type) {
      global $wp_meta_boxes;
      $publishbox = $wp_meta_boxes[$type]['side']['core']['submitdiv'];
      $wp_meta_boxes[$type] = array(
        'side' => array('core' => array('submitdiv' => $publishbox))
      );
      return array();
  }, PHP_INT_MAX);
} 

add_action('admin_init', function() {
  // replace with the slug of the post type you want to target
  remove_all_metaboxes('post'); 
});
0
gmazzap