web-dev-qa-db-fra.com

Consolidation des Metabox en 1 Big Metabox

J'ai un type de message avec 7 (comptez SEPT!) Boîtes de taxonomie tag. Par défaut, les seules options permettant d'afficher ces métaboxes sont les suivantes: - 7 petites métaboxes situées à droite de la pile ou transformer ces métaboxes de balises en métaboxes longues et les empiler sous l'éditeur principal.

Ce que je préférerais, c’est de placer tous les métaboxes dans un gros métabox en dessous de l’éditeur, en les empilant dans une grille 3x3 (en réalité, ce serait 3 par rangée avec 1 reste).

Ma question concerne les métaboxes créées par WordPress. Est-ce que je peux contrôler comment et où il est affiché? Est-il possible de regrouper ces métaboxes d'une manière ou d'une autre?

Registres de type publication/taxonomie

// 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 )
));
2
Howdy_McGee

Enregistrez vos taxonomies avec 'show_ui' => false, puis ajoutez une seule méta-boîte pour les gérer.

function create_book_tax() {
        register_taxonomy(
                'genre',
                'book',

                array(
                        'label' => __( 'Genre' ),
                        'rewrite' => array( 'slug' => 'genre' ),
                        'hierarchical' => true,
                        'show_ui' => false,
                )
        );
}

Vous pouvez également décrocher les cases du panneau latéral et les placer sous l'éditeur principal (à l'aide d'un type d'article et d'un formulaire de taxe les documents).

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

Une troisième option consiste à créer votre propre ensemble de conteneurs de boîte à méta et à y ajouter vos boîtes.

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

Si vous regardez la source, vous verrez que les conteneurs que vous avez créés sont entourés de divs avec le mycol*-sortablesid. Vous devriez pouvoir l'utiliser pour créer les colonnes que vous recherchez.

2
s_ha_dum

Modifier

Le code dans cette réponse a un problème avec les taxonomies non hiérarchiques pour les types d'article personnalisés.

Pour les types de publication de base (post, page), cela fonctionne pour les taxonomies hiérarchiques et non hiérarchiques. Pour CPT, cela ne fonctionne que pour les taxonomies hiérarchiques.

Le problème semble être lié au javascript, et je ne veux pas vraiment creuser dans WP code javascript pour le résoudre.


Cette réponse utilise la même approche que @ s_ha_dum mais utilise les fonctions principales get_taxonomies, post_categories_meta_box et post_tags_meta_box pour sortir une seule métabox, les mêmes fonctions utilisées par le noyau assurant la compatibilité avec tout code tiers et évitant tout travail supplémentaire, c’est-à-dire de vérifier si l’utilisateur a la possibilité termes et ainsi de suite.

En prime, il fonctionne de manière dynamique pour toutes les taxonomies sans aucun effort supplémentaire.

Taxonomies big 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 = '<div>';

  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 = '<div id="%s" class="postbox" style="%s">';
    $output .= sprintf( $format, $id, 'padding:8px;width:30%;margin:1%;float:left;' );

    $output .= '<h3>' . $tax_obj->labels->name . '</h3>';
    ob_start();
    call_user_func( $cb, $post, $args );
    $output .= ob_get_clean(). '</div>';

    if ( ( $i !== 0 && $i%3 === 0 ) || $i === count( $taxs ) ) {
      $output .= '<div style="width:100%;clear:both;"></div>';
    }

  } // end foreach

  $output .= '</div><div style="width:100%;clear:both;"></div>';

  // 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
1
gmazzap