Dodać separator do menu administratora?


Odpowiedzi:


33

Oto szybki i brudny sposób na zdobycie tego, czego chcesz.

tło

WordPress przechowuje sekcje menu administratora w globalnej tablicy o nazwie $menu. Aby dodać separator, dodajesz element do $menutablicy za pomocą indeksu znajdującego się między indeksami opcji, które chcesz oddzielić.

Korzystanie z add_admin_menu_separator()funkcji

Napisałem więc funkcję do enkapsulacji logiki tego, co wywołałem add_admin_menu_separator(). Musisz wybrać numer indeksu tablicy, który jest wyższy niż opcja, po której chcesz dodać separator, a następnie wywołać funkcję add_admin_menu_separator()przekazującą ten indeks jako parametr.

Na przykład:

add_admin_menu_separator(37);

Sama add_admin_menu_separator()funkcja

Oto definicja funkcji, add_admin_menu_separator()którą można skopiować do functions.phppliku motywu . Tak, jest tajemny, ale tak samo jest z kodem, który tworzy i używa globalnej $menutablicy. (Na szczęście planujemy go wycofać, na szczęście, ale to prawdopodobnie potrwa kilka lat).

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

Znalezienie do indeksu $menu, że trzeba

Aby dowiedzieć się, co trzeba numer indeksu można zrobić var_dump()z $GLOBALS['menu']od wewnątrz admin_inithaka. Oto trochę kodu, który możesz functions.phptymczasowo upuścić do pliku motywu, aby zobaczyć, jakie są wartości. Będzie to działać tylko w przypadku żądania adresu URL rozpoczynającego się od /wp-admin/ (ale pamiętaj, aby zrobić z FTP, a nie z wbudowanym edytorem motywów, inaczej stracisz dostęp do swojej witryny, przynajmniej do momentu uzyskania dostępu FTP do functions.phppliku motywu !) :

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

Zobacz też:

BTW, te linki mogą być przydatne ogólnie do pracy z menu administracyjnymi:

Chociaż moje klasy menu administratora nie oferują obecnie łatwego sposobu dodawania separatorów, myślę, że dodam je teraz, kiedy będę miał czas.


Dzięki Mike, sprawdziłem całą noc studiując globalne menu var, ale nie udało mi się dodać separatora, teraz jest dla mnie o wiele bardziej zrozumiałe, jak menu działa w WP.
user1147,

Cześć @ user1147 : Tak, bardzo trudno je rozgryźć . Kiedy musiałem to po raz pierwszy, zajęło mi to sporo czasu i nadal z nimi walczę. Dlatego napisałem te funkcje, aby odtąd móc to robić w prosty sposób! Tak czy inaczej, cieszę się, że moja odpowiedź pomogła.
MikeSchinkel,

1
@MikeSchinkel Ta metoda nie działa dla mnie w Wordpress 3.3.1.
Jim Geurts

1
@JimGeurts - to też nie działa dla mnie: /
Evan Mattson

2
Właśnie go przetestowałem i działa w 4.5, ale WordPress postanowił pozbyć się linii, które po prostu już się nie pojawiają. Myślę, że rozwiązaniem jest dodanie CSS, ale przez całe moje życie nie mogę ustalić, co CSS dodać, ponieważ jestem backendowym deweloperem i jestem do bani CSS. Może ktoś inny może zasugerować?
MikeSchinkel,

4

To proste jak:

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

}

Uwaga: Domyślna pozycja separatora ( $menu[4]) może być różna w zależności od konfiguracji, którą wykonałeś (lub twoje wtyczki) przed tym hakiem.

Oczywiście możesz również dostosować introspekcję menu-top-firsti menu-top-lastklasy.


2

Niektóre problemy z brakiem dodawania separatorów wynikały ze sposobu, w jaki wordpress usuwa zduplikowane separatory. Dodanie ksort($menu);na dole funkcji rozwiązało problem.


1

Opiera się to na odpowiedzi MastaBaba, ale niczego nie zastępuje w określonej przez Ciebie pozycji - po prostu dodaje separator.

Używa także anonimowej funkcji, więc jest kompatybilna tylko z PHP w wersji 5.3 i wyższej.

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

Trochę trudno jest ustalić, co próbujesz zrobić, ale myślę, że chcesz dodać pozycję najwyższego poziomu w menu administracyjnym WordPress.

Zobacz tę dokumentację w Kodeksie WordPress.

Krótko mówiąc, szukasz użycia add_menu_page()funkcji, która pobiera wiele argumentów i wyświetla dodatkowy element w menu administracyjnym jako rodzeństwo „Dashboard”, „Posty”, „Media” itp.

Mam nadzieję, że dobrze to zrozumiałem. :-)


Właśnie próbuję dodać seprator menu administratora. Przed opublikowaniem pytania próbowałem użyć add_menu_page().
user1147,

Wygląda na to, że MikeSchinkel zapewnił ci dobrą ochronę. Przepraszam za nieporozumienie. Powodzenia!
dgw

0

Poniżej zamieszczono akcję do Wordpress, która jest uruchamiana po wyświetleniu menu administratora. Menu administratora to tablica i wszystko, co tutaj robisz, polega na dodaniu elementu tablicy, który definiuje separator, w określonej przez ciebie pozycji.

Od tutaj :

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

Zauważ, że chociaż to raczej przypomina obecnie akceptowaną odpowiedź, obecnie zaakceptowana odpowiedź nie działała dla mnie (i sądząc po komentarzach, dla kilku innych).


Nie ma żadnej różnicy w stosunku do istniejącej, zaakceptowanej odpowiedzi, z wyjątkiem tego, że nie udzielasz żadnych wyjaśnień. Proszę przeczytać Jak odpowiedzieć .
fuxia

@toscho: Cóż, to działa dla mnie, a zaakceptowana odpowiedź nie.
MastaBaba
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.