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

22

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

Любые идеи?

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

Ответы:

33

Вот быстрый и грязный способ получить то, что вы хотите.

Задний план

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, а не встроенный редактор тем, иначе вы потеряете доступ к своему сайту, по крайней мере, пока не получите FTP-доступ к functions.phpфайлу вашей темы !) :

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

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

Кстати, вы можете найти эти ссылки в целом полезными для работы с меню администратора:

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

MikeSchinkel
источник
Спасибо, Майк, я проверил всю ночь, изучая глобальное меню var, но мне не удалось добавить разделитель, теперь мне намного понятнее, как работают меню в wp.
user1147 7.10.10
Привет @ user1147 : Да, их очень сложно понять. Когда я впервые это сделал, мне потребовалось довольно много времени, и я все еще борюсь с ними. Следовательно, почему я написал эти функции, так что теперь я могу делать это простым способом! В любом случае, рад, что мой ответ помог.
MikeSchinkel
1
@MikeSchinkel Этот метод не работает для меня с Wordpress 3.3.1.
Джим Гёртс
1
@JimGeurts - это не работает для меня тоже: /
Эван Маттсон
2
Я только что протестировал его, и он работает в 4.5, но WordPress решил избавиться от строк, которые больше не появляются. Я думаю, что решение, если добавить CSS, но для жизни я не могу понять, какой CSS добавить, так как я бэкэнд-разработчик и отстой в CSS. Может кто еще может подсказать?
MikeSchinkel
4

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

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

    if ( ! is_admin() )
        return false;

    global $menu;
    $sep = $menu[4]; // that's the default separator
    $pos = 6; // change it for the desired position
    $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классы самоанализа.

vmassuchetto
источник
2

Если некоторые проблемы с разделителями не были добавлены, это было связано с тем, как WordPress удаляет дубликаты разделителей. Добавление ksort($menu);в конец функции исправило проблему.


источник
1

Это основано на ответе 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;
    }
});
robrecord
источник
0

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

Смотрите эту документацию в Кодексе WordPress.

Короче говоря, вы ищете использование add_menu_page()функции, которая принимает ряд аргументов и отображает дополнительный пункт в административном меню в виде «Dashboard», «Posts», «Media» и т. Д.

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

DGW
источник
Я просто пытаюсь добавить разделитель меню администратора. Перед публикацией вопроса я пытался использовать add_menu_page().
user1147
Похоже, MikeSchinkel хорошо тебя прикрыл. Извините за недоразумение. Удачи!
ДГВ
0

Ниже показано действие для 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'
);
}

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

MastaBaba
источник
Нет никакого различия в существующем, принятом ответе, кроме того, что вы не даете никаких объяснений. Пожалуйста, прочитайте, как ответить .
fuxia
@ toscho: Ну, это работает для меня, а принятый ответ - нет.
MastaBaba