Yönetici Menüsü Bölümlerinin Sırasını Değiştirme


31

Bu oldukça basit görevi başarmak için birkaç saatimi hiç uğraşmadan geçirdikten sonra biraz sinirleniyorum.

Temelde, oluşturduğum 5 özel yazı tipim var ve tek yapmak istediğim her birini doğrudan "gösterge tablosu" altında belirli bir sırada göstermek .

WordPress belgelerine göre bu gerçekten yapamıyor gibi görünüyor, çünkü en yüksek menü sırası "5" gibi görünüyor. Ve L üstü

Bazı uzmanların bunu okuduğunu tahmin ediyorum, bana yönetici menüsünü işlevler dosyasını kullanarak ve (bir eklenti olduğunu biliyorum) bir eklenti kullanmadan istediğim gibi sipariş etmenin basit bir yolunu gösterebileceğimi tahmin ediyorum.

Lütfen devam edin ve 5 ayrı yazı tipi oluşturmaya çalışın ve bunları doğrudan gösterge panelinin altına belirli bir sıraya dahil edin ... bu mümkün değil gibi görünüyor.… ... bu işi yapmak için kesmek isteyen bir tür jquery hack var. Benimle veya tercihen jQuery kullanmadan paylaşabilir miyim?

Yanıtlar:


33

Merhaba @BinaryBit:

Biraz sinirli olmanız şaşırtıcı değil; Yönetici menüsü, WordPress çekirdeği yoluyla en geniş ve sinir bozucu uygulamalardan biridir. Açıkçası, bu şekilde tasarladıklarında ne düşündüklerini bilmiyorum.

@EAMann yaptığı bir, yönetici menülerinin WordPress'te nasıl çalıştığını açıklamak mükemmel bir iş çıkardı (Keşke bunu yaklaşık 4 ay önce okuyabilseydim ... :)

Yine de, nasıl işe yaradığını bulduktan sonra, basit şeyler yapmaya çalışırken başımı dik tutmak için yeterli zaman ayırmadan, onunla çalışmak için hala bir kayıpım oldu. Bu yüzden bir Menu API oluşturdum WordPress yönetici menüsü ile çalışmayı kolaylaştıran ve kolaylaştıran oluşturdum.

WordPress'in mevcut yapılarıyla% 100 uyumlular ve onu kullanan tek kişi olduğumdan beri hala çok alfa. Eminim henüz kullanmadıkları davaları vardır. Ama kodu siz ve başkalarının denemesi için buraya göndereceğim.

Sen edebilirsiniz indirmek buradan tema dizini düşmesi dosyayı: wp-admin-menü-classes.php ve ne Temanızın işlevleri çağırmak nasıl gösterileri takip functions.phpdosyası:

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

Dahası, bu işlevler WordPress 3.1'e dahil edilmek üzere (temel olarak) bile göz önünde bulundurulur , bu yüzden eğer şanslıysak bile bunlar standart hale gelebilir!


API'ye fantastik ekleme! İlk özel menü bölümümün mevcut çerçeveyle eklenmesi aylar sürdü (bu yüzden kod üzerinde çok çalıştım) ... ancak API'niz kullanımı çok daha sezgisel görünüyor!
EAMann

@EAMann - Teşekkürler! Herhangi bir öneride bulunmak veya onu geliştirmek için işbirliği yapmak istiyorsanız, bu soru-cevap bölümünü görenlerin dışında, herkes için kolaylaştıracak bir şey bulmayı çok isterim.
MikeSchinkel

Bu, çekirdeği mi yaptı, yoksa yönetici içindeki menü öğelerinin sırasını değiştirmek için hala gerekli olan bir şey mi?
Q Studio

Bulduğum kadarıyla, WP 3.5
pixeline

Hey Mike - wp_debug bu fonksiyona bir hata atar: -------- 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); $ bölümünü döndür; } --- Uyarı: Tanımsız değişken: bölüm
Q Studio

21

İşte WordPress yönetici menüsünün nasıl oluşturulduğuna dair hızlı bir adım - add_menu_pageAPI ile konuşmuyorum , gerçek varsayılan WordPress menüsünü kastediyorum.

Menü Dosyasını Arama

Menü, belli ki, tarafından yüklenir wp-admin/admin.php. Ancak, WordPress belgelerine dayanarak kullandığımız standart API üzerinden yüklenmedi. Aksine, tüm menü (tüm olası seçenekler, alt menüler, vb.) İçinde tanımlanmış basit bir dizi ile yüklenir wp-admin/menu.php.

Yani, menü sistemini yüklemek için admin.phpsadece requires menu.phpWordPress 3.0 satır 99 civarında ....

Menüyü Yükleme

Menünün kendisi global dizide saklanır $menu. Satır içi belgelere göre, menü dizisinde şu öğeler bulunur:

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

Pano, örneğin:

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

Dosya, her menü öğesini gözden geçirir ve diziye yükler ve tüm alt menü öğelerini $submenu, üst menünün URL'sini temel alan dizinleri adı verilen bir diziye yükler . Böylece, Dashboard'un "Dashboard" adlı alt menü maddesi şöyledir:

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

Sistem tüm menüleri yüklemeyi tamamladıktan sonra (o kadar fazla değil, ancak sistem dizini 5 veya 10 oranında değiştirir ... fark edersiniz ki, ilk menü maddesi olsa bile, Gösterge Tablosunun hala item "2" (PHP dizileri 0 dizininde başlar ... bu yüzden size biraz manevra odası sağlar).

Bu noktada, sistem çağrıları wp-admin/includes/menu.php .

Menüde Adım Atmak

Bu üçüncü dosya her bir menü maddesi boyunca ilerler ve mevcut kullanıcıya atanan ayrıcalıklara göre menüyü kullanır veya kaldırır. İlk önce tüm alt menüler arasında dolaşır ve kullanıcının erişemediği sayfaları kaldırır. Sonra üst sayfalarda dolaşır ve aynı şeyi yapar. Ardından, menüleri kaldırmaktan kalan yinelenen ayırıcıları kaldırır.

Son olarak, menüleri atanmış menü sırasına göre sıralar.

Özel menü siparişi verme

Kanca admin_menu, menüler ayarlandıktan sonra ancak bir şey sipariş edilmeden önce çağrılır . Böylece, tüm WordPress menü sistemini API'yi "hacklemeden" sipariş etmek mümkün.

Eylem başlatıldıktan sonra, admin_menuözel sayfalarınız sisteme yüklenir. Bir sonraki şey, WordPress, adında bir filtreyi kontrol ediyor custom_menu_order... Bu filtre her zaman döndürülürfalse ve WordPress'e özel bir sipariş kullanmak isteyip istemediğinizi söyler.

Bayrağı trueyerine koymak ve açık menü sırasını tanımlamak için temanıza aşağıdakileri ekleyin :

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

Tüm menüler için istediğiniz sırayı belirtin (menü yükleme dosyasına referanslar sağladım, böylece bir dosya adı listesi edinebilirsiniz) ve bu onunla ilgilenmelidir.


EDIT (21.02.2010):

Bu yöntemi kullanarak özel bir yazı türünün düzenleme ekranının sırasını belirlemek için, düzenleme ekranının URL adresini bilmeniz gerekir. Ben çoğu durumda, olacakhttp://blog.url/wp-admin/edit.php?post_type=POST_TYPE . Bu, WordPress’in sitenize (kök dizinine veya bir alt klasöre kurulmuşsa) nasıl kurulduğuna ve kullanmakta olduğunuz özel gönderi tipine bağlıdır.

Örneğin...

'Yığın Değişim Soruları için özel bir gönderi türünüz olduğunu ve editörün doğrudan gösterge panosu simgesinin altındaki gösterge panosu ile aynı bölümde görünmesini istediğinizi varsayalım. Temanın functions.phpdosyasında aşağıdaki kodu kullanırsın :

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

Menünün geri kalanı etkilenmeyecek, ancak özel düzenleme sayfanız gösterge tablosu ile aynı bölüme taşınacak ve hemen altında görünecektir. Bunu, özel yazı türlerinizi yönetici menüsünün herhangi bir bölümüne taşımak ve bunları herhangi bir sıraya koymak için kullanabilirsiniz. Standart menü öğelerini de aynı şekilde hareket ettirebilirsiniz.

Verilen bölümdeki tüm menü öğelerinin sırasını belirttiğinizden emin olun , aksi halde menünüz beklenmedik bir tuhaflığa maruz kalabilir.


Senin örneğin kodda küçük bir hata varsa koşullu deyimi eksik olduğunu, "Talimat özel menüler" başlığı altında var $.. değişken adı ... (Büyük cevabı rağmen) üzerinde
t31os

"Yığın Değişim Soruları" için özel gönderi türünü Gösterge Tablosu bölümünün altındaki bir bölüme nasıl eklersiniz ?
epap

Merhaba EAMann - hızlı bir soru. WordPress'in en yeni sürümü bu süreç hiç değişti mi, yoksa daha mı basitleşti?
NetConstructor.com 14:11

Alt menüler için nasıl ? Alt menü öğelerini yeniden düzenlemek için benzer bir yöntem var mı ?
Giraldi

@GiraldiMaggio Lütfen yeni bir soru sorun ve bu konuyu referans alın.
EAMann

18

Bunun eski bir konu olduğunun farkındayım, ancak çok daha kolay bir çözümle güncellenmeye değer olduğunu düşünüyorum. Bunun 3.5 ile çalıştığını ve başka bir sürümle test edilmediğini lütfen unutmayın. Aşağıdaki kod bir eklentiye ya da functions.php dosyasına yerleştirilebilir.

Bakınız: http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order . Orijinal posterin ihtiyaçlarına uyacak şekilde hafifçe değiştirildi (ancak, umarım şimdiye dek bir çözüm bulmuştur ...).

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

Burada listelenmeyen yönetici menüsünde bulunan öğeler kaldırılmaz. Menünün altına eklenecektir.


1
Evet, bu çok daha iyidir, ayrıca ayarlayabileceğiniz alt menü öğelerini yeniden sipariş etmek ve ardından bunları sıfırlamak için de iyidir.
Wyck

2

Bir eklenti kullanmak istemediğinizi anlıyorum, ancak tamamen basit olması için Janis Elsts'in Admin Menu Editor eklentisini deneyin. Yönetici menülerinizi istediğiniz şekilde yeniden düzenleyin; Menü öğelerini de gizleyebilirsiniz.


Çok eklentili kurulumda bu eklentiyi denedim. En iyi şekilde çalışır. Ancak, çok siteli kurulumumuz varsa, her alt site için seçenekleri manuel olarak yapılandırmamız gerekir.
kullanıcı391

2

Menü öğelerini hareket ettirmek için Global $menudeğişkenini kullanmayı seviyorum .

Örneğin, "Sayfalar" menüsünü menülerin altına taşımak istersem, bunu içinde functions.phpveya bir eklentide kullanırdım:

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

ve eğer Mesajlar ve Bağlantılar menülerini değiştirmek istersem:

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

Bu numarayı uzun süredir kullandı, sadece WP 3.4.1 ile test edildi.


Bunun daha eski bir mesaj olduğunu biliyorum, ancak ilk snippet'inizle ilgili olarak, admin_menu_itemsişlevdeki son satırla ilgili bir sorunla karşılaştımunset($menu[20]);
hot_barbara,

0

Muhteşem. Çok teşekkür ederim. Sadece kodlarımı fonksiyon dosyama koydum.

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
}

Artı, wp-admin-menu- classes.php dosyasını tema klasörüme yerleştirdi ve şimdi 'gönderiler' düğmesi 'sayfalar' düğmesiyle değiştirildi.

Umarım bu kısa sürede ve bir şekilde çekirdeğin bir parçası olur, böylece iki düğmeyi yeniden düzenlemek için tüm menüyü bir işlev içinde yazmamıza gerek kalmaz.

Aslında 4 düğme için daha belirli bir sipariş almak biraz zor oldu. 4 düğmeyi değiştirmek için: Sayfalar, Yayınla, Medya, Bağlantılar Aşağıdaki kodu kullanmam gerekiyordu:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.