web-dev-qa-db-ja.com

メタボックスを1つのビッグメタボックスに統合する

分類タイプのタグボックスが7つ(7つと数えます)の投稿タイプがあります。デフォルトでは、これらのメタボックスを表示するための唯一のオプションは - 右側に7個の小さいメタボックスを積み重ねるか、またはこれらのタグのメタボックスをロングメタボックスにしてメインエディタの下に積み重ねることです。

私がしたいのは、すべてのメタボックスをエディタの下の1つの大きなメタボックスにまとめ、それらを3 x 3のグリッドに積み重ねることです(実際には1行に3つ、残り1つ)。

私の質問は、WordPressが作成するメタボックスになると、それがどのようにまたはどこに表示されるのかを制御できるかどうかです。これらのメタボックスを何らかの方法でグループ化することは可能ですか?

投稿タイプ/分類登録簿

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

分類法を'show_ui' => false,で登録してから、それらを管理するための単一のメタボックスを追加します。

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

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

または、サイドパネルからボックスのフックを外してメインエディタの下に配置します(投稿タイプと税務フォームのドキュメントを使用)。

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

3番目のオプションは、独自のメタボックスコンテナのセットを作成し、それらにコンテナボックスを追加することです。

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

ソースを見れば、あなたが作成したコンテナはmycol*-sortablesdividsで囲まれていることがわかります。あなたはあなたが後にある列を作成するためにそれを使うことができるはずです。

2
s_ha_dum

編集する

この回答のコードには、カスタム投稿タイプの非階層分類法に関する問題があります。

中心的な投稿タイプ(投稿、ページ)では、階層分類と非階層分類の両方で機能します。 CPTでは、階層的分類法でのみ機能します。

問題はjavascriptに関連しているように思われます、そしてそれを解決するためにWP javascriptコードを実際に掘り下げたくありません。


この答えは@ s_ha_dumと同じアプローチを使いますが、コア関数get_taxonomiespost_categories_meta_boxpost_tags_meta_box を使います。単一のメタボックスを出力すること。コアで使用されているのと同じ機能であるため、サードパーティのコードとの互換性が保証され、追加の作業、つまりユーザーが用語を追加できるかどうかなどをチェックできません。

ボーナスとしてそれは追加の努力なしですべての分類法のために動的に働きます。

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