Konsolidieren Sie Metaboxen in 1 große Metabox

Ich habe einen Post-Typ mit 7 Taxonomie-Tag-Boxen (es zählen SIEBEN!). Standardmäßig sind die einzigen Optionen, um diese Metaboxen anzuzeigen, – 7 kleine Metaboxen auf der rechten Seite, die diese stapeln oder diese Metaboxen in lange Metaboxen umwandeln und unter dem Haupteditor stapeln.

Was ich lieber tun würde, ist alle Metaboxen in eine große Metabox unterhalb des Editors zu bringen und sie in einem 3×3 Raster zu stapeln (wirklich wären es 3 pro Zeile mit 1 Rest).

Meine Frage ist, wenn es um Metaboxen geht, die WordPress erstellt, habe ich irgendeine Kontrolle darüber, wie oder wo es angezeigt wird? Ist es möglich, diese Metaboxen auf irgendeine Art zu gruppieren?

Post-Typ / Taxonomie-Register

// Products Custom Post Type register_post_type( 'cpt_products', array( 'labels' => array( 'name' => __( 'Products' ), 'singular_name' => __( 'Product' ), 'all_items' => __( 'View Products' ), 'add_new' => __( 'New Product' ), 'add_new_item' => __( 'New Product' ), 'edit_item' => __( 'Edit Product' ), 'view_item' => __( 'View Product' ), 'search_items' => __( 'Search Products' ), 'no_found' => __( 'No Products Found' ), 'not_found_in_trash' => __( 'No Products in Trash' ) ), 'public' => true, 'show_ui' => true, 'query_var' => false, 'show_in_nav_menus' => false, 'capability_type' => 'post', 'hierarchical' => false, 'menu_position' => 20, 'menu_icon' => 'dashicons-cart', 'has_archive' => 'products', 'rewrite' => array( 'slug' => 'product', 'with_front' => false ), 'supports' => array( 'title','editor','thumbnail','page-attributes' ) )); // Testing Taxonomy for Products register_taxonomy( 'tax_testing', 'cpt_products', array( 'labels' => array( 'name' => __( 'Test' ), 'singular_name' => __( 'Test' ), 'menu_name' => __( 'View Test' ), 'all_items' => __( 'All Test' ), 'edit_item' => __( 'Edit Test' ), 'view_item' => __( 'View Test' ), 'update_item' => __( 'Update Test' ), 'add_new_item' => __( 'New Test' ), 'new_item_name' => __( 'Rename Test' ), 'parent_item' => __( 'Parent Test' ), 'parent_item_colon' => __( 'Parent Test:' ), 'search_items' => __( 'Search Test' ), 'popular_items' => __( 'Popular Test' ), 'seperate_items_with_commas'=> __( 'Separate Test with commas' ), 'add_or_remove_items' => __( 'Add or remove Test' ), 'choose_from_most_used' => __( 'choose from most used Test' ), 'not_found' => __( 'No Test found.' ) ), 'show_ui' => true, 'show_admin_column' => true, 'sort' => true, 'rewrite' => array( 'slug' => 'products/test', 'with_front' => false ) )); 

Solutions Collecting From Web of "Konsolidieren Sie Metaboxen in 1 große Metabox"

Registrieren Sie Ihre Taxonomien mit 'show_ui' => false, und fügen Sie dann eine einzelne 'show_ui' => false, hinzu, um sie zu verwalten.

 function create_book_tax() { register_taxonomy( 'genre', 'book', array( 'label' => __( 'Genre' ), 'rewrite' => array( 'slug' => 'genre' ), 'hierarchical' => true, 'show_ui' => false, ) ); } 

Oder haken Sie die Kästchen von der Seitenleiste ab und legen Sie sie unterhalb des Haupteditors (mit einem Post-Typ und Steuerformular).

 add_action( 'add_meta_boxes_book', function () { remove_meta_box( 'genrediv', 'book', 'side' ); $tax_name = 'genre'; $taxonomy = get_taxonomy( $tax_name ); $label = $taxonomy->labels->name; $tax_meta_box_id = $tax_name . 'div'; add_meta_box( $tax_meta_box_id, $label, $taxonomy->meta_box_cb ); } ); 

Eine dritte Möglichkeit besteht darin, einen eigenen Satz von Meta-Box-Containern zu erstellen und Ihre Boxen diesen hinzuzufügen.

 add_action( 'add_meta_boxes_book', function () { remove_meta_box( 'genrediv', 'book', 'side' ); } ); add_action( 'dbx_post_sidebar', function ($post) { $tax_name = 'genre'; $taxonomy = get_taxonomy( $tax_name ); $label = $taxonomy->labels->name; $tax_meta_box_id = $tax_name . 'div'; add_meta_box( $tax_meta_box_id, $label, $taxonomy->meta_box_cb, 'book', 'mycol1' ); echo 'my boxes'; //debug do_meta_boxes('book', 'mycol1', $post); do_meta_boxes('book', 'mycol2', $post); do_meta_boxes('book', 'mycol3', $post); echo 'end my boxes'; //debug } ); 

Wenn Sie sich die Quelle ansehen, sehen Sie, dass die von Ihnen erstellten Container von div s mit der mycol*-sortables id . Sie sollten damit in der Lage sein, die gewünschten Spalten zu erstellen.

Bearbeiten

Der Code in dieser Antwort hat Probleme mit nicht-hierarchischen Taxonomien für benutzerdefinierte Post-Typen.

Für Core-Post-Typen (Post, Seite) funktioniert es sowohl für hierarchische als auch für nicht-hierarchische Taxonomien. Für CPT funktioniert es nur für hierarchische Taxonomien.

Das Problem scheint mit Javascript zu tun zu haben, und ich möchte nicht wirklich in WP Javascript Code graben, um es zu lösen.


Diese Antwort verwendet den gleichen Ansatz von @s_ha_dum , verwendet aber die corefunktionen get_taxonomies , post_categories_meta_box und post_tags_meta_box um eine einzelne post_tags_meta_box auszugeben, die die gleichen corefunktionen verwendet und die Kompatibilität mit einem beliebigen Drittanbietercode gewährleistet und zusätzliche Arbeit vermeidet, dh um zu prüfen, ob der Benutzer über functionen verfügt Begriffe hinzufügen und so weiter.

Als Bonus funktioniert es dynamisch für alle Taxonomien ohne zusätzlichen Aufwand.

Taxonomien große Metabox

 add_action( 'add_meta_boxes', 'my_taxonomies_meta_box', 10, 2 ); function my_taxonomies_meta_box( $post_type, $post ) { // all public taxonomies for current post type $taxs = get_taxonomies( array( 'object_type' => array( $post_type ), 'show_ui' => true ) ); $output = '
'; foreach ( $taxs as $tax ) { $i = ! isset($i) ? 1 : $i + 1; $cb = 'post_categories_meta_box'; $id = "{$tax}div"; // set callback and id for non-hierarchical taxonomies if ( ! is_taxonomy_hierarchical( $tax ) ) { $cb = 'post_tags_meta_box'; $id = "tagsdiv-{$tax}"; } remove_meta_box( $id, $post_type, 'side' ); // remove core metabox $tax_obj = get_taxonomy( $tax ); $args = array( 'args' => array( 'taxonomy' => $tax ), 'title' => $tax_obj->labels->name ); // add a 1/3 wide div with tax metabox $format = '
'; $output .= sprintf( $format, $id, 'padding:8px;width:30%;margin:1%;float:left;' ); $output .= '

' . $tax_obj->labels->name . '

'; ob_start(); call_user_func( $cb, $post, $args ); $output .= ob_get_clean(). '
'; if ( ( $i !== 0 && $i%3 === 0 ) || $i === count( $taxs ) ) { $output .= '
'; } } // end foreach $output .= '
'; // add a callback that will output all the markup generated add_meta_box( 'all_taxonomies', __('Taxonomies'), function() use( $output ) { echo $output; }, $post_type, 'normal', 'high' ); } // end function