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

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

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

Ваш ответ

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