Mengubah Urutan Bagian Menu Admin?

31

Saya agak frustrasi di sini setelah menghabiskan beberapa jam mencoba menyelesaikan tugas yang cukup sederhana ini tanpa keberuntungan.

Pada dasarnya saya memiliki 5 jenis posting kustom yang saya buat dan yang ingin saya lakukan adalah menunjukkan masing-masing dalam urutan tertentu langsung di bawah "dasbor" .

Dari dokumentasi WordPress, sepertinya Anda tidak bisa melakukan ini karena urutan menu tertinggi tampaknya "5". Dan di atas L

Saya kira beberapa ahli membaca ini dapat menunjukkan kepada saya cara sederhana saya dapat memesan menu admin persis seperti yang saya inginkan dengan menggunakan file fungsi dan tanpa menggunakan plugin (yang saya tahu ada).

Silakan dan coba buat 5 jenis posting terpisah dan sertakan dalam urutan tertentu langsung di bawah dashboard ... sepertinya ini tidak mungkin. ?? ... adakah beberapa jenis jquery hack untuk membuat pekerjaan ini dilakukan oleh seseorang dapat berbagi dengan saya atau lebih disukai tanpa menggunakan jQuery?

Binarybit
sumber

Jawaban:

33

Hai @BinaryBit:

Tidak heran Anda sedikit frustrasi; menu admin adalah salah satu implementasi yang paling tumpul dan membuat frustrasi melalui inti WordPress. Jujur, saya tidak tahu apa yang mereka pikirkan ketika mereka mendesainnya seperti itu.

@EAMann melakukan pekerjaan yang sangat baik untuk menjelaskan cara kerja menu admin di WordPress (saya berharap saya bisa membacanya sekitar 4 bulan yang lalu ... :)

Namun, setelah saya menemukan cara kerjanya, saya masih bingung untuk bekerja dengannya tanpa mencurahkan cukup waktu untuk menjaga pikiran saya tetap lurus sementara saya mencoba melakukan hal-hal sederhana. Jadi itu sebabnya saya membangun Menu API yang menyederhanakan dan merampingkan bekerja dengan menu admin WordPress.

Mereka 100% kompatibel dengan struktur WordPress yang ada dan masih sangat banyak dalam alpha karena saya adalah satu-satunya yang menggunakannya. Saya yakin ada kasus penggunaan yang belum mereka tangani. Tapi saya akan memposting kode di sini untuk Anda dan orang lain untuk mencoba.

Anda dapat mengunduh file untuk dijatuhkan di direktori tema Anda di sini: wp-admin-menu-class.php dan apa yang berikut ini menunjukkan bagaimana Anda dapat memanggil fungsi dalam functions.phpfile tema Anda :

<?php
require_once('wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
  swap_admin_menu_sections('Pages','Posts');              // Swap location of Posts Section with Pages Section
  rename_admin_menu_section('Media','Photos & Video');    // Rename Media Section to "Photos & Video"
  delete_admin_menu_section('Links');                     // Get rid of Links Section
  $movie_tags_item_array = get_admin_menu_item_array('Movies','Movie Tags');  // Save off the Movie Tags Menu
  update_admin_menu_section('Movies',array(               // Rename two Movie Menu Items and Delete the Movie Tags Item
    array('rename-item','item'=>'Movies','new_title'=>'List Movies'),
    array('rename-item','item'=>'Add New','new_title'=>'Add Movie'),
    array('delete-item','item'=>'Movie Tags'),
  ));
  copy_admin_menu_item('Movies',array('Actors','Add New')); // Copy the 'Add New' over from Actors
  renamed_admin_menu_item('Movies','Add New','Add Actor');  // Rename copied Actor 'Add New' to 'Add Actor
  add_admin_menu_item('Movies',array(                       // (Another way to get a 'Add Actor' Link to a section.)
    'title' => 'Alt Add Actor ',
    'slug' => 'post-new.php?post_type=actor',
  ), array(// Add Back the Movie Tags at the end.
    'where'=>'end'
  ));
  add_admin_menu_item('Movies',$movie_tags_item_array,array(// Add Back the Movie Tags at the end.
    'where'=>'end'
  ));
  delete_admin_menu_section('Actors');                      // Finally just get rid of the actors section
}

Terlebih lagi, fungsi-fungsi ini bahkan sedang dipertimbangkan (sebagai basis) untuk dimasukkan dalam WordPress 3.1 jadi jika kita beruntung ini bahkan mungkin menjadi standar!

MikeSchinkel
sumber
Tambahan fantastis untuk API! Butuh waktu berbulan-bulan untuk menambahkan bagian menu khusus pertama saya dengan kerangka kerja yang ada (itulah sebabnya saya mempelajari kode melakukan banyak) ... tetapi API Anda tampaknya jauh lebih intuitif untuk digunakan!
EAMann
@EAMann - Terima kasih! Jika Anda ingin menawarkan saran atau bahkan berkolaborasi untuk memperbaikinya, saya ingin membuat sesuatu yang mapan yang dapat membuatnya lebih mudah bagi semua orang kecuali hanya beberapa yang kebetulan melihat T&J ini.
MikeSchinkel
apakah ini membuat inti atau apakah ini atau yang serupa masih diperlukan untuk memanipulasi urutan item menu di admin?
Q Studio
Sejauh yang saya temukan, itu telah ditunda ke WP 3.5
pixeline
Hai Mike - wp_debug membuat kesalahan pada fungsi ini: -------- function swap_admin_menu_sections ($ from_section, $ to_section) {$ from_section = get_admin_menu_section ($ from_section); if ($ from_section) $ from_section-> swap_with ($ to_section); mengembalikan $ section; } --- Pemberitahuan: Variabel tidak terdefinisi: bagian
Q Studio
21

Berikut adalah langkah-langkah cepat tentang bagaimana menu admin WordPress dibangun - Saya tidak berbicara tentang add_menu_pageAPI, maksud saya menu WordPress default yang sebenarnya.

Memanggil File Menu

Menu, tentu saja, dimuat oleh wp-admin/admin.php. Tapi itu tidak dimuat melalui API standar yang biasa kita gunakan berdasarkan pada dokumentasi WordPress. Sebaliknya, seluruh menu (semua opsi yang memungkinkan, submenu, dll) dimuat melalui array sederhana yang didefinisikan dalam wp-admin/menu.php.

Jadi untuk memuat sistem menu, admin.phphanya requires menu.php... sekitar baris 99 di WordPress 3.0.

Memuat Menu

Menu itu sendiri disimpan dalam array global $menu. Menurut dokumentasi in-line, array menu memiliki elemen-elemen ini:

The elements in the array are:
    *     0: Menu item name
    *     1: Minimum level or capability required.
    *     2: The URL of the item's file
    *     3: Class
    *     4: ID
    *     5: Icon for top level menu

Dasbor, misalnya, adalah:

$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );

File melewati dan memuat setiap item menu ke dalam array dan memuat semua item sub-menu mereka ke dalam array yang disebut $submenuindeks yang didasarkan pada url menu induk. Jadi item submenu Dashboard yang disebut "Dashboard" adalah:

 $submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );

Setelah sistem selesai memuat semua menu (tidak ada banyak, tetapi sistem melangkah melalui indeks pada waktu 5 atau 10 ... perhatikan bahwa Dashboard, meskipun itu item menu pertama, masih diindeks sebagai item "2" (array PHP mulai dari indeks 0 ... jadi ini memberi Anda beberapa ruang manuver).

Pada titik ini, sistem memanggil wp-admin/includes/menu.php.

Melangkah melalui Menu

File ketiga ini berjalan melalui setiap item menu dan, berdasarkan hak istimewa yang ditetapkan untuk pengguna saat ini, baik menggunakan menu atau menghapusnya. Pertama, ia menggilir semua sub-menu dan menghapus halaman yang tidak dapat diakses pengguna. Kemudian ia mengulang-ulang halaman induk dan melakukan hal yang sama. Kemudian menghapus pemisah duplikat yang tersisa dari menghilangkan menu.

Akhirnya, ini mengurutkan menu berdasarkan urutan menu yang ditugaskan.

Memesan menu khusus

Pengait admin_menudipanggil setelah menu diatur tetapi sebelum apa pun dipesan. Jadi dimungkinkan untuk memesan seluruh sistem menu WordPress tanpa "meretas" API.

Setelah aksi admin_menudipecat, halaman khusus Anda dimuat ke dalam sistem. Hal berikutnya yang terjadi, adalah WordPress memeriksa filter bernama custom_menu_order... filter ini selalu dikembalikan falsedan memberi tahu WordPress apakah Anda ingin menggunakan pesanan khusus atau tidak.

Tambahkan yang berikut ke tema Anda untuk mengatur bendera truesebagai gantinya dan menentukan urutan menu eksplisit Anda:

function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array('index.php', 'edit.php', 'edit-comments.php');
}

add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');

Tentukan urutan yang Anda inginkan untuk semua menu (saya memberikan referensi ke file pemuatan menu sehingga Anda bisa mendapatkan daftar nama file) dan ini harus ditangani.


EDIT (9/2/2010):

Untuk menentukan urutan layar edit jenis kiriman khusus menggunakan metode ini, Anda perlu mengetahui URL layar edit. Saya kebanyakan kasus, itu akan menjadi http://blog.url/wp-admin/edit.php?post_type=POST_TYPE. Ini tergantung pada bagaimana WordPress diatur di situs Anda (jika itu dipasang di root atau dalam subfolder) dan siput dari jenis posting khusus yang Anda gunakan.

Sebagai contoh...

Katakanlah Anda memiliki jenis posting khusus untuk 'Pertanyaan Stack Exchange' dan Anda ingin editor muncul di bagian yang sama dengan dasbor langsung di bawah ikon dasbor. Anda akan menggunakan kode berikut dalam functions.phpfile tema Anda :

function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array('index.php', 'edit.php?post_type=stack_exchange_questions');
}

add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');

Sisa menu tidak akan terpengaruh, tetapi halaman edit khusus Anda akan dipindahkan ke bagian yang sama dengan dasbor dan akan muncul tepat di bawahnya. Anda dapat menggunakan ini untuk memindahkan jenis posting khusus Anda ke bagian admin menu mana saja dan menempatkannya dalam urutan apa pun. Anda juga dapat memindahkan item menu standar dengan cara yang sama.

Pastikan Anda menentukan urutan semua item menu di bagian yang diberikan , jika tidak, menu Anda mungkin akan mengalami keanehan yang tidak terduga.

EAMann
sumber
Ada kesalahan kecil dalam kode contoh Anda di bawah tajuk "Memesan menu khusus", pernyataan kondisional jika tidak ada $pada nama variabel ... (Jawaban yang bagus) ..
t31os
Bagaimana Anda menambahkan jenis posting khusus untuk "Pertanyaan Stack Exchange" ke bagian di bawah bagian Dashboard?
epaps
Hai EAMann - pertanyaan cepat. Karena versi terbaru dari wordpress, apakah proses ini berubah atau menjadi lebih sederhana?
NetConstructor.com
Bagaimana dengan submenu ? Apakah ada metode serupa untuk mengatur ulang item submenu ?
Giraldi
@GiraldiMaggio Silakan ajukan pertanyaan baru dan rujuk yang ini.
EAMann
18

Saya menyadari ini adalah utas lama, tetapi saya pikir ini layak diperbarui dengan solusi yang jauh lebih mudah. Harap dicatat bahwa ini berfungsi dengan 3.5 dan belum diuji dengan versi lain. Kode berikut dapat ditempatkan di plugin atau file functions.php.

Lihat: http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order . Dimodifikasi sedikit agar sesuai dengan kebutuhan poster asli (walaupun, saya harap dia menemukan solusi sekarang ...).

  // Rearrange the admin menu
  function custom_menu_order($menu_ord) {
    if (!$menu_ord) return true;
    return array(
      'index.php', // Dashboard
      'edit.php?post_type=custom_type_one', // Custom type one
      'edit.php?post_type=custom_type_two', // Custom type two
      'edit.php?post_type=custom_type_three', // Custom type three
      'edit.php?post_type=custom_type_four', // Custom type four
      'edit.php?post_type=custom_type_five', // Custom type five
      'separator1', // First separator
      'edit.php?post_type=page', // Pages
      'edit.php', // Posts
      'upload.php', // Media
      'link-manager.php', // Links
      'edit-comments.php', // Comments
      'separator2', // Second separator
      'themes.php', // Appearance
      'plugins.php', // Plugins
      'users.php', // Users
      'tools.php', // Tools
      'options-general.php', // Settings
      'separator-last', // Last separator
    );
  }

  add_filter('custom_menu_order', 'custom_menu_order'); // Activate custom_menu_order
  add_filter('menu_order', 'custom_menu_order');

Semua item dalam menu admin yang tidak terdaftar di sini tidak akan dihapus. Mereka akan ditambahkan ke bagian bawah menu.

Mat
sumber
1
Ya ini jauh lebih baik, juga untuk memesan ulang item submenu yang dapat Anda hapus dan kemudian reset.
Wyck
2

Saya mengerti Anda tidak ingin menggunakan plugin, tetapi untuk kesederhanaan murni, coba plugin Admin Menu Editor oleh Janis Elsts. Atur ulang menu admin Anda sesuka Anda; juga dapat menyembunyikan item menu.

Ray Gulick
sumber
Saya mencoba plugin ini dalam instalasi multisite. Ini berfungsi dengan baik. Tetapi kita perlu mengkonfigurasi opsi untuk setiap sub-situs secara manual jika kita memiliki Instalasi multisite.
user391
2

Untuk memindahkan item menu, saya suka menggunakan $menuvariabel Global .

Misalnya, jika saya ingin memindahkan menu "Halaman" ke bagian bawah menu, saya akan menggunakan ini di dalam functions.phpatau plugin:

function admin_menu_items() {
    global $menu;
    $menu[102]=$menu[20];//make menu 102 be the same as menu 20 (pages)
    $menu[20]=array();//make original pages menu disappear

}
add_action('admin_menu', 'admin_menu_items');

dan jika saya ingin menukar menu Posting dan Tautan:

function admin_menu_items() {
    global $menu;
    $storemenu = $menu[15];//save links menu into $storemenu
    $menu[15] = $menu[5];//make links menu = posts menu
    $menu[5] = $storemenu; //make menu 5/posts = $storemenu/links   
}
add_action('admin_menu', 'admin_menu_items');

Sudah menggunakan trik ini sebentar, baru saja diuji dengan WP 3.4.1

forlogos
sumber
Saya tahu ini adalah posting yang lebih lama tetapi sehubungan dengan cuplikan pertama Anda, saya mengalami masalah dengan baris terakhir pada admin_menu_itemsfungsi yang diperbaiki dengan menggantinya denganunset($menu[20]);
hot_barbara
0

Luar biasa. Terima kasih banyak. Saya hanya memasukkan beberapa baris kode ke functions.php saya

require_once('/extras/wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
  swap_admin_menu_sections('Pages','Posts'); // Swop location of Posts Section with Pages Section
}

Ditambah menempatkan wp-admin-menu-class.php di folder tema saya dan sekarang tombol 'posting' diganti dengan tombol 'halaman'.

Saya harap ini akan menjadi bagian dari inti segera dan dengan cara sehingga kita tidak perlu menulis seluruh menu dalam suatu fungsi untuk hanya memesan ulang dua tombol.

Sebenarnya agak sulit untuk mendapatkan pesanan yang lebih spesifik untuk 4 tombol. Untuk mengubah 4 tombol menjadi: Halaman, Posting, Media, Tautan Saya perlu menggunakan kode berikut:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
Sebastian
sumber