Tambahkan Pemisah ke Menu Admin?

22

Adakah yang tahu cara menambahkan pemisah menu admin? Saya menemukan ini tetapi tidak membantu.

Ada ide?

pengguna1147
sumber
Jika ada yang masih mencari jawaban untuk ini, plugin ini dapat menangani pekerjaan.
user31760

Jawaban:

33

Ini cara cepat dan kotor untuk mendapatkan yang Anda inginkan.

Latar Belakang

WordPress menyimpan bagian menu admin dalam array global bernama $menu. Untuk menambahkan pemisah Anda menambahkan elemen ke $menuarray menggunakan indeks yang berada di antara indeks opsi yang ingin Anda pisahkan.

Menggunakan add_admin_menu_separator()fungsi

Jadi saya sudah menulis fungsi untuk merangkum logika untuk ini yang saya sebut add_admin_menu_separator(). Anda harus memilih nomor indeks array yang lebih tinggi dari opsi yang ingin Anda tambahkan pemisah, lalu panggil fungsi yang add_admin_menu_separator()menyampaikan indeks tersebut sebagai parameter Anda.

Sebagai contoh:

add_admin_menu_separator(37);

The add_admin_menu_separator()fungsi itu sendiri

Berikut definisi fungsi add_admin_menu_separator()yang dapat Anda salin ke functions.phpfile tema Anda . Ya itu misterius tapi kemudian kode yang membuat dan menggunakan $menuarray global . (Beruntung akhirnya rencana itu akan ditinggalkan, tapi itu mungkin beberapa tahun.)

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

Menemukan indeks ke dalam $menuyang Anda butuhkan

Untuk mengetahui nomor indeks apa yang Anda butuhkan, Anda dapat melakukan var_dump()dari $GLOBALS['menu']dari dalam sebuah admin_initkait. Berikut adalah sedikit kode yang dapat Anda masukkan ke functions.phpfile tema sementara untuk melihat nilainya. Ini hanya akan berfungsi ketika meminta URL dimulai dengan /wp-admin/ (tetapi pastikan untuk melakukannya dengan FTP dan bukan editor tema bawaan atau Anda akan kehilangan akses ke situs Anda, setidaknya sampai Anda mendapatkan akses FTP ke functions.phpfile tema Anda !) :

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

Lihat juga:

BTW, Anda mungkin menemukan tautan ini berguna secara umum untuk bekerja dengan menu admin:

Meskipun kelas menu admin saya saat ini tidak menawarkan cara mudah untuk menambahkan pemisah, saya pikir saya sekarang akan menambahkan itu ketika saya punya waktu.

MikeSchinkel
sumber
Terima kasih Mike, saya memeriksa semalaman mempelajari menu global var, tetapi saya tidak berhasil menambahkan pemisah, sekarang jauh lebih jelas bagi saya bagaimana menu bekerja di wp.
user1147
Hai @ pengguna1147 : Ya, mereka sangat sulit untuk dipecahkan . Ketika saya pertama kali melakukannya, saya butuh banyak waktu, dan saya masih bergumul dengan mereka. Karena itu mengapa saya menulis fungsi-fungsi itu, jadi saya bisa melakukannya dengan mudah mulai sekarang! Bagaimanapun, senang jawaban saya membantu.
MikeSchinkel
1
@MikeSchinkel Metode ini tidak berfungsi untuk saya dengan Wordpress 3.3.1.
Jim Geurts
1
@ Jimgeurts - itu tidak bekerja untuk saya juga: /
Evan Mattson
2
Saya baru saja mengujinya dan itu "bekerja" di 4,5, tetapi WordPress memutuskan untuk menyingkirkan garis apakah mereka tidak muncul lagi. Saya pikir solusinya jika menambahkan CSS tetapi untuk kehidupan saya, saya tidak bisa mencari tahu apa yang ditambahkan CSS karena saya adalah seorang backend dev dan payah di CSS. Mungkin orang lain bisa menyarankan?
MikeSchinkel
4

Sangat mudah:

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

}

Catatan: Posisi pemisah default ( $menu[4]) dapat berbeda tergantung dari konfigurasi yang Anda (atau plugin Anda) lakukan sebelum kail ini.

Tentu saja, Anda juga dapat men-tweak menu-top-firstdan menu-top-lastmengintrospeksi kelas.

vmassuchetto
sumber
2

Seandainya beberapa masalah dengan pemisah tidak ditambahkan, itu karena cara wordpress menghapus pemisah duplikat. Menambahkan ksort($menu);ke bagian bawah fungsi memperbaiki masalah.


sumber
1

Ini didasarkan pada jawaban MastaBaba, tetapi tidak menggantikan apa pun pada posisi yang Anda tentukan - hanya menambah pemisah sesudahnya.

Juga menggunakan fungsi anonim sehingga hanya kompatibel dengan PHP versi 5.3 dan di atasnya.

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
sumber
0

Agak sulit untuk menentukan apa yang Anda coba lakukan, tetapi saya pikir Anda ingin menambahkan entri tingkat atas di menu admin WordPress.

Lihat dokumentasi ini di WordPress Codex.

Singkatnya, Anda mencari penggunaan add_menu_page()fungsi, yang mengambil sejumlah argumen dan menampilkan item tambahan dalam menu administratif sebagai saudara dari "Dasbor", "Kiriman", "Media", dll.

Semoga saya benar. :-)

dgw
sumber
Saya hanya mencoba menambahkan seprator menu admin. Sebelum memposting pertanyaan saya coba gunakan add_menu_page().
user1147
Sepertinya MikeSchinkel membuat Anda cukup terlindungi. Maaf tentang kesalahpahaman. Semoga berhasil!
dgw
0

Di bawah ini iklan tindakan ke Wordpress yang dijalankan ketika menu admin diberikan. Menu admin adalah array dan semua yang Anda lakukan, di sini, adalah menambahkan elemen array yang mendefinisikan pemisah, di posisi yang Anda tentukan.

Dari sini :

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

Perhatikan bahwa, meskipun ini agak mirip dengan jawaban yang saat ini diterima, jawaban yang saat ini diterima tidak bekerja untuk saya (dan, menilai dari komentar, untuk beberapa orang lain).

MastaBaba
sumber
Tidak ada perbedaan dengan jawaban yang ada dan diterima, kecuali bahwa Anda tidak memberikan penjelasan apa pun. Silakan baca Cara Menjawab .
fuxia
@ tooscho: Ya, ini berfungsi untuk saya dan jawaban yang diterima tidak.
MastaBaba