Как добавить свой блок добавления пунктов меню в админке(wp nav menu)?
Мне нужно реализовать в админке вордпресс свой блок добавления пунктов меню, который находится в разделе «Внешний вид» — «Меню». Привел на картинке пример того что именно мне нужно.
Нужно добавить полноценный функциональный блок, из которого можно добавить пункты меню.
Это все нужно для того, что бы администратор сайта мог легко вставить в меню ссылку на профиль пользователя или определенную старницу профиля пользователя. Проблема заключается в том что ссылка пункта меню всегда отличается только логином пользователя. Соответственно я хочу сделать что бы администратор добавлял пункт в меню а на сайте для разных пользователей добавлялись правильные ссылки. То есть у каждого на свой профиль.
Добавить в раздел «Внешний вид» — «Меню» свой блок довольно не сложно. Приведу пример добавления 3х ссылок:
function my_register_menu_metabox() { $custom_param = array( 0 => 'This param will be passed to my_render_menu_metabox' ); add_meta_box( 'my-menu-test-metabox', 'Test Menu Metabox', 'my_render_menu_metabox', 'nav-menus', 'side', 'default', $custom_param ); } add_action( 'admin_head-nav-menus.php', 'my_register_menu_metabox' ); /** * Displays a menu metabox * * @param string $object Not used. * @param array $args Parameters and arguments. If you passed custom params to add_meta_box(), * they will be in $args['args'] */ function my_render_menu_metabox( $object, $args ) { global $nav_menu_selected_id; // Create an array of objects that imitate Post objects $my_items = array( (object) array( 'ID' => 1, 'db_id' => 0, 'menu_item_parent' => 0, 'object_id' => 1, 'post_parent' => 0, 'type' => 'my-custom-type', 'object' => 'my-object-slug', 'type_label' => 'My Cool Plugin', 'title' => 'Custom Link 1', 'url' => home_url( '/custom-link-1/' ), 'target' => '', 'attr_title' => '', 'description' => '', 'classes' => array(), 'xfn' => '', ), (object) array( 'ID' => 2, 'db_id' => 0, 'menu_item_parent' => 0, 'object_id' => 2, 'post_parent' => 0, 'type' => 'my-custom-type', 'object' => 'my-object-slug', 'type_label' => 'My Cool Plugin', 'title' => 'Custom Link 2', 'url' => home_url( '/custom-link-2/' ), 'target' => '', 'attr_title' => '', 'description' => '', 'classes' => array(), 'xfn' => '', ), (object) array( 'ID' => 3, 'db_id' => 0, 'menu_item_parent' => 0, 'object_id' => 3, 'post_parent' => 0, 'type' => 'my-custom-type', 'object' => 'my-object-slug', 'type_label' => 'My Cool Plugin', 'title' => 'Custom Link 3', 'url' => home_url( '/custom-link-3/' ), 'target' => '', 'attr_title' => '', 'description' => '', 'classes' => array(), 'xfn' => '', ), ); $db_fields = false; // If your links will be hieararchical, adjust the $db_fields array bellow if ( false ) { $db_fields = array( 'parent' => 'parent', 'id' => 'post_parent' ); } $walker = new Walker_Nav_Menu_Checklist( $db_fields ); $removed_args = array( 'action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce', ); ?> <div id="my-plugin-div"> <div id="tabs-panel-my-plugin-all" class="tabs-panel tabs-panel-active"> <ul id="my-plugin-checklist-pop" class="categorychecklist form-no-clear" > <?php echo walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', $my_items ), 0, (object) array( 'walker' => $walker ) ); ?> </ul> <p class="button-controls"> <span class="list-controls"> <a href="<?php echo esc_url(add_query_arg( array( 'my-plugin-all' => 'all', 'selectall' => 1, ), remove_query_arg( $removed_args ) )); ?>#my-menu-test-metabox" class="select-all"><?php _e( 'Select All' ); ?></a> </span> <span class="add-to-menu"> <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>" name="add-my-plugin-menu-item" id="submit-my-plugin-div" /> <span class="spinner"></span> </span> </p> </div> <?php }
Теперь у нас есть свой блок, но нам нужно изменить ссылки нашего блока перед выводом, для это го воспользуйтесь следующим кодом:
add_filter( 'wp_get_nav_menu_items', 'cpt_archive_menu_filter', 10, 3 ); function cpt_archive_menu_filter( $items, $menu, $args ) { /* alter the URL for cpt-archive objects */ foreach ( $items as &$item ) { if ( $item->object != 'my-object-slug' ) continue; /* we stored the post type in the type property of the menu item */ $item->url = get_post_type_archive_link( $item->type ); if ( get_query_var( 'post_type' ) == $item->type ) { $item->classes []= 'current-menu-item'; $item->current = true; } } return $items; }
Данный код не полностью реализует вашу задачу, но вам нужно всего лишь прописать свои ссылки в первом примере кода. А во втором прописать для $item->url — нужную ссылку.
Будут вопросы — задавайте.