Как добавить разделитель в меню администратора?

6 окт. 2010 г., 23:02:41
Просмотры: 27K
Голосов: 27

Кто-нибудь знает, как добавить разделитель в меню администратора? Я нашел это, но это не помогло.

Есть идеи?

1
Комментарии

Если кто-то до сих пор ищет ответ на этот вопрос, этот плагин может справиться с задачей.

user31760 user31760
2 мая 2013 г. 14:43:53
Все ответы на вопрос 7
8
40

Вот быстрый и простой способ получить то, что вам нужно.

Предыстория

WordPress хранит разделы меню админ-панели в глобальном массиве под названием $menu. Чтобы добавить разделитель, вы добавляете элемент в массив $menu, используя индекс, который находится между индексами опций, которые вы хотите разделить.

Использование функции add_admin_menu_separator()

Я написал функцию, которая инкапсулирует эту логику, и назвал её add_admin_menu_separator(). Вам нужно выбрать номер индекса массива, который больше, чем опция после которой вы хотите добавить разделитель, а затем вызвать функцию add_admin_menu_separator(), передав этот индекс в качестве параметра.

Например:

add_admin_menu_separator(37);

Сама функция add_admin_menu_separator()

Вот определение функции add_admin_menu_separator(), которую вы можете скопировать в файл functions.php вашей темы. Да, она может показаться сложной, но такой же является и код, который создаёт и использует глобальный массив $menu. (Планируется, что со временем он будет устаревшим, к счастью, но, вероятно, это произойдёт через несколько лет.)

function add_admin_menu_separator($position) {
  global $menu;
  $index = 0;
  foreach($menu as $offset => $section) {
    if (substr($section[2],0,9)=='separator')
      $index++;
    if ($offset>=$position) {
      $menu[$position] = array('','read',"separator{$index}",'','wp-menu-separator');
      break;
    }
  }
  ksort( $menu );
}

Поиск нужного индекса в массиве $menu

Чтобы определить, какой номер индекса вам нужен, вы можете выполнить var_dump() для $GLOBALS['menu'] внутри хука admin_init. Вот фрагмент кода, который можно временно добавить в файл functions.php вашей темы, чтобы увидеть значения. Это будет работать только при запросе URL, начинающегося с /wp-admin/ (но обязательно делайте это через FTP, а не через встроенный редактор тем, иначе вы потеряете доступ к своему сайту, по крайней мере, пока не получите доступ к файлу functions.php вашей темы через FTP!):

add_action('admin_init','dump_admin_menu');
function dump_admin_menu() {
  if (is_admin()) {
    header('Content-Type:text/plain');
    var_dump($GLOBALS['menu']);
    exit;
  }
}

Смотрите также:

Кстати, эти ссылки могут быть полезны для работы с меню админ-панели:

Хотя мои классы для меню админ-панели пока не предлагают простого способа добавления разделителей, я планирую добавить эту возможность, когда у меня будет время.

7 окт. 2010 г. 05:00:18
Комментарии

Спасибо, Майк, я всю ночь изучал глобальную переменную меню, но так и не смог добавить разделитель. Теперь мне стало гораздо понятнее, как работают меню в WordPress.

user1147 user1147
7 окт. 2010 г. 19:53:51

Привет @user1147: Да, их действительно сложно разобрать. Когда я впервые столкнулся с этим, это заняло у меня много времени, и я до сих пор испытываю трудности. Именно поэтому я написал эти функции - чтобы теперь делать это простым способом! В любом случае, рад, что мой ответ помог.

MikeSchinkel MikeSchinkel
7 окт. 2010 г. 20:39:50

@MikeSchinkel Этот метод не работает у меня в WordPress 3.3.1.

Jim Geurts Jim Geurts
10 янв. 2012 г. 00:49:38

@JimGeurts - у меня тоже не работает :/

Evan Mattson Evan Mattson
24 апр. 2012 г. 20:56:01

Кажется, больше не работает.

MastaBaba MastaBaba
19 июн. 2016 г. 16:43:17

Только что проверил - в 4.5 это "работает", но WordPress убрал линии, поэтому они просто не отображаются. Думаю, решение - добавить CSS, но я, как бэкенд-разработчик, плохо разбираюсь в CSS и не могу понять, какой именно CSS нужно добавить. Может, кто-то другой подскажет?

MikeSchinkel MikeSchinkel
23 июн. 2016 г. 04:23:41

@MikeSchinkel теперь эта ошибка исправлена. Предложенный код устанавливал разделитель по указанному индексу, но если добавить некоторый случайный шум к индексу, он не будет заменён — потому что 37.4345 это не 37 :)

fregante fregante
1 февр. 2018 г. 17:46:41

Query Monitor показывает ошибку PHP через AJAX в функции add_admin_menu_separator, и похоже, что это происходит потому, что $menu не существует для REST API запросов. Обёртка всего кода после global $menu в условие if (!empty($menu)) { } решает проблему.

cbirdsong cbirdsong
26 янв. 2022 г. 16:37:03
Показать остальные 3 комментариев
0

Это так же просто:

add_action( 'admin_init', 'add_sep' );
function add_sep() {

    if ( ! is_admin() )
        return false;

    global $menu;
    $sep = $menu[4]; // это стандартный разделитель
    $pos = 6; // измените на нужную позицию
    $menu = array_merge(
        array_slice( $menu, 0, $pos ),
        array( $sep ),
        array_slice( $menu, $pos + 1, -1)
    );
    $menu[ $pos - 1 ][4] .= ' menu-top-last';
    $menu[ $pos + 1 ][4] .= ' menu-top-first';

}

Примечание: Стандартная позиция разделителя ($menu[4]) может отличаться в зависимости от конфигурации, которую вы (или ваши плагины) сделали до вызова этого хука.

Конечно, вы также можете настроить интроспекцию классов menu-top-first и menu-top-last.

19 сент. 2012 г. 16:06:52
0

Возникли проблемы с тем, что разделители не добавлялись. Это было связано с тем, как WordPress удаляет дублирующиеся разделители. Добавление ksort($menu); в конец функции исправило проблему.

18 нояб. 2010 г. 05:15:37
0

Вы можете просто добавить этот код в functions.php

add_action('admin_menu', function () {   
  global $menu;
  $menu[49] = ['', 'read', '', '', 'wp-menu-separator'];
});

Где 49 — это позиция разделителя. Важно помнить, что позиция разделителя может заменить элемент вашего меню, если он имеет такую же позицию.

7 авг. 2020 г. 09:45:55
0

Это решение основано на ответе MastaBaba, но не заменяет элемент в указанной позиции - оно просто добавляет разделитель после неё.

Также использует анонимную функцию, поэтому совместимо только с PHP версии 5.3 и выше.

add_action( 'admin_menu', function () {
    $position = 29;
    global $menu;
    $separator = [
        0 => '',
        1 => 'read',
        2 => 'separator' . $position,
        3 => '',
        4 => 'wp-menu-separator'
    ];
    if (isset($menu[$position])) {
        $menu = array_splice($menu, $position, 0, $separator);
    } else {
        $menu[$position] = $separator;
    }
});
8 мая 2018 г. 15:44:07
2

Немного сложно понять, что именно вы пытаетесь сделать, но, кажется, вы хотите добавить пункт верхнего уровня в меню админки WordPress.

Ознакомьтесь с этой документацией в WordPress Codex.

Короче говоря, вам нужна функция add_menu_page(), которая принимает несколько аргументов и добавляет новый элемент в административное меню на том же уровне, что "Консоль", "Записи", "Медиафайлы" и т.д.

Надеюсь, я правильно понял. :-)

6 окт. 2010 г. 23:32:00
Комментарии

Я просто пытаюсь добавить разделитель в меню админки. Перед тем как задать вопрос, я пробовал использовать add_menu_page().

user1147 user1147
6 окт. 2010 г. 23:56:09

Похоже, MikeSchinkel уже хорошо вам помог. Извините за недопонимание. Удачи!

dgw dgw
7 окт. 2010 г. 23:41:22
2

Приведенный ниже код добавляет действие в WordPress, которое выполняется при отображении меню администратора. Меню администратора представляет собой массив, и здесь мы просто добавляем элемент массива, который определяет разделитель в указанной позиции.

Из этого источника:

add_action( 'admin_menu', 'set_admin_menu_separator' );
function set_admin_menu_separator() {
$position = 79;
global $menu;
$menu[$position] = array(
0   =>  '',
1   =>  'read',
2   =>  'separator' . $position,
3   =>  '',
4   =>  'wp-menu-separator'
);
}

Обратите внимание, что хотя этот код очень похож на текущий принятый ответ, тот ответ не сработал у меня (и, судя по комментариям, у нескольких других пользователей).

19 июн. 2016 г. 16:57:35
Комментарии

Нет никакой разницы с уже существующим принятым ответом, за исключением того, что вы не даёте никаких пояснений. Пожалуйста, прочтите [ответ].

fuxia fuxia
19 июн. 2016 г. 18:19:31

@toscho: Ну, у меня это работает, а принятый ответ — нет.

MastaBaba MastaBaba
19 июн. 2016 г. 20:22:19