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

Вот быстрый и простой способ получить то, что вам нужно.
Предыстория
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;
}
}
Смотрите также:
Кстати, эти ссылки могут быть полезны для работы с меню админ-панели:
Хотя мои классы для меню админ-панели пока не предлагают простого способа добавления разделителей, я планирую добавить эту возможность, когда у меня будет время.

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

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

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

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

Это так же просто:
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
.

Вы можете просто добавить этот код в functions.php
add_action('admin_menu', function () {
global $menu;
$menu[49] = ['', 'read', '', '', 'wp-menu-separator'];
});
Где 49 — это позиция разделителя. Важно помнить, что позиция разделителя может заменить элемент вашего меню, если он имеет такую же позицию.

Это решение основано на ответе 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;
}
});

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

Приведенный ниже код добавляет действие в 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'
);
}
Обратите внимание, что хотя этот код очень похож на текущий принятый ответ, тот ответ не сработал у меня (и, судя по комментариям, у нескольких других пользователей).
