Wie füge ich eine benutzerdefinierte Metabox zum Admin-Bildschirm Menüverwaltung hinzu?

Obwohl ich dem WordPress-coreteam sehr dankbar bin, dass es endlich native Menüverwaltungsfunktionen integriert hat, bin ich frustriert mit einigen Schlüsselelementen, die ich gerne ändern würde.

Ich brauche eine Möglichkeit, Seiten zu zeigen, die hierarchisch sind, wie hierarchische Kategorien angezeigt werden, anstatt in einer Liste zu sein, und ich brauche eine Möglichkeit, Links manuell hinzuzufügen, die zu einem Menü hinzugefügt werden können.

Wie kann das gemacht werden?

Danke im Voraus

AKTUALISIERT Also, hier sind die zwei Dinge, die ich versuche zu tun. Derzeit, wenn Sie auf die Standard-WordPress “Menü Verwaltung” Admin-Bildschirm gehen, können Sie wählen, um die “Seiten” Metabox auf der linken Seite anzuzeigen. Das Problem hier ist, dass, wenn Sie auf die Registerkarte “Alle anzeigen” klicken, KEINE der Seiten korrekt sortiert sind und sie nicht eingerückt sind, falls zutreffend.

AKTUELLES STANDARD-LAYOUT:

AKTUELLE DEFAULT WP ORGANISATION

GEWÜNSCHTER LAYOUT: (Bitte beachten Sie, dass ich sie nur eingerückt habe, um die Elternbeziehung anzuzeigen , die Artikel sollten auch nach ihrer Sortierreihenfolge sortiert werden).

was ich möchte

Darüber hinaus benötige ich innerhalb dieser Liste (oder wenn es dann einfacher ist, innerhalb ihrer eigenen Metabox) eine Art von hart codierenden Links, die in Form einer Checkbox-Liste präsentiert werden sollten, so dass man auf Elemente klicken und sie in das Menü aufnehmen kann. Der Grund dafür ist, dass ich diese Elemente nicht manuell über die “benutzerdefinierten Links” hinzufügen muss, sondern sie lieber aus einer Liste auswählen würde.

Solutions Collecting From Web of "Wie füge ich eine benutzerdefinierte Metabox zum Admin-Bildschirm Menüverwaltung hinzu?"

Das ist mir gelungen, aber es ist ein Durcheinander. Grundsätzlich sollte der Walker die folgenden Parameter haben:

$this->db_fields['parent'] = 'post_parent'; $this->db_fields['id'] = 'ID'; 

Aber um das zu erreichen, müssen Sie den vorhandenen Metabox-Callback herausreißen, ihn kopieren, eine Zeile ändern, um einen zusätzlichen Filter zu erhalten, und ihn zurückstellen. Dann können Sie Ihren eigenen Gehwagen mit diesen Parametern übergeben.

 add_filter( 'admin_head-nav-menus.php', 'wpse2770_admin_head_nav_menus' ); function wpse2770_admin_head_nav_menus() { // Hijack "Pages" meta box callback with one that has an extra filter for the walker class $GLOBALS['wp_meta_boxes']['nav-menus']['side']['default']['add-page']['callback'] = 'wpse2770_wp_nav_menu_item_post_type_meta_box'; // Since Walker_Nav_Menu_Checklist is not always available, we create this class in this function (didn't even know that was possible...) class WPSE2770_Walker_Nav_Menu_Checklist extends Walker_Nav_Menu_Checklist { public function __construct() { $this->db_fields['parent'] = 'post_parent'; $this->db_fields['id'] = 'ID'; } } } add_filter( 'wp_nav_menu_item_post_type_meta_box_walker', 'wpse2770_wp_nav_menu_item_post_type_meta_box_walker', 10, 3 ); function wpse2770_wp_nav_menu_item_post_type_meta_box_walker( $walker, $post_type, $context ) { if ( 'page' == $post_type && 'view-all' == $context ) { $walker = 'WPSE2770_Walker_Nav_Menu_Checklist'; } return $walker; } function wpse2770_wp_nav_menu_item_post_type_meta_box( $object, $post_type ) { global $_nav_menu_placeholder, $nav_menu_selected_id; $post_type_name = $post_type['args']->name; // paginate browsing for large numbers of post objects $per_page = 50; $pagenum = isset( $_REQUEST[$post_type_name . '-tab'] ) && isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 1; $offset = 0 < $pagenum ? $per_page * ( $pagenum - 1 ) : 0; $args = array( 'offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false ); if ( isset( $post_type['args']->_default_query ) ) $args = array_merge($args, (array) $post_type['args']->_default_query ); // @todo transient caching of these results with proper invalidation on updating of a post of this type $get_posts = new WP_Query; $posts = $get_posts->query( $args ); if ( ! $get_posts->post_count ) { echo '

' . __( 'No items.' ) . '

'; return; } $post_type_object = get_post_type_object($post_type_name); $num_pages = $get_posts->max_num_pages; $page_links = paginate_links( array( 'base' => add_query_arg( array( $post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name, ) ), 'format' => '', 'prev_text' => __('«'), 'next_text' => __('»'), 'total' => $num_pages, 'current' => $pagenum )); if ( !$posts ) $error = '
  • '. $post_type['args']->labels->not_found .'
  • '; $walker = 'Walker_Nav_Menu_Checklist'; $current_tab = 'most-recent'; if ( isset( $_REQUEST[$post_type_name . '-tab'] ) && in_array( $_REQUEST[$post_type_name . '-tab'], array('all', 'search') ) ) { $current_tab = $_REQUEST[$post_type_name . '-tab']; } if ( ! empty( $_REQUEST['quick-search-posttype-' . $post_type_name] ) ) { $current_tab = 'search'; } $removed_args = array( 'action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce', ); ?>
      < ?php $recent_args = array_merge( $args, array( 'orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15 ) ); $most_recent = $get_posts->query( $recent_args ); $args['walker'] = new $walker; echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args ); ?>
    < ?php if ( ! empty( $page_links ) ) : ?> < ?php endif; ?>
      < ?php // WPSE 2770: And this is the filter we want to add! $walker = apply_filters( 'wp_nav_menu_item_post_type_meta_box_walker', $walker, $post_type_name, 'view-all' ); $args['walker'] = new $walker; // if we're dealing with pages, let's put a checkbox for the front page at the top of the list if ( 'page' == $post_type_name ) { $front_page = 'page' == get_option('show_on_front') ? (int) get_option( 'page_on_front' ) : 0; if ( ! empty( $front_page ) ) { $front_page_obj = get_post( $front_page ); $front_page_obj->_add_to_top = true; $front_page_obj->label = sprintf( _x('Home: %s', 'nav menu front page title'), $front_page_obj->post_title ); array_unshift( $posts, $front_page_obj ); } else { $_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval($_nav_menu_placeholder) - 1 : -1; array_unshift( $posts, (object) array( '_add_to_top' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/'), ) ); } } $args['walker']->db_fields['parent'] = 'post_parent'; $checkbox_items = walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args ); if ( 'all' == $current_tab && ! empty( $_REQUEST['selectall'] ) ) { $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items); } echo $checkbox_items; ?>
    < ?php if ( ! empty( $page_links ) ) : ?> < ?php endif; ?>

    < ?php _e('Select All'); ?> class="button-secondary submit-add-to-menu" value="< ?php esc_attr_e('Add to Menu'); ?>" name="add-post-type-menu-item" id="submit-posttype-< ?php echo $post_type_name; ?>" />

    < ?php }

    Dies ist etwas, das in ein Ticket auf WordPress Trac eingefügt werden sollte, damit die UI-Gruppe es durchgehen kann. http://core.trac.wordpress.org/

    ( Bearbeiten: Zugehöriges Ticket ist # 14660 – Hierarchische Seitenliste in wp-admin / nav-menus.php )