wake-up-neo.com

Wie entferne ich alle Metaboxen für einen eigenen Beitragstyp?

Was ist eine effektive Methode, um alle Meta-Boxen für einen bestimmten Beitragstyp in Wordpress zu entfernen?

Die einzige Lösung zum Entfernen von Metaboxen, die ich gefunden habe, scheint die Funktion remove_meta_box() zu sein, für die eine ID der Metabox entfernt werden muss. Ich könnte alle Standard-Metaboxen wie diese entfernen, es wäre etwas umständlich, aber nicht unmöglich oder so schwer.

Wie gehe ich jedoch vor, wenn ich die Meta-Boxen, die Plugins oder Themenfunktionen hinzugefügt haben, an anderer Stelle konsequent entferne? Diese sind dynamisch und unvorhersehbar. Vielleicht kann ich eine Zusammenfassung der Meta-Felder für eine benutzerdefinierte Bearbeitungsseite für Beitragstypen zuverlässig abrufen und möglicherweise von dort aus arbeiten?

4
Megh

Wenn Sie alle Metaboxen für alle Benutzer verstecken möchten, können Sie dies über den get_user_option_metaboxhidden_{cpt}, default_hidden_meta_boxes oder den hidden_meta_boxes-Filter entsprechend der /wp-admin/includes/screen.php-Datei tun.

Hier ist ein Beispiel für den Beitragstyp 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

Die Quelle für remove_meta_box() sollte Ihnen eine vernünftige Vorstellung geben.

Die registrierten Boxen werden in $wp_meta_boxes global gespeichert. Wenn Sie dieses globale Element löschen (z. B. durch Zuweisen eines leeren Arrays), können sie nicht mehr verschoben werden.

Der einzige schwierige Teil wäre, den richtigen Kontext und das richtige Timing herauszufinden. Wenn du es zu früh machst, fügt Core oder ein Plugin möglicherweise Metaboxen nach. Wenn Sie es zu spät machen, werden einige bereits ausgegeben.

1
Rarst

Wie @rarst sagte, kann das Setzen von globalem $wp_meta_boxes auf ein leeres Array eine Lösung sein.

In Bezug auf das Problem timing ist der beste Ort, um die Variable zurückzusetzen, kurz bevor sie verwendet wird. Metaboxen werden über do_meta_boxes() function gedruckt und enthalten keine Hooks

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

und get_user_option() löst den Filter aus 'get_user_option_{$option}' damit Sie ihn für die Reinigung verwenden können.

Etwas wie das:

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

Das Problem timing ist jedoch nicht das einzige.

Das andere Problem besteht darin, dass, wenn Sie $wp_meta_boxes auf ein leeres Array setzen, alle Metaboxen entfernt werden, auch die Kernel, z. das Feld, in dem Sie den Beitrag speichern können.

Die Lösung besteht also nicht darin, sie auf ein leeres Array festzulegen, sondern auf das Array, das die Boxen enthält, die Sie beibehalten möchten.

Z.B. Um nur das Feld mit der Schaltfläche "Veröffentlichen" beizubehalten, verwenden Sie:

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