व्यवस्थापक मेनू अनुभाग के आदेश को बदलना?


31

बिना किसी भाग्य के इस सरल कार्य को पूरा करने की कोशिश में कुछ घंटे बिताने के बाद मैं यहाँ पर थोड़ा निराश हो रहा हूँ।

अनिवार्य रूप से मेरे पास 5 कस्टम पोस्ट प्रकार हैं जो मैंने बनाए और जो मैं करना चाहता हूं, उनमें से प्रत्येक को सीधे "डैशबोर्ड" के तहत एक विशिष्ट क्रम में दिखाया गया है ।

वर्डप्रेस प्रलेखन से ऐसा लगता है कि आप वास्तव में ऐसा नहीं कर सकते क्योंकि उच्चतम मेनू क्रम "5" प्रतीत होता है। और एल से ऊपर है

मैं अनुमान लगा रहा हूं कि इसे पढ़ने वाले कुछ विशेषज्ञ मुझे सरल तरीके से दिखा सकते हैं कि मैं व्यवस्थापक मेनू को ठीक उसी तरह से ऑर्डर कर सकता हूं जिस तरह से मैं फ़ंक्शन फ़ाइल का उपयोग करके और एक प्लगइन का उपयोग किए बिना (जो मुझे पता है कि मौजूद है)।

कृपया आगे बढ़ें और 5 अलग-अलग पोस्ट प्रकार बनाने की कोशिश करें और उन्हें सीधे डैशबोर्ड के नीचे एक विशिष्ट क्रम में शामिल करें ... ऐसा लगता है कि यह संभव नहीं है। ?? ... क्या इस काम को करने के लिए किसी प्रकार का jquery हैक है कि कोई jQuery का उपयोग किए बिना मेरे साथ या अधिमानतः साझा कर सकता है?

जवाबों:


33

हाय @BinaryBit:

यह कोई आश्चर्य नहीं है कि आप थोड़े निराश हैं; व्यवस्थापक मेनू वर्डप्रेस कोर के माध्यम से सबसे अधिक obtuse और निराशाजनक कार्यान्वयन में से एक है। ईमानदारी से, मुझे नहीं पता कि वे क्या सोच रहे थे जब उन्होंने इसे इस तरह से डिजाइन किया था।

@ ईमन ने एक शानदार प्रदर्शन किया यह समझाने का काम कि कैसे व्यवस्थापक मेनू वर्डप्रेस में काम करता है (मुझे लगता है कि मैं 4 महीने के बारे में पढ़ सकता था ... :)

फिर भी, मैंने यह पता लगाने के बाद कि यह कैसे काम किया, मैं अभी भी बिना किसी नुकसान के साथ काम कर रहा था ताकि मैं अपना सिर सीधा रखने के लिए पर्याप्त समय दे सकूं जबकि मैंने साधारण चीजें करने की कोशिश की थी। तो इसीलिए मैंने एक मेनू एपीआई का निर्माण किया जो वर्डप्रेस व्यवस्थापक मेनू के साथ काम करने को सरल और सुव्यवस्थित करता है।

वे वर्डप्रेस की मौजूदा संरचनाओं के साथ 100% संगत हैं और अभी भी अल्फा में बहुत अधिक हैं क्योंकि मैं केवल इसका उपयोग कर रहा हूं। मुझे यकीन है कि उपयोग-मामले हैं जो वे अभी तक नहीं संभालते हैं। लेकिन मैं आपको और दूसरों को आज़माने के लिए यहाँ कोड पोस्ट करूँगा।

आप अपनी थीम की डायरेक्टरी में ड्रॉप करने के लिए फाइल को यहाँ डाउनलोड कर सकते हैं: wp-admin-menu-classes.php और इस प्रकार से पता चलता है कि आप अपनी थीम की functions.phpफ़ाइल में फ़ंक्शंस को कैसे कॉल कर सकते हैं :

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

क्या अधिक है, ये कार्य वर्डप्रेस 3.1 में शामिल करने के लिए भी (आधार के रूप में) विचाराधीन हैं, इसलिए यदि हम भाग्यशाली हैं तो ये मानक भी बन सकते हैं!


एपीआई के लिए बढ़िया इसके अतिरिक्त! मौजूदा ढांचे के साथ अपने पहले कस्टम मेनू अनुभाग को जोड़ने में मुझे महीनों का समय लगा (इसीलिए मैंने कोड का अधिक अध्ययन किया) ... लेकिन आपका एपीआई उपयोग करने के लिए अधिक सहज लगता है!
एमान

@ ईमन - धन्यवाद! यदि आप कोई सुझाव देना चाहते हैं या इसे बेहतर बनाने में सहयोग भी करना चाहते हैं, तो मुझे कुछ ऐसा स्थापित करना अच्छा लगेगा जो इस प्रश्नोत्तर को देखने वाले लोगों के अलावा सभी के लिए इसे आसान बना सके।
माइकस्किंकेल

क्या इसने कोर बनाया या यह या कुछ ऐसा ही है जो अभी भी व्यवस्थापक में मेनू आइटम के क्रम में हेरफेर करने के लिए आवश्यक है?
प्र। स्टूडियो

जहाँ तक मैंने पाया है, यह WP 3.5 तक
Pixeline

अरे माइक - wp_debug इस फ़ंक्शन पर एक त्रुटि फेंकता है: -------- फ़ंक्शन 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); $ अनुभाग लौटाएं; } --- नोटिस: अपरिभाषित चर: खंड
क्यू स्टूडियो

21

यहाँ वर्डप्रेस व्यवस्थापक मेनू कैसे बनाया जाता है, इसका एक त्वरित तरीका है - मैं बात नहीं कर रहा हूँ add_menu_page है, इसका एपीआई की , मेरा मतलब है कि वास्तविक डिफ़ॉल्ट वर्डप्रेस मेनू।

मेनू फ़ाइल को कॉल करना

मेनू, जाहिर है, द्वारा लोड किया गया है wp-admin/admin.php। लेकिन यह उस मानक एपीआई के माध्यम से लोड नहीं किया जाता है जिसका उपयोग हम वर्डप्रेस प्रलेखन के आधार पर करते हैं। बल्कि, पूरे मेनू (सभी संभावित विकल्प, सबमेनस, आदि) को एक साधारण सरणी के माध्यम से लोड किया जाता है जिसे परिभाषित किया गया है wp-admin/menu.php

तो मेनू प्रणाली लोड करने के लिए, admin.phpबस requireहै menu.phpवर्डप्रेस 3.0 में ... लाइन लगभग 99।

मेनू लोड हो रहा है

मेनू को वैश्विक सरणी में संग्रहीत किया गया है $menu। इन-लाइन प्रलेखन के अनुसार, मेनू सरणी में ये तत्व हैं:

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

उदाहरण के लिए, डैशबोर्ड है:

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

फ़ाइल प्रत्येक मेनू आइटम को सरणी में जाती है और लोड करती है और अपने सभी उप-मेनू आइटम को एक सरणी में लोड करती है, जिसे $submenuमूल मेनू के यूआरएल पर आधारित अनुक्रमित कहा जाता है। तो डैशबोर्ड का सबमेनू आइटम जिसे "डैशबोर्ड" कहा जाता है:

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

सिस्टम को सभी मेनू लोड करने के बाद किया जाता है (इसमें बहुत सारे नहीं हैं, लेकिन सिस्टम 5 या 10 तक समय पर सूचकांक के माध्यम से कदम उठाता है ... ध्यान दें कि डैशबोर्ड, भले ही यह पहला मेनू आइटम है, अभी भी अनुक्रमित है आइटम "2" (PHP arrays इंडेक्स 0 पर शुरू होता है ... तो यह आपको कुछ पैंतरेबाज़ी कमरा देता है)।

इस बिंदु पर, सिस्टम कॉल करता है wp-admin/includes/menu.php

मेनू के माध्यम से कदम

यह तीसरी फ़ाइल प्रत्येक मेनू आइटम के माध्यम से चलती है और, वर्तमान उपयोगकर्ता को सौंपे गए विशेषाधिकारों के आधार पर, या तो मेनू का उपयोग करती है या इसे हटा देती है। पहले यह सभी उप-मेनू के माध्यम से लूप करता है और उन पेजों को हटा देता है जिन्हें उपयोगकर्ता एक्सेस नहीं कर सकता है। फिर यह मूल पृष्ठों के माध्यम से लूप करता है और वही काम करता है। फिर यह किसी भी डुप्लिकेट विभाजक को हटा देता है जो समाप्त मेनू होने से रहता है।

अंत में, यह उनके नियत मेनू क्रम के आधार पर मेनू को क्रमबद्ध करता है।

कस्टम मेनू का आदेश देना

admin_menuमेनू को सेट करने के बाद हुक को कहा जाता है लेकिन कुछ भी ऑर्डर करने से पहले । इसलिए एपीआई को "हैकिंग" किए बिना पूरे वर्डप्रेस मेनू सिस्टम को ऑर्डर करना संभव है।

कार्रवाई admin_menuनिकाल दिए जाने के बाद , आपके कस्टम पृष्ठ सिस्टम में लोड हो जाते हैं। अगली चीज जो होती है, वह है वर्डप्रेस एक फिल्टर जिसे कहा जाता है custom_menu_order... यह फिल्टर हमेशा वापस आ जाता हैfalse और वर्डप्रेस को बताता है कि आप कस्टम ऑर्डर का उपयोग करना चाहते हैं या नहीं।

trueइसके बजाय ध्वज सेट करने के लिए अपने विषय में निम्नलिखित जोड़ें और अपने स्पष्ट मेनू क्रम को परिभाषित करें:

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

सभी मेनू के लिए इच्छित ऑर्डर निर्दिष्ट करें (मैंने मेनू-लोडिंग फ़ाइल में संदर्भों की आपूर्ति की ताकि आप फ़ाइल नाम की सूची प्राप्त कर सकें) और इसे इसका ध्यान रखना चाहिए।


EDIT (9/2/2010):

इस पद्धति का उपयोग करके कस्टम पोस्ट प्रकार के संपादन स्क्रीन के आदेश को निर्दिष्ट करने के लिए, आपको संपादन स्क्रीन के URL को जानना होगा। मैं ज्यादातर मामलों, यह होगा http://blog.url/wp-admin/edit.php?post_type=POST_TYPE। यह इस बात पर निर्भर करता है कि वर्डप्रेस आपकी साइट पर कैसे सेट किया गया है (यदि यह रूट या सबफ़ोल्डर में स्थापित है) और आपके द्वारा उपयोग किए जा रहे कस्टम पोस्ट प्रकार का स्लग।

उदाहरण के लिए...

मान लें कि आपके पास 'स्टैक एक्सचेंज प्रश्न' के लिए एक कस्टम पोस्ट प्रकार है और आप चाहते हैं कि संपादक उसी अनुभाग में दिखाई दे जो डैशबोर्ड आइकन के ठीक नीचे डैशबोर्ड पर है। आप अपनी थीम की functions.phpफ़ाइल में निम्न कोड का उपयोग करेंगे:

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

बाकी मेनू अप्रभावित रहेगा, लेकिन आपका कस्टम संपादन पृष्ठ डैशबोर्ड के समान अनुभाग में ले जाया जाएगा और इसके तुरंत बाद दिखाई देगा। आप अपने कस्टम पोस्ट प्रकारों को व्यवस्थापक मेनू के किसी भी भाग में ले जाने और उन्हें किसी भी क्रम में रखने के लिए इसका उपयोग कर सकते हैं। आप उसी तरह से मानक मेनू आइटम भी स्थानांतरित कर सकते हैं।

बस यह सुनिश्चित करें कि आप दिए गए अनुभाग में सभी मेनू आइटम का क्रम निर्दिष्ट करते हैं , अन्यथा आपका मेनू कुछ अनपेक्षित अजीबता के अधीन हो सकता है।


"ऑर्डरिंग कस्टम मेनू" शीर्षक के तहत आपके उदाहरण कोड में एक छोटी सी त्रुटि है, अगर सशर्त विवरण $चर नाम पर गायब है ... (शानदार जवाब हालांकि) ..
t31os

आप डैशबोर्ड अनुभाग के नीचे एक अनुभाग में "स्टैक एक्सचेंज प्रश्न" के लिए कस्टम पोस्ट प्रकार कैसे जोड़ेंगे ?
epaps

हाय एमान - त्वरित प्रश्न। चूंकि वर्डप्रेस के नवीनतम संस्करण में यह प्रक्रिया बिल्कुल बदल गई है या सरल हो गई है?
NetConstructor.com

सबमेनस के लिए कैसे ? क्या सबमेनू आइटम को पुनर्व्यवस्थित करने के लिए एक समान विधि है ?
गिरलाड़ी

@GiraldiMaggio कृपया एक नया प्रश्न पूछें और इसे संदर्भ दें।
एमान

18

मुझे लगता है कि यह एक पुराना धागा है, लेकिन मुझे लगता है कि यह बहुत आसान समाधान के साथ अद्यतन करने योग्य है। कृपया ध्यान दें कि यह 3.5 के साथ काम करता है और किसी अन्य संस्करण के साथ परीक्षण नहीं किया गया है। निम्न कोड एक प्लगइन या functions.php फ़ाइल में रखा जा सकता है।

देखें: http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order । मूल पोस्टर की आवश्यकताओं के अनुरूप थोड़ा संशोधित (हालांकि, मुझे उम्मीद है कि वह अब तक एक समाधान मिला ...)।

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

व्यवस्थापक मेनू में कोई आइटम जो यहां सूचीबद्ध नहीं हैं, उन्हें हटाया नहीं जाएगा। उन्हें मेनू के निचले भाग में जोड़ा जाएगा।


1
हां यह बहुत बेहतर है, सबमेनू आइटम को फिर से ऑर्डर करने के लिए जिन्हें आप परेशान कर सकते हैं और फिर उन्हें रीसेट कर सकते हैं।
व्याक

2

मैं समझता हूं कि आप एक प्लगइन का उपयोग नहीं करना चाहते हैं, लेकिन शुद्ध सादगी के लिए, Janis Elsts द्वारा व्यवस्थापक मेनू संपादक प्लगइन का प्रयास करें। किसी भी तरह से अपने व्यवस्थापक मेनू को फिर से व्यवस्थित करें; मेनू आइटम भी छिपा सकते हैं।


मैंने इस प्लगइन को मल्टीसाइट इंस्टॉलेशन में आज़माया है। यह सबसे अच्छा काम करता है। लेकिन अगर हमें मल्टीसाइट इंस्टॉलेशन है तो हमें हर उप-साइट के लिए विकल्पों को मैन्युअल रूप से कॉन्फ़िगर करना होगा।
user391

2

मेनू आइटम को इधर-उधर करने के लिए, मुझे ग्लोबल $menuवैरिएबल का उपयोग करना पसंद है ।

उदाहरण के लिए, यदि मैं "पेज" मेनू को मेनू के निचले भाग में ले जाना चाहता था, तो मैं इसे functions.phpया एक प्लगइन का उपयोग करूंगा :

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

और अगर मैं पोस्ट और लिंक मेनू स्वैप करना चाहता था:

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

थोड़ी देर इस ट्रिक का इस्तेमाल करते हुए, बस WP 3.4.1 के साथ परीक्षण किया गया


मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन आपके पहले स्निपेट के संबंध में मैं admin_menu_itemsफ़ंक्शन में अंतिम पंक्ति के साथ एक समस्या में भाग गया, जिसे इसे बदलकर तय किया गया थाunset($menu[20]);
hot_barbara

0

बहुत बढ़िया। बहुत बहुत धन्यवाद। मैंने कोड की कुछ पंक्तियाँ अपने कार्यों में लगा दी हैं

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
}

इसके अलावा मेरे विषय फ़ोल्डर में wp-admin-menu-classes.php रखने और अब 'पोस्ट' बटन 'पेज' बटन के साथ स्वाइप किया जाता है।

मुझे उम्मीद है कि यह जल्द ही कोर का हिस्सा बन जाएगा और एक तरह से ताकि हमें एक फ़ंक्शन के भीतर पूरे मेनू को केवल अपने बटन को फिर से लिखने की आवश्यकता न हो।

वास्तव में 4 बटनों के लिए अधिक निर्दिष्ट ऑर्डर प्राप्त करना थोड़ा मुश्किल था। 4 बटनों को बदलने के लिए: पेज, पोस्ट, मीडिया, लिंक जिन्हें मुझे फॉलिंग कोड का उपयोग करने की आवश्यकता है:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.