Додати роздільник у меню адміністратора?


22

Хтось знає, як додати роздільник меню адміністратора? Я знайшов це, але це не допомогло.

Будь-які ідеї?


Якщо хтось все ще шукає відповідь на це, цей плагін може впоратися із завданням.
користувач31760

Відповіді:


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;
  }
}

Дивись також:

BTW, ви можете знайти ці посилання взагалі корисними для роботи з меню адміністратора:

Незважаючи на те, що мої заняття в адміністративному меню зараз не пропонують простий спосіб додавання роздільників, я думаю, зараз додаю це, коли матиму час.


Дякую Майку, я перевіряв всю ніч, вивчаючи глобальне меню var, але мені не вдалося додати роздільник, тепер мені набагато зрозуміліше, як працюють меню в wp.
користувач1147

Привіт @ user1147 : Так, це дуже важко зрозуміти. Коли мені вперше довелося це зайняло у мене досить багато часу, і я все ще борюся з ними. Отже, чому я написав ці функції, так що я можу робити це найпростішим способом! У всякому разі, рада, що моя відповідь допомогла.
MikeSchinkel

1
@MikeSchinkel Цей метод не працює для Wordpress 3.3.1.
Джим Гюрц

1
@JimGeurts - це також не працює для мене: /
Evan Mattson

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класи.


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;
    }
});

0

Трохи важко визначити, що ви намагаєтеся зробити, але я думаю, що ви хочете додати запис верхнього рівня в меню адміністратора WordPress.

Дивіться цю документацію в кодексі WordPress.

Коротше кажучи, ви шукаєте використання add_menu_page()функції, яка приймає ряд аргументів і відображає додатковий пункт в адміністративному меню як братів "Інформаційна панель", "Повідомлення", "Медіа" тощо.

Сподіваюсь, я правильно це зробив. :-)


Я просто намагаюся додати сепаратор меню адміністратора. Перш ніж розміщувати питання, я намагався використати add_menu_page().
користувач1147

Схоже, MikeSchinkel вас дуже добре висвітлював. Вибачте за непорозуміння. Удачі!
dgw

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'
);
}

Зауважте, що, хоч це скоріше нагадує прийняту відповідь, наразі прийнята відповідь для мене не працює (і, судячи з коментарів, для кількох інших).


Немає різниці в існуючій прийнятій відповіді, за винятком того, що ви не даєте жодних пояснень. Прочитайте, як відповісти .
фуксія

@toscho: Ну, це для мене працює, і прийнята відповідь не відповідає.
MastaBaba
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.