Как добавить свой блок добавления пунктов меню в админке(wp nav menu)?

Мне нужно реализовать в админке вордпресс свой блок добавления пунктов меню, который находится в разделе «Внешний вид» — «Меню». Привел на картинке пример того что именно мне нужно.

Как добавить свой блок добавления пунктов меню в админке(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 — нужную ссылку.

    Будут вопросы — задавайте.

    Добавить Комментарий

    Ваш ответ

    Размещая свой ответ, вы соглашаетесь с правилами сайта.